web-dev-qa-db-ja.com

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()によって返されたリンクを変更することができますか?

2
Picard

post_linkフィルタはpost投稿タイプ専用です。

他の投稿タイプではこれらのフィルタが利用可能です:

get_permalink()functionは、実際には以下のラッパーです。

  • get_post_permalink()
  • get_attachement_link()
  • get_page_link()

そのような場合には。

上記のget_permalink()のすべてのケースに対してカスタムのwpse_linkフィルタを作成する方法(未テスト)は次のとおりです。

foreach( [ 'post', 'page', 'attachment', 'post_type' ] as $type )
{
    add_filter( $type . '_link', function ( $url, $post_id, $sample ) 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 );
3
birgire