按关系字段 (ACF) 自定义 Elementor 帖子的查询过滤器

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

我有一个名为“艺术家”的自定义帖子类型设置。每个单个艺术家都是一个页面(如果您愿意,可以是艺术家个人资料),包含通过高级自定义字段 (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;
}
wordpress woocommerce advanced-custom-fields custom-post-type elementor
1个回答
3
投票

回答

你需要使用这个

https://developers.elementor.com/custom-query-filter/#Using_the_Custom_Filter

arbitrary_name_query_id
- 您在 Elementor 字段中填写的查询 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 关于过滤器的文档所说

它们(即过滤器)为函数提供了一种修改其他函数数据的方法 功能。

这意味着过滤器函数(在本例中为

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 和 WC_Product_Query

的文档
© www.soinside.com 2019 - 2024. All rights reserved.