Вопрос или проблема
Я снова здесь с странным вопросом.
Во-первых, я использую плагин ACF для добавления пользовательских полей. Мой код выглядит примерно так:
global $testMe;
$testMe = 0;
function my_acf_update_value( $value, $post_id, $field ) {
global $testMe;
$testMe = $value;
return $value;
}
add_filter('acf/update_value/key=field_5308e5e79784b', 'my_acf_update_value', 10, 3);
echo $testMe; // -> выводит 0, а не $value!?
Проблема в том, что я хочу, чтобы после применения фильтра $testMe содержал значение $value.
Есть идеи, где я не прав?
Я провел тест, и следующее работает:
global $testMe;
$testMe = 0;
function my_acf_update_value( $value, $post_id, $field ) {
global $testMe;
$testMe = $value;
return $value;
}
add_filter('acf/update_value/key=field_5308e5e79784b', 'my_acf_update_value', 10, 3);
// Тест: Применение фильтра
apply_filters('acf/update_value/key=field_5308e5e79784b','a','b','c');
// конец теста
echo $testMe; // выводит 'a'
Таким образом, в принципе, ваш код функционален. Есть несколько вещей, которые, как мне кажется, могут быть неправильно.
- Вы добавляете фильтр после того, как хук уже сработал. Поместите этот тест
apply_filters
перед остальным кодом, и это не сработает. - У вас неправильное имя хука.
Кроме того, это должно работать. Однако техника с использованием global
переменных немного неаккуратна. Могу предложить что-то вроде этого:
function my_acf_grab_value($value,$echo = false) {
static $var = 0;
if (false === $echo) {
$var = $value;
} else {
return $var;
}
}
function my_acf_update_value( $value, $post_id, $field ) {
my_acf_grab_value($value);
return $value;
}
add_filter('acf/update_value/key=field_5308e5e79784b', 'my_acf_update_value', 10, 3);
// Тест: Применение фильтра
apply_filters('acf/update_value/key=field_5308e5e79784b','Yay','b','c');
// конец теста
echo my_acf_grab_value('',true);
Или так:
function my_acf_update_value( $value="", $post_id = 0, $field = '' ) {
static $var = 0;
if (!empty($value)) {
$var = $value;
} else {
return $var;
}
return $value;
}
add_filter('acf/update_value/key=field_5308e5e79784b', 'my_acf_update_value', 10, 3);
// Тест: Применение фильтра
apply_filters('acf/update_value/key=field_5308e5e79784b','Yay','b','c');
// конец теста
echo my_acf_update_value();
.
Ответ или решение
Когда вы работаете с фильтрами в WordPress и хотите сохранять значение в глобальной переменной, есть несколько нюансов, которые необходимо учесть. В вашем коде использована глобальная переменная $testMe
для сохранения значения из функции фильтра my_acf_update_value
, однако вы сталкиваетесь с проблемой, что значение не обновляется должным образом. Давайте разберёмся в этом подробнее.
Проблема с сохранением значения
Исходный код, который вы привели, выглядит следующим образом:
global $testMe;
$testMe = 0;
function my_acf_update_value( $value, $post_id, $field ) {
global $testMe;
$testMe = $value;
return $value;
}
add_filter('acf/update_value/key=field_5308e5e79784b', 'my_acf_update_value', 10, 3);
echo $testMe; // выводит 0, а не значение из $value!
Проблема в данном случае заключается в последовательности выполнения кода. Когда вы вызываете echo $testMe
, это происходит до того, как фильтр был применён. Поэтому $testMe
выводит первоначальное значение, установленное в ноль.
Решение проблемы
Чтобы убедиться, что значение сохраняется корректно, вам нужно применить фильтр до вывода переменной. Вот как это можно сделать:
global $testMe;
$testMe = 0;
function my_acf_update_value( $value, $post_id, $field ) {
global $testMe;
$testMe = $value;
return $value;
}
add_filter('acf/update_value/key=field_5308e5e79784b', 'my_acf_update_value', 10, 3);
// Применяем фильтр
apply_filters('acf/update_value/key=field_5308e5e79784b', 'Тестовое значение', 123, 'field_5308e5e79784b');
// Теперь выводим результат
echo $testMe; // Здесь выведется 'Тестовое значение'
Альтернативные решения
Важно отметить, что использование глобальных переменных может привести к путанице в коде и усложнить его обслуживание. Рассмотрите возможность использования статических переменных. Вот пример с использованием статической переменной:
function my_acf_update_value( $value, $post_id, $field ) {
static $var = 0;
if (!empty($value)) {
$var = $value;
}
return $value;
}
add_filter('acf/update_value/key=field_5308e5e79784b', 'my_acf_update_value', 10, 3);
// Применяем фильтр
apply_filters('acf/update_value/key=field_5308e5e79784b', 'Новое значение', 123, 'field_5308e5e79784b');
// Функция для получения сохранённого значения
function get_my_acf_value() {
my_acf_update_value('', 0, ''); // обнуляем для повторного использования
return my_acf_update_value('', 0, ''); // получаем значение
}
// Выводим сохранённое значение
echo get_my_acf_value();
Заключение
При работе с фильтрами в WordPress важно корректно управлять последовательностью выполнения кода, чтобы избежать проблем с доступом к значениям переменных. Использование статических переменных может значительно улучшить структуру вашего кода, делая его более понятным и управляемым. Обязательно проведите тестирование каждого шага, чтобы убедиться в правильности функционирования кода.