Как фильтровать вывод функции get_permalink()
Я знаю, как фильтровать вывод функции the_permalink
- это делается так:
add_filter('the_permalink', 'my_the_permalink');
function my_the_permalink($url) {
return 'http://mysite/my-link/';
}
И это работает, когда я использую: <?PHP the_permalink($id); ?>
, но я хотел изменить ссылку, возвращаемую функцией get_permalink($id)
. И этот фильтр не влияет на возвращаемый пермалинк в этом случае.
Я пытался поймать это с помощью:
add_filter('post_link', 'my_get_permalink', 10, 3);
function my_get_permalink($url, $post, $leavename=false) {
return 'http://mysite/my-link/';
}
Но этот фильтр не срабатывает для get_permalink()
. Так как же я могу изменить ссылки, возвращаемые функцией get_permalink()
?

Обратите внимание, что фильтр post_link
работает только для типа записей post
.
Для других типов записей доступны следующие фильтры:
post_type_link
для пользовательских типов записейpage_link
для страницattachment_link
для вложений
Функция get_permalink()
на самом деле является обёрткой для:
get_post_permalink()
get_attachement_link()
get_page_link()
в соответствующих случаях.
Вот способ (не тестировался) создать пользовательский фильтр wpse_link
для всех вышеперечисленных случаев использования get_permalink()
:
foreach( [ 'post', 'page', 'attachment', 'post_type' ] as $type )
{
add_filter( $type . '_link', function ( $url, $post_id, ? bool $sample = null ) use ( $type )
{
return apply_filters( 'wpse_link', $url, $post_id, $sample, $type );
}, 9999, 3 );
}
Теперь мы можем фильтровать все случаи с помощью:
add_filter( 'wpse_link', function( $url, $post_id, $sample, $type )
{
return $url;
}, 10, 4 );

Я тестирую это на обычной записи add_filter('post_type_link',...
не влияет на get_permalink()
в моём случае. Думаю, я просто напишу свою функцию типа get_my_permalink()
, которая будет оборачивать get_permalink()
, чтобы быстро и просто решить эту "проблему".

Странно, то же самое происходит на чистой установке? И вы уверены (извините за вопрос), что $id
в get_permalink( $id )
относится к типу записи post? @Picard

Мне следовало быть точнее - это тип page
, и page_link
с ним работает нормально. Я ожидал какого-то фильтра для всех типов записей, например add_filter('get_permalink', ...
, но раз его нет, ваш ответ подходит, спасибо.

Спасибо, просто добавьте {
при открытии foreach
, в остальном работает отлично - позволяет переопределять ссылки как для get_permalink()
, так и для the_permalink
для постов типа page - позже протестирую для других типов записей.

Полный список фильтров ссылок: https://codex.wordpress.org/Plugin_API/Filter_Reference#Link_Filters

Моя медиатека перестала работать с этим. Выдаёт ошибку "слишком мало аргументов". Чтобы исправить, на строке 3 добавьте значение по умолчанию для sample: $sample = null
.

Спасибо за подсказку, не стесняйтесь обновлять ответ по мере необходимости. @Davey

Я внес правку - думаю, это будет широко совместимо с версиями PHP и WP, но протестировано только на моём экземпляре.
