Удаляется ли хук таким образом и как это можно проверить?

Ссылка скопирована
C#
1 ответ

Удаляется ли хук таким образом и как это можно проверить?

add_filter( 'wp_handle_upload', function( $file ) {     remove_filter( 'upload_dir', function( $uploads ) {         return my_func( $uploads );     } );      return $file; } );

add_filter( 'wp_handle_upload', function( $file ) { remove_filter( 'upload_dir', function( $uploads ) { return my_func( $uploads ); } ); return $file; } );

Дополнительно:

Удаляется ли хук таким образом и как это можно проверить?

Семён Окулов @scoffs Frontend | C# | Student Хук удаляется

Проверить можно так:
Вы можете использовать функцию has_filter для проверки наличия хука upload_dir после вызова remove_filter.

if ( ! has_filter( 'upload_dir', 'my_func' ) ) {     echo 'Хук upload_dir успешно удален.'; } else {     echo 'Не удалось удалить хук upload_dir.'; }

if ( ! has_filter( 'upload_dir', 'my_func' ) ) { echo 'Хук upload_dir успешно удален.'; } else { echo 'Не удалось удалить хук upload_dir.'; }

  • Семён Окулов, Семён, просто у wp-kama написано, что анонимная функция не удаляется. Я немного запутался, ведь здесь используются, именно, анонимные функции? Если можно, немного разверните свой ответ, чтобы я понял матчасть. Спасибо!
  • Shimpanze, при использовании функции remove_filter для удаления хука, анонимные функции могут быть удалены, но существует некоторая особенность, связанная с сохранением ссылки на анонимную функцию.

    Вы используете анонимные функции внутри add_filter и remove_filter. Принципиально, анонимные функции могут быть удалены с помощью remove_filter, но есть одно ограничение: ссылка на анонимную функцию должна быть сохранена, чтобы ее можно было удалить позже с помощью remove_filter.

    Если тот вариант не работает, то может использовать именованную функцию?

    function my_upload_dir( $uploads ) {     return my_func( $uploads ); }  add_filter( 'wp_handle_upload', function( $file ) {     remove_filter( 'upload_dir', 'my_upload_dir' );      return $file; } );

    function my_upload_dir( $uploads ) { return my_func( $uploads ); } add_filter( 'wp_handle_upload', function( $file ) { remove_filter( 'upload_dir', 'my_upload_dir' ); return $file; } );

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Стас DB Ответ

В показанном виде хук не удаляется. Причина в том, что в add_filter() и remove_filter() передаются две разные анонимные функции. Даже если их код одинаковый, для PHP это два разных объекта Closure, поэтому WordPress не сможет найти ранее добавленный callback.

add_filter('upload_dir', function ($uploads) {
    return my_func($uploads);
});
 
remove_filter('upload_dir', function ($uploads) {
    return my_func($uploads);
});

add_filter('upload_dir', function ($uploads) { return my_func($uploads); }); remove_filter('upload_dir', function ($uploads) { return my_func($uploads); });

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

$upload_dir_filter = function ($uploads) {
    return my_func($uploads);
};
 
add_filter('upload_dir', $upload_dir_filter);
 
add_filter('wp_handle_upload', function ($file) use ($upload_dir_filter) {
    remove_filter('upload_dir', $upload_dir_filter);
    return $file;
});

$upload_dir_filter = function ($uploads) { return my_func($uploads); }; add_filter('upload_dir', $upload_dir_filter); add_filter('wp_handle_upload', function ($file) use ($upload_dir_filter) { remove_filter('upload_dir', $upload_dir_filter); return $file; });

Еще проще и надежнее использовать именованную функцию:

function my_upload_dir_filter($uploads) {
    return my_func($uploads);
}
 
add_filter('upload_dir', 'my_upload_dir_filter');
 
add_filter('wp_handle_upload', function ($file) {
    remove_filter('upload_dir', 'my_upload_dir_filter');
    return $file;
});

function my_upload_dir_filter($uploads) { return my_func($uploads); } add_filter('upload_dir', 'my_upload_dir_filter'); add_filter('wp_handle_upload', function ($file) { remove_filter('upload_dir', 'my_upload_dir_filter'); return $file; });

Проверить наличие фильтра можно через has_filter():

if (false === has_filter('upload_dir', 'my_upload_dir_filter')) {
    error_log('Фильтр upload_dir удален');
}

if (false === has_filter('upload_dir', 'my_upload_dir_filter')) { error_log('Фильтр upload_dir удален'); }

Для анонимной функции проверка тоже возможна, но только если у вас есть сохраненная переменная с этой функцией: has_filter('upload_dir', $upload_dir_filter). Без сохраненной ссылки проверить или удалить конкретный anonymous callback нормально нельзя.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно