Как фильтровать вывод функции 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(), чтобы быстро и просто решить эту "проблему".
Picard
Странно, то же самое происходит на чистой установке? И вы уверены (извините за вопрос), что $id в get_permalink( $id ) относится к типу записи post? @Picard
birgire
Мне следовало быть точнее - это тип page, и page_link с ним работает нормально. Я ожидал какого-то фильтра для всех типов записей, например add_filter('get_permalink', ..., но раз его нет, ваш ответ подходит, спасибо.
Picard
Спасибо, просто добавьте { при открытии foreach, в остальном работает отлично - позволяет переопределять ссылки как для get_permalink(), так и для the_permalink для постов типа page - позже протестирую для других типов записей.
Picard
Полный список фильтров ссылок: https://codex.wordpress.org/Plugin_API/Filter_Reference#Link_Filters
Juniper Jones
Моя медиатека перестала работать с этим. Выдаёт ошибку "слишком мало аргументов". Чтобы исправить, на строке 3 добавьте значение по умолчанию для sample: $sample = null.
Davey
Спасибо за подсказку, не стесняйтесь обновлять ответ по мере необходимости. @Davey
birgire
Я внес правку - думаю, это будет широко совместимо с версиями PHP и WP, но протестировано только на моём экземпляре.
Davey