Mesajları özel alan değerlerine göre filtrelemek için mesajların yönetici listesine (özel tipte) filtre menüsü ekleyin


45

Bu cevap aradığım şeye çok yakın, ancak bunun yerine özel bir alan belirlemek ve mevcut değerlerinin bir seçim menüsünü görüntülemek istiyorum. Teşekkürler!


1
@ soulseekah şeyler denemeden önce yön sormak yasal değil mi?
frnhr

Yanıtlar:


73

Basit, ilk önce istediğiniz meta değerlerle açılan menüyü yaratın ve ardından süzgecin POST_TYPEgönderisini yakalayın, yalnızca yazı türünüzün META_KEYadını ve meta anahtarınızın adını değiştirin:

<?php
/*
Plugin Name: Admin Filter BY Custom Fields
Plugin URI: http://en.bainternet.info
Description: answer to http://wordpress.stackexchange.com/q/45436/2487
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/

add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );
/**
 * First create the dropdown
 * make sure to change POST_TYPE to the name of your custom post type
 * 
 * @author Ohad Raz
 * 
 * @return void
 */
function wpse45436_admin_posts_filter_restrict_manage_posts(){
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }

    //only add filter to post type you want
    if ('POST_TYPE' == $type){
        //change this to the list of values you want to show
        //in 'label' => 'value' format
        $values = array(
            'label' => 'value', 
            'label1' => 'value1',
            'label2' => 'value2',
        );
        ?>
        <select name="ADMIN_FILTER_FIELD_VALUE">
        <option value=""><?php _e('Filter By ', 'wose45436'); ?></option>
        <?php
            $current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
            foreach ($values as $label => $value) {
                printf
                    (
                        '<option value="%s"%s>%s</option>',
                        $value,
                        $value == $current_v? ' selected="selected"':'',
                        $label
                    );
                }
        ?>
        </select>
        <?php
    }
}


add_filter( 'parse_query', 'wpse45436_posts_filter' );
/**
 * if submitted filter by post meta
 * 
 * make sure to change META_KEY to the actual meta key
 * and POST_TYPE to the name of your custom post type
 * @author Ohad Raz
 * @param  (wp_query object) $query
 * 
 * @return Void
 */
function wpse45436_posts_filter( $query ){
    global $pagenow;
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'POST_TYPE' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_VALUE']) && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '') {
        $query->query_vars['meta_key'] = 'META_KEY';
        $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
    }
}

Mükemmel! Bunu custtom tipi yazı sayfamda göstermekte sorun yaşıyorum (type = contestentry). Functions.php kodumu kontrol eder misiniz lütfen? Bu mevcut bir eklentiden alınmış mı? pastebin.com/BJMua8nq
adam5280 13.03.2012

POST_TYPEBurada bunu değiştirmediniz, şunu deneyin: pastebin.com/tabUfh3Y
Bainternet 13.03.2006

Eserleri! @ Bainternet teşekkürler! $ Type = 'post'; hatta 65'in de değiştirilmesi gerekiyordu. Tekrar teşekkürler!
adam5280

:) Değiştirmeniz gerekmeyen tek kişi, varsayılan olarak var, ancak bu da sorun değil.
Bainternet

2
Bu cevap WordPress 4.9.5 ile ilgili bir işlem yapar! Çok güzel yaşlandı, teşekkür ederim!
Davey

1

İçinde başka bir sorgu kullanıyorsanız , deyimde parse_query'inize restrict_manage_postseklediğinizden emin olun && $query->is_main_query(), aksi takdirde parse_query filtresi bu ikinci sorguyu engeller.

if ( 'POST_TYPE' == $type
      && is_admin()
      && $pagenow=='edit.php'
      && isset($_GET['ADMIN_FILTER_FIELD_VALUE'])
      && $_GET['ADMIN_FILTER_FIELD_VALUE'] != ''
      && $query->is_main_query()
) {
      $query->query_vars['meta_key'] = 'META_KEY';
      $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
}

0

Çok fazla alan eklemek zorundaysanız, sorguya eklemek zorundasınız.

$query->query_vars['meta_query'][] = array(
    'key'     => 'KEY',
    'value'   => $_GET['FIELD'],
    'compare' => 'LIKE'
);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.