有人请帮助我:)
所以,情况是这样的:我正在使用 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 的“新闻”帖子。
我创建的代码片段成功在单个产品页面上显示新闻部分。但是,它显示数据库中的所有新闻项目,而不是根据产品类别过滤它们。例如,尽管正在显示的产品属于“计算机”类别,并且新闻部分包含返回值为“计算机”的自定义字段,但过滤机制无法按预期运行。因此,所有新闻项目都会显示,无论其相关产品类别如何。
我尝试过几种方法:
"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');
因为您引用同一个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' );