add_filter не работает как ожидалось

6 апр. 2015 г., 17:05:21
Просмотры: 15.2K
Голосов: 1

У меня есть плагин WordPress, где я включил этот код (с некоторыми изменениями)

$fep_files = array(
    'first' => 'first.php',
    'second' => 'second.php'
);

$fep_files = apply_filters('include_files', $fep_files );

foreach ( $fep_files as $fep_file )
require_once ( $fep_file );
unset ( $fep_files );

Теперь я добавил в function.php своей темы

function fep_remove ( $fep_files )
{
    if ( isset ( $fep_files['first'] ) ) {
        unset ( $fep_files['first'] );
            }
        //die($fep_files); //для проверки срабатывания
    return $fep_files;
}

add_filter( 'include_files', 'fep_remove' );

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

6
Комментарии

Вы уверены, что код плагина выполняется после загрузки темы?

fuxia fuxia
6 апр. 2015 г. 17:08:26

Как в этом убедиться? Есть ли более правильный способ подключения файлов, где пользователь сможет включать/исключать любые файлы при необходимости (используя хуки)?

Shamim Hasan Shamim Hasan
6 апр. 2015 г. 17:18:10

Я бы предложил начать с проверки отсутствия конфликта пространств имен. Назовите свой хук что-то вроде 'myplugin_include_files' (где "myplugin" — это что-то, представляющее ваш плагин). Слишком простое название хука может привести к конфликту.

butlerblog butlerblog
6 апр. 2015 г. 17:40:25

Ваш код работает, когда я его тестирую. Это затруднит выявление конкретной проблемы. Стоит отметить, что требование жесткого кодирования в теме для работы плагина — это довольно плохой подход.

s_ha_dum s_ha_dum
6 апр. 2015 г. 18:21:09

В реальном коде плагинов хуки не такие простые.

Shamim Hasan Shamim Hasan
6 апр. 2015 г. 19:40:18

как вы тестировали, @s_ha_dum? Первый код (который включает apply_filters) находится в моем плагине (основном файле с информацией о плагине), чтобы я мог подключить другие необходимые файлы для этого плагина. Я также добавил apply_filters, чтобы любой мог включать/исключать любой файл, не изменяя основной код плагина. Теперь, если кто-то захочет исключить first.php из этого кода, он/она добавит код (из моего вопроса, где есть add_filter) в function.php своей темы. Насколько это плохо?

Shamim Hasan Shamim Hasan
6 апр. 2015 г. 19:50:41
Показать остальные 1 комментариев
Все ответы на вопрос 3
1

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

Порядок загрузки плагинов, по-видимому, зависит от типа установки WordPress. Если у вас мультисайтовая установка (Multisite), то плагины действительно обрабатываются в порядке их активации.

Однако в одиночной установке WordPress они активируются в алфавитном порядке. Поэтому, если у вас возникает проблема, когда вам нужно обновить фильтр инициализации или действие для другого плагина, лучше всего назвать свой плагин так, чтобы он начинался с подчеркивания.

Например: _my_custom_plugin/my_custom_plugin.php

Для справки см. строки 704-713 в файле wp-admin/includes/plugin.php

21 дек. 2020 г. 11:05:34
Комментарии

Хм, думаю, стоит полагаться на хуки, например, обработчик plugins_loaded с высоким приоритетом, а не на алфавитный порядок, но эта информация полезна - спасибо

Rup Rup
21 дек. 2020 г. 12:02:45
1

Код вашего плагина будет выполняться до кода темы и, следовательно, запустится до того, как что-либо будет добавлено в хук. Вам нужно перенести код, обрабатывающий включение файла, на другой хук, который выполняется после загрузки всех плагинов, например, after_setup_theme.

Это может помочь: Существует ли блок-схема последовательности загрузки WordPress?

7 апр. 2015 г. 02:48:46
Комментарии

Я уже сделал это, и теперь всё работает идеально. Вы также предложили мне такое же решение. Я принимаю ваш ответ.

Shamim Hasan Shamim Hasan
7 апр. 2015 г. 17:22:37
1
-1

Предыдущий ответ был хорош в плане порядка, но я не смог разобраться, как заставить работать фильтр/хук с теми инструкциями.

Моим решением стало создание кастомного плагина, содержащего фильтр, и убедиться, что он находится в алфавитном порядке перед плагином, содержащим фильтр, к которому я хочу добавиться.

Другими словами, поместите код в plugings/a-custom-plugin.php, начиная файл с:

<?php
/*
Plugin Name: Мой кастомный плагин
*/
26 янв. 2016 г. 04:12:49
Комментарии

Плагины не запускаются в алфавитном порядке - на самом деле они запускаются в порядке активации, так как при активации плагин добавляется в массив активных плагинов, хранящийся в базе данных. ( wp_options -> active_plugins )

Bysander Bysander
19 мар. 2020 г. 13:46:56