UPDATE 2018-06-28
जबकि नीचे दिया गया कोड अधिकतर ठीक काम करता है, यहां WP> = 4.6.0 (PHP 7 का उपयोग करके) कोड के लिए फिर से लिखना है:
function add_course_section_filter( $which ) {
// create sprintf templates for <select> and <option>s
$st = '<select name="course_section_%s" style="float:none;"><option value="">%s</option>%s</select>';
$ot = '<option value="%s" %s>Section %s</option>';
// determine which filter button was clicked, if any and set section
$button = key( array_filter( $_GET, function($v) { return __( 'Filter' ) === $v; } ) );
$section = $_GET[ 'course_section_' . $button ] ?? -1;
// generate <option> and <select> code
$options = implode( '', array_map( function($i) use ( $ot, $section ) {
return sprintf( $ot, $i, selected( $i, $section, false ), $i );
}, range( 1, 3 ) ));
$select = sprintf( $st, $which, __( 'Course Section...' ), $options );
// output <select> and submit button
echo $select;
submit_button(__( 'Filter' ), null, $which, false);
}
add_action('restrict_manage_users', 'add_course_section_filter');
function filter_users_by_course_section($query)
{
global $pagenow;
if (is_admin() && 'users.php' == $pagenow) {
$button = key( array_filter( $_GET, function($v) { return __( 'Filter' ) === $v; } ) );
if ($section = $_GET[ 'course_section_' . $button ]) {
$meta_query = [['key' => 'courses','value' => $section, 'compare' => 'LIKE']];
$query->set('meta_key', 'courses');
$query->set('meta_query', $meta_query);
}
}
}
add_filter('pre_get_users', 'filter_users_by_course_section');
मैंने @birgire और @cale_b से कई विचारों को शामिल किया, जो नीचे दिए गए समाधानों को भी पढ़ने लायक हैं। विशेष रूप से, मैं:
- उस
$which
चर का उपयोग किया जो इसमें जोड़ा गया थाv4.6.0
- अनुवाद योग्य तार का उपयोग करके i18n के लिए सबसे अच्छा अभ्यास किया, उदा
__( 'Filter' )
- के लिए आदान-प्रदान किया छोरों (अधिक फैशनेबल?)
array_map()
, array_filter()
औरrange()
sprintf()
मार्कअप टेम्प्लेट उत्पन्न करने के लिए उपयोग किया जाता है
- के बजाय वर्ग कोष्ठक सरणी संकेतन का उपयोग किया
array()
अंत में, मैंने अपने पहले के समाधानों में एक बग की खोज की। वे समाधान हमेशा <select>
BOTTOM पर शीर्ष का पक्ष लेते हैं <select>
। इसलिए यदि आपने शीर्ष ड्रॉपडाउन से फ़िल्टर विकल्प का चयन किया है, और उसके बाद नीचे ड्रॉपडाउन में से एक का चयन करें, तो फ़िल्टर अभी भी केवल उसी का उपयोग करेगा जो ऊपर था (यदि यह रिक्त नहीं है)। यह नया संस्करण उस बग को ठीक करता है।
UPDATE 2018-02-14
WP 4.6.0 के बाद से इस मुद्दे को पैच किया गया है और आधिकारिक डॉक्स में बदलावों को प्रलेखित किया गया है । नीचे समाधान अभी भी काम करता है, हालांकि।
समस्या का क्या कारण है (WP <4.6.0)
समस्या यह थी कि restrict_manage_users
कार्रवाई को दो बार कहा जाता है: एक बार उपयोगकर्ता तालिका प्राप्त करें, और एक बार इसे बंद कर दें। इसका मतलब है कि TWO select
ड्रॉपडाउन एक ही नाम से बनाए जाते हैं । जब Filter
बटन पर क्लिक किया जाता है, तो जो भी मूल्य दूसरे select
तत्व में होता है (यानी एक तालिका को कम करता है) पहले एक में मान को ओवरराइड करता है, अर्थात एक तालिका को हटाता है।
यदि आप WP स्रोत में गोता लगाना चाहते हैं, तो restrict_manage_users
कार्रवाई को भीतर से ट्रिगर किया जाता है WP_Users_List_Table::extra_tablenav($which)
, जो कि फ़ंक्शन है जो उपयोगकर्ता की भूमिका को बदलने के लिए देशी ड्रॉपडाउन बनाता है। उस फ़ंक्शन में $which
वैरिएबल की मदद होती है जो यह बताता है कि क्या यह select
फॉर्म के ऊपर या नीचे बना है, और यह दो ड्रॉपडाउन को अलग-अलग name
विशेषताओं को देने की अनुमति देता है । दुर्भाग्य से, $which
चर restrict_manage_users
कार्रवाई के लिए पारित नहीं होता है , इसलिए हमें अपने स्वयं के कस्टम तत्वों को अलग करने के लिए एक और तरीका आना चाहिए।
ऐसा करने का एक तरीका, जैसा कि @Leaea सुझाव देता है , Filter
क्लिक को पकड़ने और दो ड्रॉपडाउन के मूल्यों को सिंक करने के लिए कुछ जावास्क्रिप्ट जोड़ना होगा । मैंने एक PHP- एकमात्र समाधान चुना, जिसका मैं अब वर्णन करूंगा।
इसे कैसे जोड़ेंगे
आप HTML इनपुट को मूल्यों की सरणियों में बदलने की क्षमता का लाभ उठा सकते हैं, और फिर किसी भी अपरिभाषित मूल्यों से छुटकारा पाने के लिए सरणी को फ़िल्टर कर सकते हैं। यहाँ कोड है:
function add_course_section_filter() {
if ( isset( $_GET[ 'course_section' ]) ) {
$section = $_GET[ 'course_section' ];
$section = !empty( $section[ 0 ] ) ? $section[ 0 ] : $section[ 1 ];
} else {
$section = -1;
}
echo ' <select name="course_section[]" style="float:none;"><option value="">Course Section...</option>';
for ( $i = 1; $i <= 3; ++$i ) {
$selected = $i == $section ? ' selected="selected"' : '';
echo '<option value="' . $i . '"' . $selected . '>Section ' . $i . '</option>';
}
echo '</select>';
echo '<input type="submit" class="button" value="Filter">';
}
add_action( 'restrict_manage_users', 'add_course_section_filter' );
function filter_users_by_course_section( $query ) {
global $pagenow;
if ( is_admin() &&
'users.php' == $pagenow &&
isset( $_GET[ 'course_section' ] ) &&
is_array( $_GET[ 'course_section' ] )
) {
$section = $_GET[ 'course_section' ];
$section = !empty( $section[ 0 ] ) ? $section[ 0 ] : $section[ 1 ];
$meta_query = array(
array(
'key' => 'course_section',
'value' => $section
)
);
$query->set( 'meta_key', 'course_section' );
$query->set( 'meta_query', $meta_query );
}
}
add_filter( 'pre_get_users', 'filter_users_by_course_section' );
बोनस: PHP 7 रिफ्लेक्टर
जब से आप PHP 7 सर्वर पर WP चला रहे हैं, तो मैं PHP 7 के बारे में उत्साहित हूं, यहाँ एक छोटा, कामुक संस्करण है जो अशक्त सहकर्मी ऑपरेटर??
का उपयोग कर रहा है :
function add_course_section_filter() {
$section = $_GET[ 'course_section' ][ 0 ] ?? $_GET[ 'course_section' ][ 1 ] ?? -1;
echo ' <select name="course_section[]" style="float:none;"><option value="">Course Section...</option>';
for ( $i = 1; $i <= 3; ++$i ) {
$selected = $i == $section ? ' selected="selected"' : '';
echo '<option value="' . $i . '"' . $selected . '>Section ' . $i . '</option>';
}
echo '</select>';
echo '<input type="submit" class="button" value="Filter">';
}
add_action( 'restrict_manage_users', 'add_course_section_filter' );
function filter_users_by_course_section( $query ) {
global $pagenow;
if ( is_admin() && 'users.php' == $pagenow) {
$section = $_GET[ 'course_section' ][ 0 ] ?? $_GET[ 'course_section' ][ 1 ] ?? null;
if ( null !== $section ) {
$meta_query = array(
array(
'key' => 'course_section',
'value' => $section
)
);
$query->set( 'meta_key', 'course_section' );
$query->set( 'meta_query', $meta_query );
}
}
}
add_filter( 'pre_get_users', 'filter_users_by_course_section' );
का आनंद लें!