กรองตามฟิลด์ที่กำหนดเองในประเภทโพสต์ที่กำหนดเองในหน้าผู้ดูแลระบบ


11

ฉันได้ใช้ฟิลด์ที่กำหนดเองขั้นสูงเพื่อสร้างฟิลด์ที่กำหนดเองสำหรับชื่อการแข่งขันคำตอบ ฯลฯ ฉันได้สร้างประเภทโพสต์ที่กำหนดเองสำหรับการแข่งขันตามที่แสดงในภาพและฉันใช้ Wordpress functions.php เพื่อสร้างคอลัมน์จากค่าฟิลด์ที่กำหนดเอง

ฉันกำลังพยายามรับ "ตัวกรองตาม" - กล่องแบบหล่นลงพร้อมการแข่งขันชื่อ / ป้ายกำกับต่าง ๆ ดังที่แสดงด้านล่าง แต่ฉันสามารถค้นหาวิธีการแก้ปัญหาโดยใช้ taxonomies ซึ่งฉันไม่ได้ใช้ถ้าเป็นไปได้เพราะฉันใช้ฟิลด์ที่กำหนดเองเท่านั้น อย่างอื่น.

เป็นไปได้หรือไม่ที่จะสร้างเมนูแบบเลื่อนลง "กรองตาม" ที่กำหนดเองโดยใช้ฟิลด์ที่กำหนดเองเท่านั้น?

Wordpress กรองโดย


คุณสามารถใช้ประโยชน์จากrestrict_manage_postsเบ็ดการกระทำเพื่อเพิ่มกล่องแบบเลื่อนลงเพิ่มเติม อย่าลืมว่าคุณต้องเพิ่มตรรกะบางอย่างสำหรับตัวกรองด้วยเนื่องจาก WP จะไม่รู้ว่าต้องทำอะไรกับตัวกรองนอกกรอบ (ซึ่งแตกต่างจากรายการแบบหล่นลงของ taxonomy ซึ่งสามารถจัดการได้โดยอัตโนมัติ)
David Gard

หากคุณต้องการคุณสามารถสร้างชื่อในลิงก์ภายในตารางรายการของคุณซึ่งหมายความว่าคุณสามารถกรองการแข่งขันได้โดยคลิกที่ชื่อแทนที่จะมีดรอปดาวน์
David Gard

คำตอบ:


12

และสำหรับการแสดงผลลัพธ์สำหรับตัวกรองให้ลองใช้รหัสนี้

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_key และ" ชื่อการแข่งขัน "เป็นชื่อแบบหล่นลงที่เลือก


ดีฉันรู้สึกขี้เกียจดังนั้นแนะนำให้เขาถามคำถามเพิ่มเติม)
เดวิดการ์ด

ดูเหมือนว่า 2 คำตอบเป็นคำตอบที่สมบูรณ์และควรจะรวมกัน
RCNeil

10

restrict_manage_postsการดำเนินการเรียกadd_extra_tablenav()ฟังก์ชั่นซึ่งเป็นวิธีการที่คุณเพิ่มเมนูแบบเลื่อนลงเพิ่มเติมในรายการตารางที่คุณต้องการ

ในตัวอย่างด้านล่างอันดับแรกเราตรวจสอบให้แน่ใจว่าประเภทการโพสต์นั้นถูกต้องจากนั้นเรารับค่า DB ทั้งหมดที่เก็บไว้กับcompetition_nameคีย์ในpostmetaตาราง (คุณต้องเปลี่ยนชื่อคีย์ตามต้องการ) แบบสอบถามนั้นค่อนข้างง่ายและมีการตรวจสอบเพื่อดูว่าการแข่งขันมีการเผยแพร่หรือไม่ใช้ค่าที่ไม่ซ้ำกัน (คุณไม่ต้องการให้มีการทำซ้ำในเมนูแบบเลื่อนลง) จากนั้นสั่งให้เรียงตามลำดับตัวอักษร

ต่อไปเราจะตรวจสอบผลลัพธ์ (ไม่มีจุดที่แสดงรายการแบบเลื่อนลงเพื่ออะไร) จากนั้นสร้างตัวเลือก (รวมถึงค่าเริ่มต้นเพื่อแสดงทั้งหมด) ในที่สุดหล่นลงคือการส่งออก

ตามที่ระบุไว้ในความคิดเห็นของฉันนี้ไม่สิ้นสุดของเรื่องแม้ว่า; คุณจะต้องใช้เหตุผลบางอย่างเพื่อบอกตารางรายการให้แสดงผลลัพธ์ที่คุณต้องการเฉพาะเมื่อตัวกรองเปิดใช้งาน แต่ฉันจะให้คุณดูที่แล้วเริ่มคำถามอื่นถ้าคุณต้องการความช่วยเหลือเพิ่มเติม คำแนะนำ - ดูไฟล์/wp-admin/includes/class-wp-posts-list-table.phpและมันเป็นพาเรนต์.../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>';

}

เมื่อใช้สิ่งนี้ฉันได้รับข้อผิดพลาดNotice: 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

ฉันยังได้รับข้อผิดพลาดเดียวกัน
Vasim Shaikh

0

หากวิธีนี้ใช้ไม่ได้กับทุกคนโซลูชันของฉันต้องเพิ่มคอลัมน์ที่ฉันพยายามกรองตามไปยังรายการคอลัมน์ที่เรียงลำดับได้สำหรับประเภทโพสต์ที่กำหนดเองของฉัน

// 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: เตรียมความพร้อม:

$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
  );
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.