Кастомный запрос продукта Woocommerce

Вопрос или проблема

Я работаю над проектом, который показывает некоторые поездки (в зависимости от категории назначения). Я пытаюсь отсортировать поездки по дате начала (var_confirmed_date), но результат такой же, как будто сортировки нет.

Вот мой запрос:

`$args = array(
                    'posts_per_page'    => -1,
                    'post_type'         => 'product',
                    'meta_value'        =>  'meta_value',
                    'meta_key'          =>  'var_confirmed_date',
                    'order'             =>  'ASC',
                    'meta_type'         =>  'DATE',
                    'tax_query'         => array(
                        array(
                            'taxonomy'  => 'destination',
                            'field'     => 'id',
                            'terms'     => array($t_id)
                        )
                    ),
                    'meta_query' => array(
                        array(
                            'key'     => 'var_confirmed_date',
                            'value'   => date("Y-m-d",time()),
                            'compare' => '>=',
                            'type'    => 'DATE',
                        ),
                    ),
                );
            $loop = new WP_Query( $args );`

Есть идеи, как сделать это правильно?

Спасибо.

Попробуйте это

$args = array(
                    'posts_per_page'    => -1,
                    'post_type'         => 'product',
                    'meta_key'          =>  'var_confirmed_date',
                    'meta_type'         =>  'DATE',
                    'orderby'           => 'meta_value_date',
                    'order'             =>  'ASC',
                    'tax_query'         => array(
                        array(
                            'taxonomy'  => 'destination',
                            'field'     => 'id',
                            'terms'     => array($t_id)
                        )
                    ),
                    'meta_query' => array(
                        array(
                            'key'     => 'var_confirmed_date',
                            'value'   => date("Y-m-d",time()),
                            'compare' => '>=',
                            'type'    => 'DATE',
                        ),
                    ),
                );
            $loop = new WP_Query( $args );

Я нашел решение на StackExchange (WooCommerce: фильтрация по таксономии родительского продукта и метаданным вариаций продукта)

Я использую функцию в child function.php, затем сортирую по $t_id и ID, найденному с помощью функции

Ответ или решение

Кастомный запрос продуктов WooCommerce: решение проблемы сортировки

В рамках вашего проекта, где необходимо отображение путешествий в зависимости от категории назначения, возникла задача сортировки продуктов по дате начала (метаданные var_confirmed_date). Ниже представлено решение проблемы, которое поможет вам достичь желаемого результата.

Анализ текущего запроса

На первый взгляд, в вашем первоначальном запросе есть несколько проблем, которые могут привести к отсутствию правильной сортировки:

  1. Использование meta_value и meta_key одновременно — это не требуется. meta_value следует удалить, так как оно не используется для сортировки.
  2. Необходимо корректно настроить orderby — нужно указать, что сортировка будет выполняться по метадатам, а не по обычным записям.

Исправленный запрос

Ваш исправленный запрос должен выглядеть следующим образом:

$args = array(
    'posts_per_page' => -1,
    'post_type'      => 'product',
    'meta_key'      => 'var_confirmed_date',
    'orderby'       => 'meta_value',
    'order'         => 'ASC',
    'tax_query'     => array(
        array(
            'taxonomy' => 'destination',
            'field'    => 'id',
            'terms'    => array($t_id)
        )
    ),
    'meta_query' => array(
        array(
            'key'     => 'var_confirmed_date',
            'value'   => date("Y-m-d"),
            'compare' => '>=',
            'type'    => 'DATE',
        ),
    ),
);

$loop = new WP_Query($args);

Ключевые изменения:

  1. Убрано лишнее ключевое слово meta_value. Вместо этого теперь указано orderby с meta_value, чтобы правильно провести сортировку.
  2. Убедитесь, что атрибут meta_type больше не используется, так как это приведет к возможной ошибке.
  3. Игнорируя внутренние метаданные WooCommerce, мы сосредоточились на корректной работе с временными метаданными.

Дополнительные улучшения

Если вам необходимо осуществлять фильтрацию по иерархии продуктов (например, родительские и дочерние продукты), вам может понадобиться создать специальную пользовательскую функцию в functions.php вашей темы. Это позволит дополнительно фильтровать запросы продуктов по их базовым категориям и метаданным.

Использование пользовательских функций

Вот пример функции, которую вы можете использовать:

function custom_product_filter($query) {
    if (!is_admin() && $query->is_main_query() && is_post_type_archive('product')) {
        $query->set('meta_key', 'var_confirmed_date');
        $query->set('orderby', 'meta_value');
        $query->set('order', 'ASC');
        // Дополнительные параметры фильтрации могут быть добавлены здесь
    }
}
add_action('pre_get_posts', 'custom_product_filter');

Эта функция настраивает ваш запрос на архивах продуктов, добавляя необходимые параметры сортировки.

Заключение

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

Если возникнут дополнительные вопросы или потребуются уточнения, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...