Intereting Posts
Как отсортировать столбец администратора настраиваемого столбца, используя два мета-ключа? встраивать the_content Как настроить тему Что не так с этим кодом, я должен сделать shortcode blockquote Необходимый пользователь, группа и разрешения для основных обновлений Пользовательская таксономия скрывает мета-окно, но отображается в меню Установка и обновление плагинов при установке VPS WordPress Как показать пользовательский статический контент в верхней части каждой страницы категории? Как остановить образы от обертывания в тегах <p>? Заменить логотип входа в WordPress с помощью настраиваемого текста Правильный способ включения JavaScript и CSS в мои темы WordPress Искать все (сообщения, страницы, теги, cpt, meta) Может ли таблица wp_posts иметь один и тот же пул (post_name) в нескольких статусах (post_status)? Авторские сообщения не отображаются для пользовательских типов сообщений Как я могу избежать постоянной ссылки на «блог» при использовании настраиваемого типа сообщений?

Показывать только сообщения, которые можно прокомментировать или иметь настраиваемое мета-поле

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

Теперь я хотел бы добавить возможность исключений – показать определенные сообщения, для которых комментарии закрыты, тем не менее. Они отмечены специальным полем «show_always».

Я пытался:

function wpjj_filter_sticky( $query ) { $meta_query = array( 'relation' => 'OR', array( 'key' => 'show_aways', 'value' => 'yes', 'compare' => 'EXISTS' ), array ( 'comment_status' => 'open' ) ); $query->set( 'meta_query', $meta_query ); } add_filter( 'pre_get_posts', 'wpjj_filter_sticky' ); 

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

Давайте попробуем следующее:

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

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

  • comment_status закрытого

  • которые имеют мета значение не yes

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

Я думаю, что это лучший подход, потому что обработка SQL, которая включает в себя мета-запросы, может стать очень запутанной, особенно когда вы начинаете добавлять сложные вложенные мета-запросы. Пусть WP_Query обрабатывает часть meta_query для нас.

Мы по-прежнему будем использовать параметр comment_status который поддерживается настраиваемым фильтром @TheDeadMedic в связанном вами вопросе

 add_action( 'pre_get_posts', function ( $q ) { if ( $q->is_home() && $q->is_main_query() ) { // Run our secondary query to get the posts to exclude $args = [ 'posts_per_page' => -1, 'comment_status' => 'closed', 'meta_query' => [ 'relation' => 'OR', [ // Compensate for posts which have the custom field set but not set to yes 'key' => 'show_always', 'value' => 'yes', 'compare' => 'NOT IN' // Get posts which value is not yes ], [ // Compensate for posts which does not have the custom fields 'key' => 'show_always', 'compare' => 'NOT EXISTS' // Get posts which value is not yes ] ], 'fields' => 'ids', // Return only post ID's 'suppress_filters' => false, // Allow the comment_status filter // Any other parameters ]; $exclude_ids = get_posts( $args ); // Now we can exclude the ID's we just queried $q->set( 'post__not_in', $exclude_ids ); } }); 

РЕДАКТИРОВАТЬ

Вышеприведенный код теперь протестирован и работает как ожидалось

ИЗМЕНИТЬ из комментариев

@birgire отправил новый билет на трафик (траковый билет № 35601 ), чтобы узнать, почему comment_status недоступен в WP_Query по умолчанию. Мы надеемся, что в ближайшем будущем мы увидим, что это включено в ядро. Как только это произойдет, пользовательский фильтр больше не понадобится