Мне нужно передать пользовательские данные в фильтр, предоставленный сторонним плагином. Все способы, которые я видел, чтобы сделать это, действительно сложны и трудно обернуть мою голову вокруг.
Возьмите этот пример:
$score = 42; //Some crazy calculation I don't want to repeat.
function add_score_to_title($title) {
return 'Quiz Results (' . $score . '/') - ' . $title;
}
add_filter( 'aioseop_title_single', 'add_score_to_title');
Как я могу передать $score
переменную add_score_to_title()
?
В итоге я добавил свою переменную в глобальный $wp
объект. Итак, вы в конечном итоге с этим:
global $wp;
$score = 42; //Some crazy calculation I don't want to repeat.
$wp->some_random_name_for_score = $score;
function add_score_to_title($title) {
global $wp;
$score = $wp->some_random_name_for_score;
return 'Quiz Results (' . $score . '/') - ' . $title;
}
add_filter( 'aioseop_title_single', 'add_score_to_title');
Грязные? Может быть. Просто? Ага! Есть ли недостатки этой техники? Пожалуйста, обсудите.
ОБНОВЛЕНИЕ Вот полный рассматриваемый код -> http://pastebin.com/fkSXY04m
$score
рассчитывается путем зацикливания на массиве вещей и увеличения переменной. pastebin.com/fkSXY04mОтветы:
У вас есть как минимум два варианта:
Глобализировать переменную
Оберните расчет баллов
Если вам когда-либо понадобится вычисление оценки внутри фильтра, включите логику в сам обратный вызов:
А еще лучше, вы можете обернуть вычисление баллов в собственную функцию, а затем вызвать эту функцию внутри вашего обратного вызова:
Если вы обнаружите, что у вас есть проблемы со ссылкой на
$_POST
объект, вы можете также зарегистрировать переменную запроса и затем использовать ееget_query_var()
для получения данных:С этим на месте,
$_POST['Q']
можно заменить наget_query_var('Q')
.источник
$score
Сначала я вычислил, а затем глобализировал его. Не удивительно, что это не сработало. Спасибо!Вызовите функцию в любом месте вашего скрипта, чтобы получить оценку, она будет рассчитана только один раз.
Другой способ, используя анонимные функции :
источник
add_filter()
илиadd_action()
вызовы. Они не могут быть удалены черезremove_function()
.remove_filter()
иremove_action()
. И нет никаких причин, по которым фильтры плагинов / тем не могут быть разумно удалены: переопределить очереди таблиц стилей плагинов, дочерние темы и т. Д.В следующем примере переменная видится
$my_calculation
в глобальной области видимости, однако внутри нашей локальной функции мы должны объявить ееglobal $my_calculation
, чтобы получить доступ к переменной в глобальной области видимости.Это всего лишь один из способов сделать это, и он кажется аккуратным. Будет ли это работать для вас?
источник
print
илиecho
ваш результат убедиться, что ваша функция действительно работает до ее передачи в фильтр?$score
действительно работает. Я обманываю и устанавливаю$score
сначала глобализированный, который явно не работает. Правильное выполнение,$score
сначала глобализация, а затем присвоение значения, работает, как и ожидалось. Спасибо всем.