web-dev-qa-db-fra.com

Commentaire filtré de la fonction get_permalink ()

Je sais comment filtrer la sortie de la fonction the_permalink - c'est comme ça:

add_filter('the_permalink', 'my_the_permalink');
function my_the_permalink($url) {
    return 'http://mysite/my-link/';
}

Et ça marche quand je l’utilise comme: <?PHP the_permalink($id); ?>, mais je voulais changer le lien retourné par la fonction get_permalink($id). Et ce filtre n'affecte pas le permalien retourné dans ce cas.

J'essayais de l'attraper avec:

add_filter('post_link', 'my_get_permalink', 10, 3);
function my_get_permalink($url, $post, $leavename=false) {
    return 'http://mysite/my-link/';
}

Mais ce filtre n'est pas déclenché pour la get_permalink(). Alors, comment puis-je modifier les liens renvoyés par la get_permalink()?

2
Picard

Notez que le filtre post_link ne concerne que le type d'article post.

Pour les autres types post ces filtres sont disponibles:

La fonction get_permalink() est en réalité un wrapper pour:

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

dans ces cas.

Voici un moyen (non testé) de créer un filtre wpse_link personnalisé pour tous les cas susmentionnés de get_permalink():

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 );
}

où nous pouvons maintenant filtrer tous les cas avec:

add_filter( 'wpse_link', function(  $url, $post_id, $sample, $type )
{
    return $url;
}, 10, 4 );
3
birgire