Удаляется ли хук таким образом и как это можно проверить?
Удаляется ли хук таким образом и как это можно проверить?
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; } );
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

В показанном виде хук не удаляется. Причина в том, что в
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); });
Этот код выглядит симметрично, но не удаляет первый 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; });
Еще проще и надежнее использовать именованную функцию:
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 удален'); }
Для анонимной функции проверка тоже возможна, но только если у вас есть сохраненная переменная с этой функцией:
has_filter('upload_dir', $upload_dir_filter). Без сохраненной ссылки проверить или удалить конкретный anonymous callback нормально нельзя.