Intereting Posts
Редактировать скрипт wordpress в дочерней теме по местоположению js Сохраните sql-файл после вставки wpdb добавив категорию в столбец администратора для пользовательского типа сообщения? Получение данных с другого сайта в wordpress (очистка экрана) Уведомление о последующих комментариях без подключаемого модуля Как получить доступ к телу запроса API WP в пользовательском маршруте? Установленное вредоносное ПО UpdraftPlus – страшно загружать или обновлять плагины сейчас! Можете ли вы исключить дочерние страницы определенного родителя в рамках навигации? все подсайты многозадачной установки WordPress, перенаправить 302, на главный сайт Как создать роль клона в wordpress Автоматическое отображение имени категории с использованием кода в файле functions.php Плагин CAPTCHA, где я могу использовать свои собственные изображения и задавать свои собственные вопросы? Параметры темы Customizer_register не сохраняются может ли нижний колонтитул быть включен в дочернюю тему Отображение наложения изображений поверх миниатюр типа категории?

Дата запроса год и месяц ИЛИ только год

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

Я знаю, что я где-то ошибаюсь, но я точно не могу точно определить проблему.

<?php $cat_query = array(array('relation' => 'AND')); if( isset( $_GET['category'] ) && $_GET['category'] ){ $cat_area_query = array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => $_GET['category'],'operator' => 'IN', ); $cat_query[] = $cat_area_query; } if( $cat_query && $cat_query ){ $cat_query['relation'] = 'AND' ; } $m = get_the_time('m'); $y = get_the_time('Y'); $args = array( 'post_type' => array('post'), 'post_status' => 'publish', 'tax_query' => $cat_query, 'orderby' => 'date', 'order' => 'desc', 'date_query' => array( 'relation' => 'OR', array( 'year' => $y, 'month' => $m, 'compare' => '=', ), ), ); $posts_query = new WP_Query( $args);?> 

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

Но в любом случае есть и другие очень большие проблемы, которые я хотел бы обсудить. Вы используете неизолированные входные значения из URL-адреса. Это действительно огромные угрозы безопасности и одно из пятен номер один, которые хакеры используют для взлома вашего сайта. ЗОЛОТОЕ ПРАВИЛО: НИКОГДА НИКОГДА не доверяйте никаким входным значениям, происходящим ни от кого, ни от кого, даже от вас самих. В вашем примере очень легко передать вредоносный код вашему параметру category через URL-адрес, и поскольку вы не проверяете его и не убегаете, этот код имеет право делать все, что он делает, и один хакер прыгает вверх и вниз, потому что он уничтожили еще один сайт

Вместо использования $_GET['category'] вы можете просто использовать filter_input который проверяет параметр и либо возвращает значение, либо false если параметр не задан. У вас также есть дополнительный бонус для дезинфекции входа через третий параметр фильтра. Поскольку это пуля, мы будем использовать FILTER_SANITIZE_STRING

Когда вы создаете tax_query , вам не нужно устанавливать параметр relation в одном массиве, кроме того, по умолчанию используется значение AND , поэтому вам не нужно его устанавливать

Вы также хотели бы установить свои параметры в соответствии с условием. Вот пример вашего кода: ( Примечание: это не проверено и требуется PHP 5.4+)

 <?php $category_slug = filter_input( INPUT_GET, // Global variable to use, in this case it will be a $_GET variable 'category', // Name or the parameter to get value from FILTER_SANITIZE_STRING // Use the FILTER_SANITIZE_STRING filter to sanitize the returned value ); // Check if $category_slug has a vlaue, if so, set the tax_query $cat_area_query = []; if( $category_slug ){ $cat_area_query = [ [ 'taxonomy' => 'category', 'field' => 'slug', 'terms' => $category_slug // No need to sanitize, the value is already sanitized // The operator is set to IN by default ] ]; } $date_query = []; // I have kept the month and year values the same as in your question though I doubt if this is correct $m = filter_var( get_the_time( 'm' ), FILTER_VALIDATE_INT ); // Sanitize and validate value as an integer $y = filter_var( get_the_time( 'Y' ), FILTER_VALIDATE_INT ); // Sanitize and validate value as an integer if ( 'some_condition_for_month' ) { $date_query = [ [ 'year' => $y, 'month' => $m ] ]; } elseif ( 'some_condition_for_year' ) { $date_query = [ [ 'year' => $y, ] ]; } $args = [ // The post_type and post_status parameters are set by default to 'post' and 'publish' // orderby 'date' is default 'order' => 'desc', 'tax_query' => $cat_area_query, 'date_query' => $date_query ]; $posts_query = new WP_Query( $args ); ?>