Intereting Posts
Сделать wp-страницы доступными для входа в Woocommerce Исправлен макет для раздела администратора Добавить статический элемент в wp_nav_menu Автоматически прикреплять изображения к сообщению, если они имеют одинаковый заголовок Случайная запись + категории + теги Отображение заголовка сообщения, но не в обернутом HTML. Мне нужно Автоматический набор сообщений для определенных категорий Как заменить видео на YouTube миниатюрой «Нажмите, чтобы играть»? Переместить заголовок архива в заголовок записи – Бытие Дублирование полной версии WordPress для разработки, а затем перераспределения? Как использовать post_title пользовательского типа сообщения как таксономии Отключить обрезку в WordPress имена почтовых папок, а не числа Как я могу отобразить пользовательскую страницу в области администрирования WordPress? (получение сообщения «не разрешено для доступа к этой странице» Как получить сообщение meta в функциях?

Передайте один и тот же объект нескольким виджетам в шаблоне с одним запросом

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

У меня есть виджет, который будет предоставлять конкретные аспекты одного и того же объекта с разными экземплярами виджета в шаблоне. Экземпляры виджетов являются обязательными , но экземпляр объекта должен оставаться неизменным. Есть ли сладкое пятно в шаблоне запуска действий и фильтров, которые я должен искать в своем виджете?

Например, я хочу, чтобы object->title отображался в моем виджете в верхней части страницы, поэтому я проверяю этот флажок и так, чтобы показывать в этой области. Затем у меня есть еще один экземпляр виджета, где я проверяю object->content отображаемый в этой области.

Это очень легко внутри виджета, однако, очень неэффективно, потому что я просто запускал два запроса для одного и того же объекта, из-за того, что мои виджеты были двумя разными объектами для себя.

Как мой виджет не может выполнить один и тот же запрос дважды в этой ситуации? Будет ли get_queried_object запускать запрос для обоих экземпляров виджета?

Solutions Collecting From Web of "Передайте один и тот же объект нескольким виджетам в шаблоне с одним запросом"

Я предлагаю использовать API-интерфейс Object Cache или Transients API , независимо от того, что лучше подходит вашим потребностям.

Очень быстрый пример с кешем объекта:

 // helper function function get_my_object() { $object = wp_cache_get( 'my_object' ); if ( false === $object ) { $args = array( .... ); $object = new WP_Query( $args ); wp_cache_set( 'my_object', $object ); } return $object; } class cyb_my_widget extends WP_Widget { function __construct() { // ... } function widget( $args, $instance ) { // ... $object = get_my_object(); } function update( $new_instance, $old_instance ) { // ... } function form( $instance ) { // ... } } 

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

Программно более здравый подход будет довольно неплохой работой и будет выглядеть следующим образом:

  1. Создайте виджет, который запускает запрос и возвращает ваш объект. Обычно экземпляр WP_widget будет использовать конструктор родителя для инициализации. Однако, когда вы расширяете класс WP_Widget, вы также можете добавить дополнительный конструктор. Здесь вы генерируете возможность передать дополнительный аргумент экземпляру виджета, вашему объекту.
  2. Другие виджеты, которые вы определяете не как расширения WP_Widget, а как расширения вашего родительского виджета, чтобы они могли принять дополнительный аргумент.
  3. Внутри родительского виджета используйте the_widget для отображения других виджетов, передающих объект .

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