Получить только конкретные данные по запросу продукта в WooCommerce - PullRequest
1 голос
/ 23 сентября 2019

Я пытаюсь получить все продукты из WooCommerce в массиве, который я буду использовать позже для синхронизации с внешней базой данных.

В следующем коде я использую функцию wc_get_products(), которая возвращает для каждого продукта очень большое количество данных (которые мне больше всего не нужны) :

$args = array(
'status' => 'publish',
'limit' => -1,
);
$wooExistingProducts = wc_get_products($args);

Вместо этого, что я могу сделать, чтобы получить только идентификатор продукта, название продукта и цену продукта?

Для каждого продукта мне хотелось бы иметь что-то вроде:

[
{
id: 315892135,
name: Food for Hamster
price: 5$
}
{
id: 129414,
name: ....
price:...
}
....
]

Я пытался использовать WP_Query вместо этого, но не дал лучшего решения.

1 Ответ

1 голос
/ 23 сентября 2019

Фактически единственным доступным фильтром для wc_get_products () является 'return' => 'ids' для получения только идентификаторов продукта при использовании WC_Product_Query.

.Решение заключается в использовании прямого SQL-запроса с классом WordPress WPDB , так как это легче и наиболее эффективный способ получитьданные, как вы хотите в запросе продукта.

В следующем запросе мы обязаны исключить переменные продукты, поскольку они имеют несколько цен (по одному для каждого варианта) :

<code>global $wpdb;

$products_query = $wpdb->get_results( "
    SELECT  p.ID AS id,
            p.post_title AS name,
            Max(CASE WHEN pm.meta_key = '_price' AND  p.ID = pm.post_id THEN pm.meta_value END) AS price
    FROM    {$wpdb->prefix}posts p
            INNER JOIN {$wpdb->prefix}postmeta pm
                ON p.ID = pm.post_id
    WHERE   p.post_type = 'product'
            AND p.post_status = 'publish'
            AND p.post_parent != 0
    GROUP BY p.ID
    ORDER BY p.ID ASC;
" );

// Testing raw output
echo '<pre>'; print_r( $products_query ); echo '
';

ВКЛЮЧАЯ ИЗМЕНЕНИЯ ПРОДУКТА (опция) :

Если вы хотите включить вариации продукта переменного продукта,Вы должны заменить эту строку:

WHERE   p.post_type = 'product'

на:

WHERE   p.post_type IN ('product','product_varation')

Я не рекомендую использовать wc_get_products() или get_posts() (WP_Query) в вашем случае:

  • , поскольку вы также получите переменные продукты (цены на которые зависят от его вариаций)
  • гораздо тяжелее (даже если вы запрашиваете только поле 'ids', чтобы получить только идентификаторы продуктов) , поскольку вам придется задавать данные для каждого продукта, делая несколько запросов к базе данных.
...