如前所述,您的问题与主题无关,因为它完全与SQL相关。
然而,以下两种解决方案将其转化为WP ese。
解决方案1
$args = array (
\'post_type\' => \'project\',
\'post_status\' => \'publish\',
\'s\' => \'testingsearch\',
\'meta_query\' => array (
\'relation\' => \'OR\',
\'project_date\' => array (
\'key\' => \'project_date\',
\'compare\' => \'EXISTS\',
),
array (
\'key\' => \'description\',
\'value\' => \'testingsearch\',
\'compare\' => \'LIKE\',
),
),
\'orderby\' => \'project_date\',
\'order\' => \'DESC\',
) ;
$p = new WP_Query ($args) ;
此解决方案利用
Query improvements in WP 4.2: ‘orderby’ and ‘meta_query’.
然而,它执行的查询比您的问题中的查询更加混乱。特别是,它搜索post_content
和post_excerpt
除了post_title
.
如果针对您的用例搜索这些附加字段是可以的,那么您就完成了。如果没有,请参阅解决方案2。
SQL Produced
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM
wp_posts INNER JOIN
wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) INNER JOIN
wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id )
WHERE 1=1 AND
((
(wp_posts.post_title LIKE \'%testingsearch%\') OR
(wp_posts.post_excerpt LIKE \'%testingsearch%\') OR
(wp_posts.post_content LIKE \'%testingsearch%\')
)) AND
(
wp_postmeta.meta_key = \'project_date\'
OR
( mt1.meta_key = \'description\' AND mt1.meta_value LIKE \'%testingsearch%\' )
) AND
wp_posts.post_type = \'project\' AND
((wp_posts.post_status = \'publish\'))
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value DESC
LIMIT 0, 10
溶液2
add_filter (\'posts_where\', \'wpse_posts_where\', 10, 2) ;
function
wpse_posts_where ($where, $query)
{
global $wpdb ;
if ($search = $query->get (\'_title_only\')) {
$search = \'%\' . $wpdb->esc_like ($search) . \'%\' ;
$where .= $wpdb->prepare (" AND {$wpdb->posts}.post_title LIKE \'%s\'", $search) ;
}
return ($where) ;
}
$args = array (
\'post_type\' => \'project\',
\'post_status\' => \'publish\',
// the "private" _title_only arg is "trapped" by the function above that is
// hooked into \'posts_where\' to limit the search to only post_title
\'_title_only\' => \'testingsearch\',
\'meta_query\' => array (
\'relation\' => \'OR\',
\'project_date\' => array (
\'key\' => \'project_date\',
\'compare\' => \'EXISTS\',
),
array (
\'key\' => \'description\',
\'value\' => \'testingsearch\',
\'compare\' => \'LIKE\',
),
),
\'orderby\' => \'project_date\',
\'order\' => \'DESC\',
) ;
$p = new WP_Query ($args) ;
就post\\u meta的排序而言,此解决方案与解决方案1的工作方式类似,但与
posts_where 将搜索限制为
post_title
.
注意使用wpdb::esc_like() 和wpdb::prepare() 在连接到的func中posts_where
防止SQL注入攻击。
SQL Produced
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM
wp_posts INNER JOIN
wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) INNER JOIN
wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id )
WHERE 1=1 AND
(
wp_postmeta.meta_key = \'project_date\'
OR
( mt1.meta_key = \'description\' AND mt1.meta_value LIKE \'%testingsearch%\' )
) AND
wp_posts.post_type = \'project\' AND
((wp_posts.post_status = \'publish\')) AND
wp_posts.post_title LIKE \'%testingsearch%\'
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value DESC
LIMIT 0, 10