问题描述
我需要在 post_title
上用 LIKE
做一个 WP_Query
。
我从这个常规 WP_Query
开始:
$wp_query = new WP_Query(
array (
'post_type' => 'wp_exposants',
'posts_per_page' => '1',
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'ASC',
'paged' => $paged
)
);
但是我实际上想做的在 SQL 中看起来像这样:
$query = "
SELECT *
FROM $wpdb->posts
WHERE $wpdb->posts.post_title LIKE '$param2%'
AND $wpdb->posts.post_type = 'wp_exposants'
ORDER BY $wpdb->posts.post_title
";
$wpdb->get_results($query);
输出打印我正在研究的结果,但是我使用常规<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
来显示结果。而这不适用于 $wpdb->get_results()
。
我怎么能达到我在这里描述的内容?
最佳解决方案
我会用 WP_Query
上的过滤器来解决这个问题。一个检测额外的查询变量并将其用作标题的前缀。
add_filter( 'posts_where', 'wpse18703_posts_where', 10, 2 );
function wpse18703_posts_where( $where, &$wp_query )
{
global $wpdb;
if ( $wpse18703_title = $wp_query->get( 'wpse18703_title' ) ) {
$where .= ' AND ' . $wpdb->posts . '.post_title LIKE '' . esc_sql( $wpdb->esc_like( $wpse18703_title ) ) . '%'';
}
return $where;
}
这样,您仍然可以调用 WP_Query
,您只需将标题作为 wpse18703_title
参数传递 (或将其更改为更短的名称) 。
次佳解决方案
想要更新这个代码,你们为 4.0 以上的 wordpress 做了工作. esc_sql() 在 4.0 以后被弃用。
function title_filter($where, &$wp_query){
global $wpdb;
if($search_term = $wp_query->get( 'search_prod_title' )){
/*using the esc_like() in here instead of other esc_sql()*/
$search_term = $wpdb->esc_like($search_term);
$search_term = ' '%' . $search_term . '%'';
$where .= ' AND ' . $wpdb->posts . '.post_title LIKE '.$search_term;
}
return $where;
}
其余的东西是一样的。
另外我想指出你可以在 WP_Query 参数中使用 s 变量来传递搜索项,这也将搜索我相信的帖子标题。
喜欢这个:
$args = array(
'post_type' => 'post',
's' => $search_term,
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'ASC'
);
$wp_query = new WP_Query($args);
第三种解决方案
简化:
function title_filter( $where, &$wp_query )
{
global $wpdb;
if ( $search_term = $wp_query->get( 'search_prod_title' ) ) {
$where .= ' AND ' . $wpdb->posts . '.post_title LIKE '%' . esc_sql( like_escape( $search_term ) ) . '%'';
}
return $where;
}
$args = array(
'post_type' => 'product',
'posts_per_page' => $page_size,
'paged' => $page,
'search_prod_title' => $search_term,
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'ASC'
);
add_filter( 'posts_where', 'title_filter', 10, 2 );
$wp_query = new WP_Query($args);
remove_filter( 'posts_where', 'title_filter', 10, 2 );
return $wp_query;
第四种方案
在我之前的其他答案的基础上,为了提供灵活性,您想要搜索包含元字段中的单词或帖子标题的帖子,我通过参数”title_filter_relation.” 给出该选项在此实现中,我仅允许”OR” 或”AND” 输入默认为”AND.”
function title_filter($where, &$wp_query){
global $wpdb;
if($search_term = $wp_query->get( 'title_filter' )){
$search_term = $wpdb->esc_like($search_term); //instead of esc_sql()
$search_term = ' '%' . $search_term . '%'';
$title_filter_relation = (strtoupper($wp_query->get( 'title_filter_relation'))=='OR' ? 'OR' : 'AND');
$where .= ' '.$title_filter_relation.' ' . $wpdb->posts . '.post_title LIKE '.$search_term;
}
return $where;
}
以下是一个非常简单的帖子类型”faq” 的代码行为示例,其中问题是帖子标题本身:
add_filter('posts_where','title_filter',10,2);
$s1 = new WP_Query( array(
'post_type' => 'faq',
'posts_per_page' => -1,
'title_filter' => $q,
'title_filter_relation' => 'OR',
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'faq_answer',
'value' => $q,
'compare' => 'LIKE'
)
)
));
remove_filter('posts_where','title_filter',10,2);
PS 。这是我在 wordpress 堆栈交换中的第一篇文章。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。