Intereting Posts
Рекомендуемое изображение не работает при загрузке из поддомена Сообщение о совместной работе Есть ли способ изменить миниатюрное изображение (ы) сообщения? Выполнить функцию в определенное время как показать только определенную категорию для шаблона Почему MySQL получает такой большой сериализованный объект? Пользовательский запрос SELECT с несколькими значениями метаданных (проблема с упорядочением) Как изменить стандартную метку состояния для страны на странице проверки? Как создать html-блок для отображения дополнительной информации на странице одного продукта woocommerce Изменить функцию wp_sanitize? Если категория находится в родительской категории? Получите все продукты, у которых есть обе категории продуктов Как эти функции PHP применяются к определенной странице в WordPress? Выборочно удалять пустую строку после изменения строки Где хранить поля настроек плагина

Получайте постоянную ссылку в цикле, но без дополнительного запроса БД

Я ищу создать пользовательскую страницу «Каталог», которая будет ссылаться на несколько тысяч сообщений. Из-за большого числа я пытаюсь ограничить количество запросов БД. Я замечаю, что для связи с каждым сообщением я вызываю get_permalink (), и это создает дополнительный запрос БД для каждого сообщения.

Есть ли способ восстановить постоянную ссылку сообщения без дополнительного запроса? Я попытался передать объект $ post, который, похоже, не помогает. Я также посмотрел на основную функцию и заметил, что передача всего объекта вместе с значением $ post-> filter = 'sample' позволит избежать дополнительного вызова get_post () в соответствии с:

Почему `get_permalink ()` создает добавление. Запрос БД без $ post-> filter?

Но это все еще вызывает дополнительный запрос. Есть идеи?

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

Не правда. Если вы проверите ссылку на очень старый траковый билет # 18822 в сообщении, которое вы связали, эта проблема была поднята @kaiser в 2011 году. На этот вопрос ответил @scribu

Например:

 $posts = get_posts(); foreach ( $posts as $post ) var_dump( get_permalink( $post->ID ) ); 

не вызовет дополнительных запросов, поскольку все эти записи кэшируются. Вы также можете передать весь объект $ post для get_permalink без дополнительных запросов, поскольку get_post( ) принимает объект. Фактически get_post() будет выполнять запрос только в том случае, если вы передадите объект, когда объект имеет свойство фильтра, и этот идентификатор сообщения еще не кэширован.

Как всегда, я не занимаюсь теорией, а на фактах, и то, как я получаю свои факты, находится в тестировании

Задайте себе следующий запрос и запустите его, а также отметьте время и вызовы db

 timer_start(); $posts = get_posts(); foreach ( $posts as $post ) { // REST TO COME LATER } echo '<p>' . get_num_queries() . ' queries in ' . timer_stop(1, 5) . ' seconds. </p>'; 

В моей локальной установке я получаю следующие результаты:

20 запросов на 0,02539 секунд

( ПРИМЕЧАНИЕ. Количество запросов относится не только к запросу, но и к общему количеству запросов, которые запускаются на странице, включая меню, виджеты, пользовательские запросы, основной запрос и т. Д. Время может варьироваться для каждой загрузки страницы )

Теперь измените запрос, как указано ниже

 timer_start(); $posts = get_posts(); foreach ( $posts as $post ) { get_permalink( $post->ID ); } echo '<p>' . get_num_queries() . ' queries in ' . timer_stop(1, 5) . ' seconds. </p>'; 

И это мой результат

20 запросов: 0,02539 секунд.

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

ВЫВОД

Вы можете использовать get_permalink() и вам не нужно беспокоиться о дополнительных вызовах db из-за системы кеша в WordPress. Вы также должны тратить свое время и работать через билет на трафик