如前所述,您的问题与主题无关,因为它完全与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