Intereting Posts
Как превратить все вставленные изображения в сообщение в ссылки на изображения? Иврит имя пользователя WordPress: robots.txt дает 500 внутренних ошибок сервера Переменные и память WordPress Как использовать функции Возможно ли плагин зарегистрировать файл шаблона страницы? Получение диалогового приглашения «Изменения, которые вы сделали, будет потеряно» на странице пользовательского типа сообщений Сколько я должен взимать за создание плагина WordPress? «Создать новую дочернюю запись» из родительского сообщения с помощью кнопки – не используя раскрывающийся список атрибутов Почему визуальный редактор tinymce показывает фон из моей темы Изменить ссылку «Назад на сайт» в wp-login.php Использование управления вставкой изображения в коде как определить, что мы добавляем новый пользовательский тип сообщения или редактируем пользовательский тип сообщения Отключить редактирование вложений мультимедиа? Функция, когда создается новый пользовательский тип сообщения, должна что-то делать

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

Предположим, что существует тип 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 запросы и случайные заказы ужасны, так как БД приходится сканировать всю таблицу, чтобы создать новую временную таблицу со всеми вещами, которые вы не хотели удалить, только тогда она сможет запустить фактический запрос. Затем происходит очистка.