Intereting Posts
Какие особые привилегии для базы данных нужны WordPress? Миниатюры Vimeo Как добавить категории в wp_list_pages () Добавление кнопки YouTube в редактор TinyMCE Пользовательские параметры GET на странице администратора плагина Неверная ошибка типа сообщения при попытке фильтрации и массового редактирования сообщений Buddypress: Фильтровать участников на основе Если у них есть сообщения Как я могу получить список комментариев по целевым Получение частных сообщений или пользовательских типов сообщений через WP-API с базовой аутентификацией сделать выдержку из данных из мета-поля? Каков правильный способ обновления параметров WordPress Получить программную ссылку по ссылке Как добавить поле выше раздела пароля на странице профиля Перечислите дочерние категории из родительской категории на странице пользовательской таксономии Шаблон страницы не отображает простой HTML, если он вставлен на другую страницу?

Как скрыть определенный тип сообщения из архива?

Предположим, что существует тип post, называемый profilepost который я хочу скрывать от всех видов архива. (но не меняя статус сообщения на приватный), я попытался получить весь идентификатор сообщения, принадлежащий этому типу сообщения. Не удалось выполнить код ниже.

 global $wpdb; $profilepost_ids = $wpdb->get_col( "SELECT ID FROM wp_posts where post_type = 'profilepost'" ); function my_custom_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ) return; if ( $query->is_archive() ) {$query->set( 'post__not_in', $profilepost_ids );} } add_action( 'pre_get_posts', 'my_custom_get_posts', 9999 ); 

Но когда я заменил $query->set( 'post__not_in', $profilepost_ids ); с $query->set( 'post__not_in', array(1234,4321) ); , где 1234 и 4321 являются почтовыми идентификаторами, он работает.

Кто-то может сказать мне, что я сделал не так?

Solutions Collecting From Web of "Как скрыть определенный тип сообщения из архива?"

pre_get_posts позволяет вам изменить то, что запрос предназначен для извлечения, но то, что вы сделали, по существу:

  • Захватите сообщения типа A, B, C, а затем удалите все сообщения с этими идентификаторами, которые, как оказалось, являются всеми сообщениями типа B

Когда ваш конечный результат должен быть:

  • Захват сообщений типа A, C

Так почему бы просто не сделать это? Сначала позволяет получить список типов сообщений для извлечения:

 $post_types = $query->get( 'post_type' ); 

Тогда это просто вопрос удаления profilepost из этого массива, а затем вызов set :

 $query->set( 'post_type' $post_types ); 

Так что напомню:

  • захватить список типов сообщений в новой переменной
  • изменить новый список
  • верните новый список в запрос

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

Примечание по post__not_in

Это невероятно медленная работа. Избегайте чего-либо с NOT или __not_in как чума. Даже если он работает быстро при загрузке одной страницы, это даст вам серьезные проблемы с масштабированием и будет экспоненциально медленнее / дороже, поскольку вы добавляете больше контента

Всегда запрашивайте то, что ищете, никогда за то, чего вы не хотите.

Замечание об использовании SQL для получения всех сообщений и Querying for Things

Всегда используйте WP_Query для извлечения сообщений, всегда выполняется ваш SQL-запрос, без кэширования, чтобы ускорить работу. Более того, запрос не масштабируется. Это потому, что он возвращает все без пейджинга. Это может сработать, если в таблице есть 5 или 6 должностей, но вы столкнулись с проблемами, когда их 100 или 200.

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

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

Также почему NOT IN запросы и случайные заказы ужасны, так как БД приходится сканировать всю таблицу, чтобы создать новую временную таблицу со всеми вещами, которые вы не хотели удалить, только тогда она сможет запустить фактический запрос. Затем происходит очистка.