按关系字段 (ACF) 的 Elementor 帖子的自定义查询过滤器
Posted
技术标签:
【中文标题】按关系字段 (ACF) 的 Elementor 帖子的自定义查询过滤器【英文标题】:Custom Query Filter for Elementor Posts by relationship field (ACF) 【发布时间】:2021-01-03 12:07:05 【问题描述】:我有一个名为“艺术家”的自定义帖子类型设置。每个单一艺术家都是一个页面(如果您愿意,可以是艺术家个人资料),具有通过高级自定义字段 (ACF) 的关系字段类型与该艺术家关联的产品列表。我需要将产品显示在艺术家页面上的类别中。所以在 Elementor 中,我需要指定一个“查询过滤器 ID”来简单地将产品分成类别。
到目前为止我已经尝试过什么
我试图通过自定义查询在列表中仅显示某个类别的产品,因为我需要生成查询 ID。
我一直在尝试很多不同的方法来做到这一点,但现在我不知所措。我拥有的最新代码在这里......我错过了什么?
/** Product category 'SOFTWARE' **/
add_filter( 'software_product', 'product_category_software' );
function product_category_software( $variable )
$query_args = array(
'post_type' => 'product',
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'software',
),
),
);
return $variable;
【问题讨论】:
【参考方案1】:回答
你需要使用这个
https://developers.elementor.com/custom-query-filter/#Using_the_Custom_Filter
arbitrary_name_query_id
- 您在 Elementor 字段中填写的 QUERY ID,
要放在functions.php
中的代码:
add_action( 'elementor/query/arbitrary_name_query_id', function( $query )
$meta_query = $query->get( 'meta_query' );
$meta_query[] = [
'key' => 'acf_key', // put ACF relationship field name
'value' => get_the_ID(),
'compare' => '=',
];
$query->set( 'meta_query', $meta_query );
);
关于给定的代码
首先,作为Wordpress Documentation on filters says:
它们(即过滤器)为函数提供了一种修改其他数据的方法 功能。
这意味着过滤器函数,在本例中为product_category_software
,接收随后修改的数据并将其返回:
add_filter( 'software_product', 'product_category_software' );
function product_category_software( $variable ) // receive $variable
/**
* Modify $variable here
*/
return $variable; // return modified $variable
在您的情况下,product_category_software
不会修改接收的内容,而是引入了新的数据和平$query_args
,这没有任何意义,因为它不会被返回。
其次,add_filter
函数的第一个参数应该是存在的过滤器名称,software_product
不是。
第三,产品类别分类的正确名称是product_cat
。
从某个类别获取产品
方法#1 使用pre_get_posts
修改主查询
function your_arbitrary_name( $query ) // receive
if ( ! is_admin() && is_post_type_archive( 'product' ) && $query->is_main_query() )
$tax_query = array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array('software'),
)
);
$query->set( 'meta_query', $tax_query ); // modify
return $query; // and return
add_action( 'pre_get_posts', 'your_arbitrary_name', 20 );
方法#2 使用wc_get_products
或WC_Product_Query
例如,在你的控制器甚至模板中使用:
$args = array(
'category' => array( 'software' ),
);
$products = wc_get_products( $args );
阅读有关wc_get_products and WC_Product_Query的文档
【讨论】:
非常感谢,但这并没有奏效......但我怀疑这是因为我一开始没有解释得太彻底。所以让我给你更多的细节。我有一个名为“艺术家”的自定义帖子类型设置。在此页面上(如果您愿意,艺术家个人资料)是通过高级自定义字段通过关系字段类型与该艺术家关联的产品列表。我需要将产品显示在艺术家页面上的类别中。所以在 Elementor 中,我需要指定一个“查询过滤器”来简单地将产品分成几类。非常感谢 确实,这与您上面描述的有点不同。如果我理解正确,您需要使用此 developers.elementor.com/custom-query-filter/…arbitrary_query_id - 您在字段中填写的查询 ID 和代码: add_action( 'elementor/query/arbitrary_query_id', function( $query ) $meta_query = $query->get ( 'meta_query' ); $meta_query[] = [ 'key' => 'acf_key', // 把 ACF 关系字段名 'value' => get_the_ID(), 'compare' => '=', ]; $query ->set('meta_query', $meta_query); ); 就是这样,它就像一个魅力。非常感谢:)以上是关于按关系字段 (ACF) 的 Elementor 帖子的自定义查询过滤器的主要内容,如果未能解决你的问题,请参考以下文章