Запрос пользователя WP получить всех авторов с фамилией, начинающейся с определенной буквы
Мне нужно запрограммировать страницу, на которую я передаю инициал через URL, и она покажет всех пользователей-авторов, чья фамилия начинается с этой буквы. Я хотел бы сделать это с помощью пользовательского запроса WP, чтобы я мог легко просматривать результаты
Прямо сейчас у меня есть это:
<?php $letter = $_GET['p'] ?>
<?php
$sql = "SELECT umfirst.meta_value AS first_name, umlast.meta_value AS last_name
FROM $wpdb->usermeta umfirst, $wpdb->usermeta umlast, $wpdb->users user
WHERE umlast.meta_key = 'last_name'
AND umfirst.meta_key = 'first_name'
AND umfirst.user_id = umlast.user_id
AND user.id = umfirst.user_id
AND umlast.meta_value LIKE '".$letter."%'";
$rows = $wpdb->get_results($sql);
foreach ($rows as $row) {
// Do stuff with the results
}
?>
Однако я бы предпочел использовать запрос WP, так как проще добавлять другие ограничения, но я не могу заставить его работать с запросом WP umlast.meta_value LIKE '".$letter."%'"
1 answers
Проблема в том, что вы не можете использовать значение для сравнения LIKE
, как вы уже упоминали. Сгенерированный SQL
будет выглядеть примерно так:
AND CAST(wp_usermeta.meta_value AS CHAR) LIKE '%B%'
Это означает, что запрос настроен на поиск каждого вхождения буквы B
в нашем случае. Конечно, это не то, что вы хотите, вам нужно что-то вроде этого:
AND CAST(wp_usermeta.meta_value AS CHAR) LIKE 'B%'
Так что поиск будет выполняться только , начиная с буквы B
.
Хорошая новость заключается в том, что вы все еще можете достичь того, что вам нужно, но с затратами, немного похожими на взлом. :)
В WP_User_Query
:
$args = array(
'meta_key' => 'last_name',
'meta_value' => 'B########', // The '########' sequence acts sort of like an unique identifier
'meta_compare' => 'LIKE',
);
$wt_user_query = new WP_User_Query( $args );
И в functions.php
мы подключаемся к фильтру get_meta_sql
и изменяем предложение WHERE
:
function wt_custom_meta_sql( $sql ) {
/*
Search for that funky so called unique identifier
that we used to initialize our `WP_User_Query' object
*/
$uid = '########';
preg_match( "/'(%[^']+{$uid}%)'/", $sql['where'], $matches );
if ( ! empty( $matches ) ) {
/*
We've found it and now we get rid of the
extra '%' character as well as our identifier
*/
$val = str_replace( "{$uid}%", "%", ltrim( $matches[1], '%' ) );
$sql['where'] = str_replace( $matches[0], "'{$val}'", $sql['where'] );
}
return $sql;
}
add_filter( 'get_meta_sql' , 'wt_custom_meta_sql', 40 );