আপডেট 2018-06-28
নীচের কোডটি বেশিরভাগ ক্ষেত্রে সূক্ষ্মভাবে কাজ করে, এখানে ডাব্লুপি> = 4.6.0 (পিএইচপি 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');
আমি @ বিবারগায়ার এবং @ ক্যাল_বি থেকে বেশ কয়েকটি ধারণাগুলি একত্রিত করেছি যারা নীচে এমন সমাধানও দেয় যা পড়ার মতো। বিশেষত, আমি:
$which
যোগ করা চলকটি ব্যবহার করুনv4.6.0
- অনুবাদযোগ্য স্ট্রিং ব্যবহার করে আই 18 এন এর জন্য সেরা অনুশীলন ব্যবহার করুন, যেমন
__( 'Filter' )
- জন্য বিনিময় লুপ (আরও ফ্যাশনেবল?)
array_map()
, array_filter()
এবংrange()
sprintf()
মার্কআপ টেমপ্লেট উত্পাদন করার জন্য ব্যবহৃত হয়
- এর পরিবর্তে বর্গাকার বন্ধনী অ্যারে সংকেত ব্যবহার করুন
array()
শেষ অবধি, আমি আমার আগের সমাধানগুলিতে একটি বাগ আবিষ্কার করেছি। সেই সমাধান সর্বদা শীর্ষে পক্ষপাতী <select>
থেকে BOTTOM উপর <select>
। সুতরাং আপনি যদি শীর্ষস্থানীয় ড্রপডাউন থেকে একটি ফিল্টার বিকল্প নির্বাচন করেন এবং তারপরে নীচের ড্রপডাউন থেকে একটি নির্বাচন করেন তবে ফিল্টারটি কেবলমাত্র যেটি মান শীর্ষে থাকবে তা ব্যবহার করবে (যদি এটি ফাঁকা না থাকে)। এই নতুন সংস্করণটি বাগটি সংশোধন করে।
আপডেট 2018-02-14
এই সমস্যাটি ডাব্লুপিপি 4.6.0 থেকে প্যাচ করা হয়েছে এবং পরিবর্তনগুলি সরকারী ডক্সে নথিভুক্ত করা হয়েছে । যদিও নীচের সমাধানটি এখনও কাজ করে।
সমস্যাটির কারণ কী হয়েছে (ডাব্লুপিপি <4.6.0)
সমস্যাটি ছিল যে restrict_manage_users
ক্রিয়াটি দু'বার কল হয়ে: একবার ব্যবহারকারীদের টেবিলের উপরে, এবং একবার এটি নীচে। এর অর্থ হ'ল একই নামে টিডব্লিউও select
ড্রপডাউনগুলি তৈরি হয় । যখন বাটনে ক্লিক না যাই হোক না কেন মান দ্বিতীয় হয় উপাদান (যেমন টেবিল নিচের) প্রথম এক মান অগ্রাহ্য, অর্থাত্ সারণীর উপরে এক।Filter
select
আপনি যদি ডাব্লুপি উত্সটিতে ডুবতে চান তবে restrict_manage_users
অ্যাকশনটি ভিতর থেকে শুরু হয় WP_Users_List_Table::extra_tablenav($which)
, এটি এমন একটি ফাংশন যা ব্যবহারকারীর ভূমিকা পরিবর্তন করতে নেটিভ ড্রপডাউন তৈরি করে। এই ফাংশনে $which
ভেরিয়েবলের সহায়তা রয়েছে যা select
এটি ফর্মের উপরের বা নীচে তৈরি করছে কিনা তা জানিয়ে দেয় এবং এটি দুটি ড্রপডাউনগুলিকে বিভিন্ন name
বৈশিষ্ট্য দেওয়ার অনুমতি দেয় । দুর্ভাগ্যক্রমে, $which
ভেরিয়েবলটি restrict_manage_users
অ্যাকশনটিতে পাস হয় না , সুতরাং আমাদের নিজস্ব কাস্টম উপাদানগুলিকে আলাদা করার জন্য আমাদের আরও একটি উপায় নিয়ে আসতে হবে।
@ লিনিয়ার পরামর্শ অনুসারে এটি করার একটি উপায় হ'ল ক্লিকটি ধরার জন্য কিছু জাভাস্ক্রিপ্ট যুক্ত করা Filter
এবং দুটি ড্রপডাউনের মানগুলি সিঙ্ক করতে হবে। আমি একটি পিএইচপি-কেবল সমাধানটি বেছে নিয়েছি যা আমি এখনই বর্ণনা করব।
কিভাবে এটা মেরামত করা যেতে পারে
এইচটিএমএল ইনপুটগুলিকে মানগুলির অ্যারে রূপান্তরিত করার সক্ষমতাটি আপনি নিতে পারেন এবং তারপরে যেকোন অপরিজ্ঞাত মান থেকে পরিত্রাণ পেতে অ্যারে ফিল্টার করতে পারেন। কোডটি এখানে:
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' );
বোনাস: পিএইচপি 7 রিফ্যাক্টর
যেহেতু আমি পিএইচপি 7 সম্পর্কে উত্তেজিত, আপনি যদি পিএইচপি 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' );
উপভোগ করুন!