如何使用自定义字段在 WooCommerce 单一产品页面上显示相关的自定义帖子类型?

问题描述 投票:0回答:1

有人请帮助我:)

所以,情况是这样的:我正在使用 WordPress,其中有一个我使用代码片段插件创建的查询。

使用的插件:

产品:WooCommerce

自定义字段和自定义帖子:安全自定义字段代码

代码片段:PHP 代码片段

这是我当前的代码:

function my_query_by_post_types1( $query ) {
    if ( is_product() && $query->is_main_query() ) {
        
        $term_names = wp_get_post_terms( get_the_ID(), 'product_cat', array( 'fields' => 'names' ) );

        if ( $term_names ) {
            $query->set( 'post_type', 'news' );
            $meta_query = array( 'relation' => 'OR' );

            foreach ( $term_names as $term_name ) {
                $meta_query[] = array(
                    'key'     => 'product_category', // The meta key for the custom field in "news"
                    'value'   => $term_name,         
                    'compare' => 'LIKE',             
                );
            }

            $query->set( 'meta_query', $meta_query );
        }
    }
}
add_action( 'elementor/query/product_related_news', 'my_query_by_post_types1' );

此查询旨在在单个产品页面上使用以显示“新闻”(自定义帖子类型)。 “新闻”帖子类型有一个自定义字段,它是一个名为product_category 的复选框字段。目标是在单个产品页面上显示与产品类别具有相同 product_category 的“新闻”帖子。

我创建的代码片段成功在单个产品页面上显示新闻部分。但是,它显示数据库中的所有新闻项目,而不是根据产品类别过滤它们。例如,尽管正在显示的产品属于“计算机”类别,并且新闻部分包含返回值为“计算机”的自定义字段,但过滤机制无法按预期运行。因此,所有新闻项目都会显示,无论其相关产品类别如何。

我尝试过几种方法:

  1. 使用分类法而不是自定义字段作为我创建的自定义帖子类型“新闻”的类别。
  2. 使用
    "fields => name"
    wp_get_post_terms
    生成的数组中检索名称。

自定义帖子字段

自定义字段设置

我尝试使用下面的代码进行调试,但没有找到与我创建的过滤器匹配的帖子。即使我添加了一篇新闻文章,其产品类别与我正在展示的产品完全相同。

function my_query_by_post_types1($query) {
   if (is_singular('product')) {
       // Get product categories
       $terms = get_the_terms(get_the_ID(), 'product_cat');
       
       if ($terms && !is_wp_error($terms)) {
           // Get all category names
           $category_names = array();
           foreach ($terms as $term) {
               $category_names[] = $term->name;
           }
           
           if (!empty($category_names)) {
               $query->set('post_type', 'news');
               $query->set('meta_query', array(
                   array(
                       'key'     => 'product_category',
                       'value'   => $category_names,
                       'compare' => 'IN'
                   )
               ));
               
               // Debug output for admins
               if (current_user_can('administrator')) {
                   echo '<div style="background: #f1f1f1; padding: 10px; margin: 10px;">';
                   echo 'Categories found: ' . implode(', ', $category_names) . '<br>';
                   // Debug the query object
                   echo 'Query object:<pre>';
                   print_r($query->query_vars); // Outputs query parameters
                   echo '</pre>';
                   
                   if ($query->have_posts()) {
                        while ($query->have_posts()) {
                            $query->the_post();
                            echo get_the_title() . '<br>';
                        }
                    } else {
                        echo 'No posts found!';
                    }
                   
                   echo '</div>';
               }
           }
       }
   }
}
add_action('elementor/query/product_related_news', 'my_query_by_post_types1');

调试输出

我创建的新闻帖子示例

php wordpress woocommerce elementor custom-wordpress-pages
1个回答
0
投票

因为您引用同一个meta_key的多个值,所以您可以使用“IN”比较值,并且可以将该meta_key的所有值放入一个数组中。

您不需要为此实现在 meta_query 数组中添加多个项目。

这是下面修改后的代码,来自您的示例:

function my_query_by_post_types1( $query ) {
  if ( is_product() && $query->is_main_query() ) {

    $term_names = wp_get_post_terms( get_the_ID(), 'product_cat', array( 'fields' => 'names' ) );

    if ( $term_names ) {
      $query->set( 'post_type', 'news' );

      $meta_query[] = array(
        'key'     => 'product_category', // The meta key for the custom field in "news"
        'value'   => $term_names, // Use the $term_names array here instead of looping through it   
        'compare' => 'LIKE',             
      );

      $query->set( 'meta_query', $meta_query );
    }
  }
}
add_action( 'elementor/query/product_related_news', 'my_query_by_post_types1' );
© www.soinside.com 2019 - 2024. All rights reserved.