我想通过缩略图和标题显示每个产品下面的4-5篇文章。对于所有产品,我添加了一个自定义分类法,将所有这些产品按其自己的组术语进行分组。可以说是一个自定义标记。
现在,我想在每个产品下查询5篇文章,它们共享为自定义分类法组选择的相同术语。到目前为止,我已经创建了这个工具来按分类法和术语查询帖子:
function shortcode_imwz_custom_taxonomy_by_term() {
global $wp_query,$post;
// wp_get_object_terms( $post->ID, \'portfolio-skills\', array( \'fields\' => \'names\' ) );
// https://stackoverflow.com/a/14798097/460885
// $product_terms = wp_get_object_terms( $post->ID, \'product\' );
// For performance, functions like get_the_terms() (which the results of has been cached),
// should be used.
// get the terms Retrieve the terms of the taxonomy that are attached to the post.
// $term = get_term_by( \'slug\', get_query_var( \'term\' ), get_query_var( \'taxonomy\' ) );
// https://wordpress.stackexchange.com/a/21425/12260
$terms = get_the_terms( get_the_ID(), \'group\' );
$loop = new WP_Query( array(
\'posts_per_page\' => 5,
\'post_type\' => \'product\',
\'orderby\' => \'menu_order title\',
\'order\' => \'ASC\',
\'tax_query\' => array( array(
\'taxonomy\' => \'group\',
\'field\' => \'slug\',
\'terms\' => $terms
) )
) );
if( ! $loop->have_posts() ) {
return false;
}
while( $loop->have_posts() ) {
$loop->the_post();
// echo thumbnail
echo the_title();
}
wp_reset_postdata();
}
我根据这段代码添加了一个短代码
function register_grouped_products_shortcode() {
add_shortcode( \'grouped-products\', \'shortcode_imwz_custom_taxonomy_by_term\' );
}
add_action( \'init\', \'register_grouped_products_shortcode\' );
要使用WP查询的产品,并添加了一个选项。但我还没有看到任何加载的内容。我错过了什么?我发现有很多选项可以让术语过滤分类法上的帖子和输入的术语。。也许这是个问题?
最合适的回答,由SO网友:Sally CJ 整理而成
get_the_terms()
返回的数组WP_Term
对象,因此不能简单地将返回的数组传递给WP_Query
, 如果您想通过术语slug查询相关帖子,那么您可以使用wp_list_pluck()
只获取术语slug,尽管您也可以使用函数获取术语object的任何属性,如term_id
:
$slugs = [];
if ( $terms && ! is_wp_error( $terms ) ) {
$slugs = wp_list_pluck( $terms, \'slug\' );
}
然后在你的
tax_query
, 使用
\'terms\' => $slugs
, 除了设置
field
到
slug
(参见下面的示例)。
看见here 有关tax_query
\'s参数。
// Example 1: Query posts by term slugs.
\'tax_query\' => array( array(
\'taxonomy\' => \'group\',
\'field\' => \'slug\', // if this is \'slug\'
\'terms\' => $slugs // then this should be term slugs
) )
// Example 2: Query posts by term IDs.
\'tax_query\' => array( array(
\'taxonomy\' => \'group\',
\'field\' => \'term_id\', // if this is \'term_id\'
\'terms\' => $ids // then this should be term IDs
// assume $ids is wp_list_pluck( $terms, \'term_id\' )
) )
附加注释the_title()
已回显输出,因此无需echo
这个the_title()
. 如果要手动回显,可以使用get_the_title()
— echo get_the_title();
.
其次,短代码回调应始终返回输出。否则,输出将显示在错误的位置—通常,在呈现帖子内容之前。如果需要在短代码(回调)中回显某些内容,则需要在不调用回显函数或复杂HTML的情况下连接输出,可以使用输出缓冲;堆栈溢出对此有很多信息,但基本上在您的情况下,您可以执行以下操作:
// At the start of the function:
ob_start();
// Then just run your loop...
while( $loop->have_posts() ) {
$loop->the_post();
the_title();
...
}
wp_reset_postdata();
// And at the end of the function:
return ob_get_clean();
如果在确认所有查询参数正常后,查询没有给出预期的结果,则可以通过回显该查询的SQL命令来调试该查询—添加echo $loop->request;
在您的new WP_Query()
调用,然后查看SQL是否良好,您还可以复制SQL并在phpMyAdmin(或类似工具)上运行它,并检查SQL是否返回任何结果。如果要排除当前帖子,可以使用post__not_in
parameter:
new WP_Query( array(
\'post__not_in\' => array( get_the_ID() ), // you need to pass an array
...
) )