WooCommerce:Pre_Get_Posts中的复杂查询

时间:2021-11-03 作者:jens_vdp

我想在获取产品时添加一个复杂的过滤。

我有一些产品,其中一些链接到自定义帖子类型

  • 根据cookie的不同,我应该只获取在此转发器字段中具有该值的产品,我知道我可以使用:

    add_filter( \'pre_get_posts\', \'fwp_archive_per_page\' );
    
    我知道我可以像这样设置额外的元查询:

    $query->set( \'meta_query\', array(
        \'relation\'    => \'AND\',
            array(
                \'key\'   => \'xxx\',
                \'value\'     => \'xxx\'
            )
    ));
    
    但这更复杂,因为我应该查询每个产品ID,以检查相关自定义帖子类型的repeater字段中是否存在该值。

    有人知道怎么做吗
    或者是否有其他方法来处理此问题?

  • 1 个回复
    最合适的回答,由SO网友:FS-GSW 整理而成

    当我有复杂的查询要做时,我经常使用预查询来获得良好的post\\u id。然后,我通过post__in parameter of WP_Query.

    $meta_key = \'RepeaterName_%_FieldName\';
    $meta_value = \'MyCustomValue\';
    
    global $wpdb;
    $post_ids = $wpdb->get_col( $wpdb->prepare( 
        "
            SELECT      pm.post_id
            FROM        $wpdb->postmeta pm
            WHERE       pm.meta_key LIKE %s 
            AND         pm.meta_value = %s
        ",
        $meta_key, 
        $meta_value, 
    ) ); 
    // Or with another custom $wpdb request 
    // https://developer.wordpress.org/reference/classes/wpdb/
    
    然后我们添加$post_ids 至主查询

    if ( !empty( $post_ids ) ) {
        $post__in = $query->get(\'post__in\');
        if ( empty( $post_in ) ) {
            $query->set( \'post__in\', $post_ids );
        } else {
            $query->set( \'post__in\', array_intersect( $post_ids, $post__in ) )
        }
    }
    
    所有这些代码必须放在pre_get_posts 滤器我希望回复达到您的期望。

    相关推荐

    Ordering terms whilst in loop

    我有一个页面模板,显示所有;“发布”;在两个自定义分类中,帖子显示在一个表中$type = $_GET[\'type\']; $category = $_GET[\'category\']; args = array( \'post-type\' => \'literature\', \'posts_per_page\' => -1, \'tax_query\' => array(