Yönetici sayfasındaki özel gönderi türünde özel alana göre filtrele


11

Rekabet adı, cevaplar vb. İçin özel alanlar oluşturmak için Gelişmiş Özel Alanlar kullandım. Resimde gösterildiği gibi yarışmalar için özel bir yazı türü yaptım ve özel alan değerlerimden sütunlar oluşturmak için Wordpress function.php kullandım.

Aşağıda gösterildiği gibi yarışmalarda farklı adlar / etiketlerle bir "Filtreleme ölçütü" kutusu açmaya çalışıyorum, ancak yalnızca mümkünse kullanamadığım taksonomileri kullanarak çözümler bulabilirim çünkü yalnızca diğer her Şey.

Yalnızca özel alanları kullanarak özel bir "Filtreleme ölçütü" açılır listesi oluşturmak mümkün müdür?

Wordpress filtreleme ölçütü


restrict_manage_postsEk açılır kutular eklemek için işlem kancasını kullanabilirsiniz. Yine de filtre için bir mantık eklemeniz gerektiğini unutmayın, çünkü WP kutunun dışında ne yapacağını bilemeyecektir (otomatik olarak işleyebileceği taksonomi açılır listelerinin aksine).
David Gard

Ek düşünce olarak - isterseniz, Liste Tablonuzda bağlantı oluşturmak için Adı girebilirsiniz , yani bir Müsabakaya açılır listeden ziyade, adı tıklatarak filtre uygulayabilirsiniz.
David Gard

Yanıtlar:


12

Filtre sonucunu görüntülemek için bu kodu deneyin

add_filter( 'parse_query', 'prefix_parse_filter' );
function  prefix_parse_filter($query) {
   global $pagenow;
   $current_page = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';

   if ( is_admin() && 
     'competition' == $current_page &&
     'edit.php' == $pagenow && 
      isset( $_GET['competition-name'] ) && 
      $_GET['competition-name'] != '') {

    $competion_name = $_GET['competition-name'];
    $query->query_vars['meta_key'] = 'competition_name';
    $query->query_vars['meta_value'] = $competition_name;
    $query->query_vars['meta_compare'] = '=';
  }
}

Meta anahtarı ve meta değerini gerektiği gibi değiştirin. Meta_key olarak rekabet adını ve select açılır adı olarak "rekabet adını" aldım.


Güzel, tembel hissediyordum, bu yüzden bir ek soru sormasını önerdi;)
David Gard

2 cevap tam bir cevap gibi görünüyor ve birleştirilmesi gerekir.
RCNeil

10

restrict_manage_posts eylem tetikler add_extra_tablenav()İstediğiniz Liste Tablo için ek açılır eklemek nasıl olduğu, işlevi.

Aşağıdaki örnekte, önce Yazı Türünün doğru olduğundan emin olduktan sonra tablodaki competition_nameanahtar karşısında depolanan tüm DB değerlerini alıyoruz postmeta(anahtar adını gerektiği gibi değiştirmeniz gerekir). Sorgu oldukça basittir ve yalnızca Rekabetin yayınlanıp yayınlanmadığını , yalnızca benzersiz değerleri alır (açılır menüde çoğaltma istemezsiniz) ve ardından bunları alfabetik olarak sıralar.

Sonra sonuçları kontrol ediyoruz (hiçbir şey için açılır liste çıktısı yok) ve sonra seçenekleri yapılandırıyoruz (tümünü gösterecek bir defualt dahil). Son olarak açılır liste çıktı.

Yorumumda belirtildiği gibi, bu hikayenin sonu değil; Liste Tablosuna yalnızca filtre etkinken istediğiniz sonuçları göstermesini bildirmek için bir mantığa ihtiyacınız olacak, ancak buna bir göz atmanız için sizi bırakacağım ve daha fazla yardıma ihtiyacınız olursa başka bir soruya başlayacağım. İpucu - dosyayı kontrol edin, /wp-admin/includes/class-wp-posts-list-table.phpüst dosya.../wp-class-list-table.php

/**
 * Add extra dropdowns to the List Tables
 *
 * @param required string $post_type    The Post Type that is being displayed
 */
add_action('restrict_manage_posts', 'add_extra_tablenav');
function add_extra_tablenav($post_type){

    global $wpdb;

    /** Ensure this is the correct Post Type*/
    if($post_type !== 'competition')
        return;

    /** Grab the results from the DB */
    $query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type
    );
    $results = $wpdb->get_col($query);

    /** Ensure there are options to show */
    if(empty($results))
        return;

    // get selected option if there is one selected
    if (isset( $_GET['competition-name'] ) && $_GET['competition-name'] != '') {
        $selectedName = $_GET['competition-name'];
    } else {
        $selectedName = -1;
    }

    /** Grab all of the options that should be shown */
    $options[] = sprintf('<option value="-1">%1$s</option>', __('All Competitions', 'your-text-domain'));
    foreach($results as $result) :
        if ($result == $selectedName) {
            $options[] = sprintf('<option value="%1$s" selected>%2$s</option>', esc_attr($result), $result);
        } else {
            $options[] = sprintf('<option value="%1$s">%2$s</option>', esc_attr($result), $result);
        }
    endforeach;

    /** Output the dropdown menu */
    echo '<select class="" id="competition-name" name="competition-name">';
    echo join("\n", $options);
    echo '</select>';

}

Bunu kullanırken, hatayı alıyorumNotice: wpdb::prepare was called incorrectly. The query does not contain the correct number of placeholders (6) for the number of arguments passed (5). Please see Debugging in WordPress for more information. (This message was added in version 4.8.3.) in /[...]/wp-includes/functions.php on line 4773
rassoh

Ben de aynı hatayı alıyorum
Vasim Shaikh

0

Bu herkes için işe yaramazsa, çözümümün filtrelemeye çalıştığım Sütunu özel posta türüm için Sıralanabilir sütunlar listesine eklemesi gerekiyordu.

// Make Custom Post Type Custom Columns Sortable
function cpt_custom_columns_sortable( $columns ) {

    // Add our columns to $columns array
    $columns['item_number'] = 'item_number';
    $columns['coat_school'] = 'coat_school'; 

    return $columns;
} add_filter( 'manage_edit-your-custom-post-type-slug_sortable_columns', 'cpt_custom_columns_sortable' );

0

Wpdb: prepar hatasını düzeltmek için aşağıdaki sorguyu değiştirin:

$query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type,
        'competition_name' //this is needed a second time to define "%3$s" in ORDER BY
  );
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.