2

我目前正在使用 Woocommerce 为 WordPress 网站构建自己的自定义高级搜索功能。您应该能够使用过滤器进行搜索:

  • 类别
  • 最低/最高价格

我目前的进展附在下面。这使您能够在 URL 参数中指定类别 slug。返回将匹配的帖子:

/**
 * Default arguments
 * @var array
 */

    $query = array(
        'post_status' => 'publish',
        'post_type' => 'product',
        'posts_per_page' => 10,
    );

/**
 * Category search
 */

    if(isset($_GET['categories']) && $_GET['categories']) {
        /**
         * Comma seperated --- explode
         * @var [type]
         */

            $categories = explode(',', $_GET['categories']);

        /**
         * Add "or" parameter
         */

            $query['tax_query']['relation'] = 'OR';

        /**
         * Add terms
         */

            foreach($categories as $category) {
                $query['tax_query'][] = array(
                        'taxonomy' => 'product_cat',
                        'field' => 'slug',
                        'terms' => $category,
                    );
            }
    }
/**
 * Fetch
 */

    $wp_query = new WP_Query($query);

现在,虽然这在您搜索类别时效果很好,但当您需要搜索价格时,它似乎变得更加复杂。

在原始 SQL 中,类似下面的内容会起作用:

SELECT DISTINCT ID, post_parent, post_type FROM $wpdb->posts
INNER JOIN $wpdb->postmeta ON ID = post_id
WHERE post_type IN ( 'product', 'product_variation' ) AND post_status = 'publish' AND meta_key = '_price' AND meta_value BETWEEN 200 AND 1000

我不知道如何使用 WP_Query 来实现它。

4

3 回答 3

14

该解决方案受@Niels van Renselaar 启发,但更简洁:

$query = array(
    'post_status' => 'publish',
    'post_type' => 'product',
    'posts_per_page' => 10,
    'meta_query' => array(
        array(
            'key' => '_price',
            'value' => array(50, 100),
            'compare' => 'BETWEEN',
            'type' => 'NUMERIC'
        )
    )
);

$wpquery = WP_Query($query); // return 10 products within the price range 50 - 100
于 2015-02-06T14:46:36.620 回答
4

您可以在使用 WP_Query(或 get_posts,我发现它在使用中的侵入性较小)时组合多个 meta_queries。

http://codex.wordpress.org/Class_Reference/WP_Meta_Query

http://codex.wordpress.org/Class_Reference/WP_Query

你可以通过做这样的事情来组合它们

$myposts = get_posts(
    array(
        'post_type' => array('product', 'product_variation'),
        'meta_query' => array(
            array(
                'key' => '_price',
                'value' => '200',
                'compare' => '>='
            ),
            array(
                'key' => '_price',
                'value' => '2000',
                'compare' => '<='
            )
        )
    )
);
于 2015-02-06T14:36:44.710 回答
3

如果您在 woocommerce 循环中工作时可以使用 WC 钩子

add_action( 'woocommerce_product_query', 'example_product_query_price' );

function example_product_query_price ( $q ) {
    $meta_query = $q->get( 'meta_query' );

    $meta_query[] = array(
        'key'     => '_regular_price',
        'value'   => array(
            300000 ,
            900000
        ),
        'compare' => 'BETWEEN',
        'type'=> 'NUMERIC'
    );

    $q->set( 'meta_query', $meta_query );
}
于 2015-09-25T18:15:57.710 回答