Intereting Posts
Как отображать все сообщения от стандартных сообщений до пользовательских типов сообщений в цикле с разбивкой на страницы? Как добавить в сообщение текст «Без содержания», Пользовательские ссылки для разбивки на страницы Переадресация ссылки на меню на основе имени пользователя или идентификатора пользователя Ошибка «Невозможно создать новое изображение» в редакторе изображений в WordPress Подготовка строки в массиве для локализации Поиск в ACF Веб-сайт, показывающий случайный код, например, текст в сообщении после вставки из MS Word next_ / previous_post_link () `in_same_category`, кажется, терпит неудачу, когда true Get_template_part, похоже, игнорирует мой шаблон Как отобразить пользовательское поле на главной странице Получение переменной из базы данных Редактировать настраиваемые поля в списке сообщений Установка тегов сообщений с использованием идентификатора тега Должен ли я удалять переходные процессы из таблицы wp_options?

Использование фильтра в виджетах приводит к фатальной ошибке

Я добавляю фильтр для запроса WordPress в виджет. Я добавляю следующее:

function filter_where( $where = '' ) { } add_filter( 'posts_where', 'filter_where' ); $query = new WP_Query( $args ); remove_filter( 'posts_where', 'filter_where' ); 

Он работает нормально, но если я использую один и тот же виджет более 1 раза, то получаю фатальную ошибку, которую нельзя повторно объявить одним и тем же фильтром. Как я могу использовать фильтр, чтобы один и тот же виджет можно было использовать несколько раз?

Это точная ошибка, которую я получаю:

 Fatal error: Cannot redeclare filter_where() (previously declared in xxx.php:70) 

Благодарю.

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

Ваш код должен выглядеть примерно так:

 class my_Widget extends WP_Widget { ... function filter_where( $where = '' ) { ... } function widget( $options ) { ... add_filter( 'posts_where', array( $this, 'filter_where' ) ); $query = new WP_Query( $args ); remove_filter( 'posts_where', array( $this, 'filter_where' ) ); } } 

Это позволит сохранить функцию внутри вашего класса, получить доступ к ней на уровне класса и избежать каких-либо проблем с пространством имен.

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

Определите обратный вызов вне самого виджета и примените только ( apply_filter ) внутри виджета.

Другими словами, добавьте свой метод обратного вызова как метод класса и добавьте его примерно так:

 add_filter('posts_where', array($this,'filter_where')); 

Вы должны удалить его с помощью аналогичного синтаксиса.

Не видя своего кода в контексте, это лучшее, что у меня есть.