按关系字段 (ACF) 为 Elementor 帖子自定义查询过滤器
Custom Query Filter for Elementor Posts by relationship field (ACF)
我有一个名为 'Artists' 的自定义 post 类型设置。每个单个艺术家都是一个页面(如果您愿意,可以是艺术家个人资料),具有通过高级自定义字段 (ACF) 的关系字段类型与该艺术家相关联的产品列表。我需要将产品显示在艺术家页面上的类别中。因此,在 Elementor 中,我需要指定一个 'Query Filter 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;
}
回答
你需要用到这个
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:
They (i.e. filters) provide a way for functions to modify data of other
functions.
这意味着过滤器函数(在本例中为 product_category_software
)接收随后修改的数据并 returns 返回:
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 );
的文档
我有一个名为 'Artists' 的自定义 post 类型设置。每个单个艺术家都是一个页面(如果您愿意,可以是艺术家个人资料),具有通过高级自定义字段 (ACF) 的关系字段类型与该艺术家相关联的产品列表。我需要将产品显示在艺术家页面上的类别中。因此,在 Elementor 中,我需要指定一个 'Query Filter 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;
}
回答
你需要用到这个
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:
They (i.e. filters) provide a way for functions to modify data of other functions.
这意味着过滤器函数(在本例中为 product_category_software
)接收随后修改的数据并 returns 返回:
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 );
的文档