Запрос пользователя 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."%'"

Author: Juan Fuentes, 2015-08-14

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 );
 3
Author: webtoure, 2015-08-15 08:44:15