按自定义分类选择的术语显示帖子

时间:2020-02-25 作者:rhand

我想通过缩略图和标题显示每个产品下面的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查询的产品,并添加了一个选项。但我还没有看到任何加载的内容。我错过了什么?我发现有很多选项可以让术语过滤分类法上的帖子和输入的术语。。也许这是个问题?

1 个回复
最合适的回答,由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, 除了设置fieldslug (参见下面的示例)。

看见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
        ...
    ) )
    
  • 相关推荐

    在unctions.php文件中获取每个帖子的帖子术语‘wp_get_POST_Terms’

    我使用了一个带有Ajax操作的表单来在提交时获取帖子信息。它很有魅力。然而,我使用了类别来将工作划分为不同的类别。其中之一就是品牌。在页面模板中,我使用的脚本有效,但在函数中使用时有效。php文件。它无法获得所需的结果。我认为这可能与何时触发对帖子的查询或如何设置add\\u操作有关。有人能帮我查一下ID为31的类别的名称吗?在函数中使用时。php。以下是我写的:if( $query->have_posts() ) : while( $query->have_posts() )