Отфильтруйте мои аргументы по почте 1-го письма

Я фильтрую свой WP_Query помощью этого скрипта:

 $args = array ( 'posts_per_page' => $posts_per_page, 'post_type' => $post_type, 'meta_key' => 'post_views_count', 'orderby' => 'meta_value_num', 'showposts' => 160, 'order' => 'DESC', 'paged' => $paged, 'tax_query' => array( array( 'taxonomy' => $term->taxonomy, 'field' => 'slug', 'terms' => $term->name))); 

И я хотел бы добавить фильтр SUBSTRING(post_title, 1,1) ='z' .
Возможно ли это реализовать?
Какова самая лучшая практика для того, чтобы писать только пост, который начинается с буквы X?

Solutions Collecting From Web of "Отфильтруйте мои аргументы по почте 1-го письма"

Чтобы ограничить букву X динамически, должно работать следующее. Это зависит от того, что WP_Query будет передавать сквозные параметры ad hoc . Это позволяет отправлять свои данные в фильтры. Я не знаю, является ли это преднамеренным поведением, поэтому предостерегайте emptor , но это очень полезное поведение.

Просто отправьте свое письмо по выбору с помощью параметра substring_where и разрешите работу фильтров. Есть две версии, одна из которых использует SUBSTRING как вы пытались сделать, и один с использованием LIKE . Я не знаю, что быстрее, хотя они кажутся очень близкими.

Я также использовал $wpdb->prepare но это может и не понадобиться. Это зависит от того, откуда поступают данные.

 $args = array ( 'post_type' => 'post', 'ignore_sticky_posts' => true, 'substring_where' => 't', ); function restrict_by_first_letter( $where, $qry ) { global $wpdb; $sub = $qry->get('substring_where'); if (!empty($sub)) { $where .= $wpdb->prepare( " AND SUBSTRING( {$wpdb->posts}.post_title, 1, 1 ) = %s ", $sub ); // $where .= $wpdb->prepare( // " AND {$wpdb->posts}.post_title LIKE %s ", // $sub.'%' // ); } return $where; } add_filter( 'posts_where' , 'restrict_by_first_letter', 1 , 2 ); $results = new WP_Query( $args ); var_dump($results->request); // debug var_dump(wp_list_pluck($results->posts,'post_title')); // debug конкретные $args = array ( 'post_type' => 'post', 'ignore_sticky_posts' => true, 'substring_where' => 't', ); function restrict_by_first_letter( $where, $qry ) { global $wpdb; $sub = $qry->get('substring_where'); if (!empty($sub)) { $where .= $wpdb->prepare( " AND SUBSTRING( {$wpdb->posts}.post_title, 1, 1 ) = %s ", $sub ); // $where .= $wpdb->prepare( // " AND {$wpdb->posts}.post_title LIKE %s ", // $sub.'%' // ); } return $where; } add_filter( 'posts_where' , 'restrict_by_first_letter', 1 , 2 ); $results = new WP_Query( $args ); var_dump($results->request); // debug var_dump(wp_list_pluck($results->posts,'post_title')); // debug 

Вы можете использовать фильтр posts_where для настройки части WHERE вашего запроса:

 add_filter( 'posts_where' , 'custom_posts_where' ); $results = new WP_Query( $args ); remove_filter( 'posts_where' , 'custom_posts_where' ); function custom_posts_where( $where ){ $where .= " AND SUBSTRING( post_title, 1, 1 ) ='z' "; return $where; }