Özel bir alan (arama işlevi) kullanarak gönderi listesini (WP kontrol paneli gönderi listesinde) filtreleme nasıl yapılır?


37

Çok yorulduğum gerçeğe rağmen, çok basit bir sorunun cevabını bulamadım:

Özel alan içeren bazı gönderilerim var (ör. Supplier_name). Mesajlarımı bu özel alana göre arayabilmek ve filtreleyebilmek istiyorum. Başka bir deyişle, yönetici yayınları listesinde, bir değer yazabileceğim (örneğin, "IBM") bir arama kutusuna ("Tedarikçi adı" olarak adlandırılır) sahip olmak istiyorum ve ardından, verecek bir arama düğmesini tıklayın. bana "supplier_name" adında özel bir alanı olan tüm gönderileri geri gönderirseniz, öyleyse, özel alanın değeri "IBM" olur.

Bunu nasıl yapabilirim ?

Yanıtlar:


44

Bunun için bir eklentiyi kodladım ve yayınlamak için hiç bulamadım:

görüntü tanımını buraya girin

Kullanımı:

Açılır menüde, tüm özel alanların bir listesi vardır, bu yüzden filtrelemek istediğiniz alanı seçin ve filtreyi tıklayın. Özel bir alanın belirli bir değerine filtre uygulamak istiyorsanız, o zaman alanın adını seçin, istediğiniz değeri girin ve filtreyi tıklayın.

<?php
/*
Plugin Name: Admin Filter BY Custom Fields
Plugin URI: http://en.bainternet.info
Description: Filter posts or pages in admin by custom fields (post meta)
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/



add_filter( 'parse_query', 'ba_admin_posts_filter' );
add_action( 'restrict_manage_posts', 'ba_admin_posts_filter_restrict_manage_posts' );

function ba_admin_posts_filter( $query )
{
    global $pagenow;
    if ( is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_NAME']) && $_GET['ADMIN_FILTER_FIELD_NAME'] != '') {
        $query->query_vars['meta_key'] = $_GET['ADMIN_FILTER_FIELD_NAME'];
    if (isset($_GET['ADMIN_FILTER_FIELD_VALUE']) && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '')
        $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
    }
}

function ba_admin_posts_filter_restrict_manage_posts()
{
    global $wpdb;
    $sql = 'SELECT DISTINCT meta_key FROM '.$wpdb->postmeta.' ORDER BY 1';
    $fields = $wpdb->get_results($sql, ARRAY_N);
?>
<select name="ADMIN_FILTER_FIELD_NAME">
<option value=""><?php _e('Filter By Custom Fields', 'baapf'); ?></option>
<?php
    $current = isset($_GET['ADMIN_FILTER_FIELD_NAME'])? $_GET['ADMIN_FILTER_FIELD_NAME']:'';
    $current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
    foreach ($fields as $field) {
        if (substr($field[0],0,1) != "_"){
        printf
            (
                '<option value="%s"%s>%s</option>',
                $field[0],
                $field[0] == $current? ' selected="selected"':'',
                $field[0]
            );
        }
    }
?>
</select> <?php _e('Value:', 'baapf'); ?><input type="TEXT" name="ADMIN_FILTER_FIELD_VALUE" value="<?php echo $current_v; ?>" />
<?php
}

7
Seçim kutunuz için neden yardımcı işlevi kullanmıyorsunuz? yani. yerine $field[0] == $current? ' selected="selected"':'', sahip selected( $field[0] == $current, true, false ),... :)
t31os

bu cevap artık işe yaramıyor.
Kir Mazur

WordPress'in en yeni sürümlerinde çalışmasını sağlamanın bir yolu var mı?
nakkeru
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.