Использование пользовательских метаданных в WC_Product_Query в Woocommerce 3 - PullRequest
0 голосов
/ 29 июня 2018

Раньше я использовал стандартный WordPress WP_Query для получения продуктов woocommerce на основе метаданных. Мои продукты являются треками и имеют много мета-столбцов (например, жанр, инструмент, настроение и т. Д.). Используя WP_Query, я могу создать мета-запрос на основе пользовательского ввода из формы, который ищет продукты, соответствующие мета-требованиям. Все это прекрасно работает.

Теперь я хочу использовать wp_get_products вместо WP_Query, потому что это новый способ получения продуктов, и он должен быть более ориентирован на будущее, чем старый. Однако я не могу понять, как передать meta_query в эту функцию. На github было объявлено, что wc_get_products будет поддерживать мета версии 2.8. Единственная информация, которую я могу найти по этому вопросу, находится по следующей ссылке: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query (самый последний абзац).

Я попытался передать meta_query в виде массива массивов, каждый из которых содержит 3 пары ключ-значение для ключа, значения и сравнения, как в WP_Query. Я также попытался добавить мета как Meta: meta-field-name, то есть имя фактических полей, только само имя без префикса 'meta' и некоторые другие варианты. Ни один из этих методов не работает, хотя. Может кто-нибудь сказать мне, если эта «поддержка пользовательских параметров» относится только к пользовательским параметрам, отличным от мета полей, или я делаю что-то не так?

1 Ответ

0 голосов
/ 29 июня 2018

Для обработки продукта пользовательских метаданных в WC_Product_Query (находится в таблице wp_postmeta) , это довольно просто и работает, , как объяснено в самом последнем пункт соответствующей документации .

Но он не обрабатывает несколько значений и аргументов сравнения, как в WP_Query, , если вы не установите их в функции, расширяющей meta_query.

Для пользовательского продукта мета-ключ , например _volume для обработки объем , полученный продуктом в м3 (куб. М) , следующий код включит этот пользовательский meta_key с определенным compare аргументом "больше, чем" :

add_filter( 'woocommerce_product_data_store_cpt_get_products_query', 'handling_custom_meta_query_keys', 10, 3 );
function handling_custom_meta_query_keys( $wp_query_args, $query_vars, $data_store_cpt ) {
    $meta_key = '_volume'; // The custom meta_key

    if ( ! empty( $query_vars[$meta_key] ) ) {
        $wp_query_args['meta_query'][] = array(
            'key'     => $meta_key,
            'value'   => esc_attr( $query_vars[$meta_key] ),
            'compare' => '>', // <=== Here you can set other comparison arguments
        );
    }
    return $wp_query_args;
}

Код помещается в файл function.php активной дочерней темы (или активной темы).

Теперь вы просто сделаете запрос по этому пользовательскому мета-ключу _volume, основанному на определенном аргументе 'compare', чтобы получить все продукты, объем которых превышает '0.2':

$queried_products = wc_get_products( array( '_volume' => '0.2' ) );

Проверено и работает.

Как видите, вы можете продолжать использовать WP_Query, так как многие разработчики Woocommerce все еще делают или даже запросы SQL через WordPress WPDB Class…

Объявленная революция вокруг этого не скоро произойдет, и я предполагаю, что они расширят WC_Product_Query и WC_Order_query, как WP_Query, с гораздо большим количеством функций и возможностей.

...