Сохраните что-то в глобальную переменную в add_filter

Вопрос или проблема

Я снова здесь с странным вопросом.

Во-первых, я использую плагин 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'

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

  1. Вы добавляете фильтр после того, как хук уже сработал. Поместите этот тест
    apply_filters перед остальным кодом, и это не сработает.
  2. У вас неправильное имя хука.

Кроме того, это должно работать. Однако техника с использованием 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 важно корректно управлять последовательностью выполнения кода, чтобы избежать проблем с доступом к значениям переменных. Использование статических переменных может значительно улучшить структуру вашего кода, делая его более понятным и управляемым. Обязательно проведите тестирование каждого шага, чтобы убедиться в правильности функционирования кода.

Оцените материал
Добавить комментарий

Капча загружается...