Intereting Posts
wp_query на шаблоне страницы не работает (структура Genesis) Попытка получить отдельные сообщения для загрузки на первой странице через ajax Обновление wp_options с массивом на save_post приводит к дублированию записей Сделайте отзывчивую страницу в WordPress Скрипт пользовательской регистрации пользователя, разрешающий имена пользователей с 16 символами Как контролировать, какая категория будет выбрана для пули сообщения? Создайте случайное уникальное 6-значное число в качестве настраиваемого поля для пользовательского типа сообщения Извлеките однолетнюю слизню Выполнять функцию каждый час в фоновом режиме Есть ли способ активировать другую тему для определенных пользователей? Есть ли способ получить RSS-канал по диапазону дат, а не по количеству элементов? CSS сохранен и установлен в очередь, но WordPress не загружает текст css, только файл Скрипт Enqueue: ссылка не работает в источнике страницы $ wpdb не любит хранить массивы контактная форма в шаблоне с jquery, validate и ajax

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

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

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

Например, я хочу, чтобы 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 для отображения других виджетов, передающих объект .

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