WP_Query вместо шорткода

207
27 февраля 2017, 14:13

Подскажите, как заменить нижеприведённый код вызова шорткода на аналогичный код, в котором используется WP_Query? Сам цикл я смогу построить на основе полученных данных из бд. Но как задать правильно запрос в базу данных, чтобы выбрать товары из категории sale_products или товары из product_category?

echo do_shortcode('[product_category category="computers"]');
или 
echo do_shortcode('[sale_products per_page="12"]');
Answer 1

Цикл, в общем-то обычный WordPress, с учетом того, что тип поста - products, и не категории, а таксономии. Свойства товара (например, цена распродажи) содержатся в мета-полях.

Для теста создана пустая страница, использующая файл шаблона. В файле шаблона:

<?php
/*
Template Name: woo-test-632707
*/
echo '<h2>Товары категории "Фильмы"</h2>';
$args = array(
    'post_type' => 'product',
    'product_cat' => 'фильмы',
    'posts_per_page' => -1
);
$wc_query = new WP_Query($args);
if ($wc_query->have_posts()) {
    while ($wc_query->have_posts()) {
        $wc_query->the_post();
        ?>
        <p><?php the_title(); ?></p>
        <?php
    }
    wp_reset_postdata();
}
else {
    ?>
    <p><?php echo 'No Products'; ?></p>
    <?php
}
echo '<h2>Товары на распродаже</h2>';
$args = array(
    'post_type' => 'product',
    'meta_key' => '_sale_price',
    'meta_value' => '0',
    'meta_compare' => '>=',
    'posts_per_page' => 12
);
$wc_query = new WP_Query($args);
if ($wc_query->have_posts()) {
    while ($wc_query->have_posts()) {
        $wc_query->the_post();
        ?>
        <p><?php the_title(); ?></p>
        <?php
    }
    wp_reset_postdata();
}
else {
    ?>
    <p><?php echo 'No Products'; ?></p>
    <?php
}
?>

Результат здесь.

Answer 2

Подскажите пожалуйста ещё по этому шорткоду:

echo do_shortcode('[best_selling_products per_page="12"]');
я делаю так:

$args = array( 'post_type' => 'product', 'posts_per_page' => 12, 'meta_key' => 'total_sales', 'orderby' => 'meta_value_num', ); $wc_query = new WP_Query($args); if ($wc_query->have_posts()) { while ($wc_query->have_posts()) { $wc_query->the_post(); woocommerce_product_loop_start(); wc_get_template_part( 'content', 'product' ); woocommerce_product_loop_end(); } } wp_reset_postdata();

но дело в том, что магазин находится ещё в разработке, а самые продаваемые товары уже выводятся в результате этого кода. Ведь товары ещё не продавались. Правильно ли я вывожу самые продаваемые товары?

READ ALSO
Роутинг во Flight PHP

Роутинг во Flight PHP

ПриветствуюЕсли тут есть знатоки этого микро-фреймворка, буду признателен за помощь

208
Javacript таймаут в запросе

Javacript таймаут в запросе

Нужно реализовать таймаут в 1 секунду в циклеПробовал через setTimeout, но не пошло

243
Достать или считать? js - setInterval

Достать или считать? js - setInterval

Есть ли способ узнать количество итераций функции setInterval без использования дополнительной переменной?

228