व्यवस्थापक पृष्ठ पर कस्टम पोस्ट प्रकार में कस्टम फ़ील्ड द्वारा फ़िल्टर करें


11

मैंने प्रतियोगिता नाम, उत्तर आदि के लिए कस्टम फ़ील्ड बनाने के लिए उन्नत कस्टम फ़ील्ड का उपयोग किया है। मैंने प्रतियोगिताओं के लिए एक कस्टम पोस्ट प्रकार बनाया है जैसा कि छवि पर दिखाया गया है और मैंने अपने कस्टम फ़ील्ड मानों से कॉलम बनाने के लिए Wordpress फ़ंक्शन का उपयोग किया है।

मैं नीचे दिखाए गए जैसे प्रतियोगिताओं के विभिन्न नामों / लेबल के साथ "फ़िल्टर बाय" -डाउनडाउन बॉक्स प्राप्त करने की कोशिश कर रहा हूं, लेकिन मैं केवल टैक्सोनोमी का उपयोग करके समाधान पा सकता हूं, जिसका उपयोग मैं संभव नहीं करता हूं क्योंकि मैंने केवल कस्टम फ़ील्ड का उपयोग किया है बाकि सब कुछ।

क्या केवल कस्टम फ़ील्ड का उपयोग करके "ड्रॉप-इन" कस्टम बनाना संभव है?

द्वारा Wordpress फ़िल्टर


restrict_manage_postsअतिरिक्त ड्रॉपडाउन बॉक्स जोड़ने के लिए आप एक्शन हुक का उपयोग कर सकते हैं । यह मत भूलो कि आपको फ़िल्टर के लिए कुछ तर्क भी जोड़ने होंगे, क्योंकि WP को यह पता नहीं होगा कि इसका बॉक्स से क्या लेना देना है (टैक्सोनॉमी ड्रॉपडाउन सूचियों के विपरीत, जिसे यह स्वचालित रूप से संभाल सकता है)।
डेविड गार्ड

अतिरिक्त विचार के रूप में - यदि आप चाहें, तो आप अपनी सूची तालिका में लिंक करने के लिए नाम बना सकते हैं , जिसका अर्थ है कि आप ड्रॉपडाउन होने के बजाय नाम पर क्लिक करके एक प्रतियोगिता फ़िल्टर कर सकते हैं।
डेविड गार्ड

जवाबों:


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'] = '=';
  }
}

आवश्यकतानुसार मेटा कुंजी और मेटा मान बदलें। मैंने "प्रतियोगिता का नाम मेटा_की और" प्रतियोगिता-नाम "का चयन ड्रॉप डाउन नाम के रूप में किया है।


अच्छा, मुझे बहुत आलस महसूस हो रहा था इसलिए उन्होंने एक अतिरिक्त प्रश्न पूछने का सुझाव दिया;)
डेविड गार्ड

लगता है जैसे 2 उत्तर एक पूर्ण उत्तर हैं और संयुक्त होना चाहिए।
RCNeil

10

Restrict_manage_posts कार्रवाई से चलाता add_extra_tablenav()समारोह, जिसके कारण आप अपने वांछित सूची तालिका करने के लिए अतिरिक्त ड्रॉपडाउन जोड़ें।

नीचे दिए गए उदाहरण में, हम पहले यह सुनिश्चित करते हैं कि पोस्ट प्रकार सही है, और फिर हम तालिका competition_nameमें कुंजी के खिलाफ संग्रहीत सभी DB मानों को पकड़ लेते हैं 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

मुझे भी वही त्रुटि मिल रही है
वसीम शेख

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
  );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.