按关系字段 (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_productsWC_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 帖子的自定义查询过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Elementor 中的 ACF 组内容?

Wordpress ACF 显示关系问题

根据 ACF 关系字段显示“相关帖子”

ACF 关系字段的 WordPress 查询

每页 ACF 关系字段帖子

ACF 转发器按日期子字段排序