将WP_QUERY与自定义SQL查询一起使用

时间:2020-04-14 作者:Saeesh Tendulkar

为了获取帖子,我有一个包含多个连接的查询,通过WP\\u查询使用起来非常复杂。

SELECT p.post_name, t.name as sname, t2.name as cname FROM wpw0_posts AS p 
INNER JOIN wpw0_term_relationships AS tr ON p.ID = tr.object_id 
INNER JOIN wpw0_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id && tt.taxonomy = \'storylines\' 
INNER JOIN wpw0_terms AS t ON t.term_id = tt.term_id 

INNER JOIN wpw0_term_relationships AS tr2 ON p.ID = tr2.object_id 
INNER JOIN wpw0_term_taxonomy AS tt2 ON tr2.term_taxonomy_id = tt2.term_taxonomy_id && tt2.taxonomy = \'company\' 
INNER JOIN wpw0_terms AS t2 ON t2.term_id = tt2.term_id 

WHERE p.post_status = \'publish\' AND p.post_type = \'post\' 
ORDER BY p.post_date DESC
因此,我使用$wpdb object和get\\u results()方法获取帖子,但原始模板有许多WP\\u查询方法,如get\\u the\\u post\\u thumbnail\\u url()、get\\u the\\u category()等。

因此,为了使用相同的模板,我想从

$wpdb->get_results($sql);

new WP_Query($args);
如何转换对象或转换查询?

1 个回复
SO网友:Howdy_McGee

您将无法将复杂的SQL查询直接转换为WP\\U查询。您可以做的是从SQL返回Post ID,并将这些ID传递到WP\\U查询参数中。请注意,这是非常低效的,可能会导致查询速度变慢post__in 速度不快。

您需要修改SQL以包含post ID:

SELECT p.ID, p.post_name, /*... etc... */
接下来我们要告诉你wpdb::get_results() 要返回数组以便解析出ID,请执行以下操作:

$results = $wpdb->get_results( $sql, ARRAY_A );
接下来我们要使用wp_list_pluck() 要获取结果的ID,请执行以下操作:

$post_ids = wp_list_pluck( $results, \'ID\' );
最后,我们可以将这些ID传递到posts__in WP\\U查询参数:

$query = new WP_Query( array(
    \'post_type\'     => \'post\',
    \'post_status\'   => \'publish\',
    \'post__in\'      => $post_ids,
) );
如果您还想获取术语,则需要获取术语slug或术语id。

您需要修改SQL以包含术语ID。由于您有多个分类法,因此需要对这些分类法使用不同的别名:

SELECT /* ... etc... */ t.term_id as storyline_term_id, t2.term_id as company_term_id
接下来我们要使用wpdb::get_results() 要返回一个数组,以便解析出术语ID,请执行以下操作:

$results = $wpdb->get_results( $sql, ARRAY_A );
接下来我们要使用wp_list_pluck() 要获取结果的术语ID,请执行以下操作:

$story_term_ids = wp_list_pluck( $results, \'storyline_term_id\' );
$company_term_ids = wp_list_pluck( $results, \'company_term_id\' );
最后,我们可以通过ID获取术语:

$story_terms = get_terms( array(
    \'taxonomy\'      => \'storylines\',
    \'object_ids\'    => $story_term_ids,
) );

相关推荐

WPDB SQL查询从类别中选择

我编写SQL查询以获取状态为“instock”的项目ID,但不知道如何添加以仅从指定的产品类别中进行选择。我的代码:$results = $wpdb->get_col( \" SELECT p.ID FROM {$wpdb->prefix}posts as p INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id WHERE p.post_type LIK