업데이트 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보다 TOP 을 선호합니다 <select>
. 따라서 맨 위 드롭 다운에서 필터 옵션을 선택한 다음 맨 아래 드롭 다운에서 하나를 선택하면 필터는 맨 위에 있던 값만 사용합니다 (공백이 아닌 경우). 이 새로운 버전은 그 버그를 수정합니다.
업데이트 2018-02-14
이 문제는 WP 4.6.0 이후 패치되었습니다 및 변경 사항은 공식 문서에 설명되어 있습니다 . 아래 솔루션은 여전히 작동합니다.
문제의 원인 (WP <4.6.0)
문제는 restrict_manage_users
작업이 두 번 호출 되었다는 것입니다. 한 번은 사용자 테이블 위에, 한 번은 아래에 있습니다. 이는 두 개의 select
드롭 다운이 동일한 이름으로 생성됨을 의미합니다 . 때 Filter
버튼을 클릭하면, 어떤 값은 초이다 select
(즉,하기 표 하나가) 즉, 테이블 위에 한 첫 번째의 요소 값을 대체.
WP 소스로 뛰어 들기를 원한다면 restrict_manage_users
액션이 within WP_Users_List_Table::extra_tablenav($which)
에서 트리거 되는데,이 기능은 사용자 역할을 변경하기위한 기본 드롭 다운을 생성하는 기능입니다. 이 함수는 $which
변수가 select
위 또는 아래 양식을 작성하는지 여부를 알려주 는 변수 를 사용하여 두 드롭 다운에 다른 name
속성 을 제공 할 수 있습니다 . 불행히도 $which
변수는 restrict_manage_users
액션으로 전달되지 않으므로 사용자 정의 요소를 차별화하는 다른 방법을 찾아야 합니다.
@Linnea가 제안한 대로이 작업을 수행하는 한 가지 방법은 JavaScript를 추가하여 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에 대해 기쁘게 생각합니다. PHP 7 서버에서 WP를 실행하는 경우 null 통합 연산자를??
사용하는 더 짧고 더 섹시한 버전입니다 .
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' );
즐겨!