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