Come filtrare l'output della funzione get_permalink()

17 mag 2017, 11:05:52
Visualizzazioni: 14.9K
Voti: 7

So come filtrare l'output della funzione the_permalink - è così:

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

E funziona quando la uso così: <?php the_permalink($id); ?>, ma volevo cambiare il link restituito dalla funzione get_permalink($id). E questo filtro non influisce sul permalink restituito in quel caso.

Ho provato a intercettarlo con:

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

Ma questo filtro non viene attivato per get_permalink(). Quindi come posso modificare i link restituiti da get_permalink()?

2
Commenti

So che posso definire una funzione come get_my_permalink() e usarla invece di get_permalink() ma mi chiedo se posso farlo a un livello più alto.

Picard Picard
17 mag 2017 11:16:33

^ Questa soluzione funziona benissimo, ma genera un avviso PHP: PHP Warning: Missing argument 3 for {closure} ()

Stefan Georgiev Andonov Stefan Georgiev Andonov
29 mag 2019 15:07:43
Tutte le risposte alla domanda 2
10
12

Nota che il filtro post_link è valido solo per il tipo di post post.

Per altri tipi di post sono disponibili questi filtri:

La funzione get_permalink() è in realtà un wrapper per:

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

in questi casi.

Ecco un modo (non testato) per creare un filtro personalizzato wpse_link per tutti i casi sopra citati di 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 );
}

dove ora possiamo filtrare tutti i casi con:

add_filter( 'wpse_link', function(  $url, $post_id, $sample, $type )
{
    return $url;
}, 10, 4 );
17 mag 2017 11:17:54
Commenti

Lo sto testando su un post normale add_filter('post_type_link',... non influisce su get_permalink() neanche per me. Penso che scriverò semplicemente la mia funzione come get_my_permalink() per racchiudere get_permalink() per risolvere questo "problema" in modo rapido e semplice.

Picard Picard
17 mag 2017 11:26:53

Strano, succede lo stesso su un'installazione vanilla? E sei sicuro (scusa per la domanda) che l'$id in get_permalink( $id ) sia per il post type post? @Picard

birgire birgire
17 mag 2017 11:46:03

Avrei dovuto essere più specifico - è di tipo page, e page_link funziona bene con esso. Mi aspettavo qualche filtro per tutti i post type come add_filter('get_permalink', ..., ma dato che non c'è la tua risposta va bene, grazie.

Picard Picard
17 mag 2017 11:50:47

ok, ho aggiornato la risposta con una soluzione alternativa non testata @Picard

birgire birgire
17 mag 2017 12:11:49

Grazie, basta aggiungere { quando si apre il foreach, a parte questo funziona perfettamente - permette di sovrascrivere i link sia per get_permalink() che per the_permalink per i post di tipo page - farò test per altri tipi di post più tardi.

Picard Picard
17 mag 2017 13:08:34

Ecco la lista completa dei filtri per i link: https://codex.wordpress.org/Plugin_API/Filter_Reference#Link_Filters

Juniper Jones Juniper Jones
13 ott 2018 21:04:01

La mia libreria multimediale si è rotta con questo. Dice che ci sono troppi pochi argomenti. Per risolvere, alla riga 3 aggiungi un valore predefinito per sample, $sample = null.

Davey Davey
12 nov 2021 18:31:55

Grazie per la segnalazione, sentiti libero di aggiornare la risposta se necessario. @Davey

birgire birgire
12 nov 2021 19:07:06

Ho apportato una modifica - penso che sarà ampiamente compatibile con le versioni di PHP e WP ma è stato testato solo sulla mia istanza.

Davey Davey
15 nov 2021 12:03:59

fantastico, grazie @Davey

birgire birgire
15 nov 2021 13:57:25
Mostra i restanti 5 commenti
0

Utilizzo con successo questa dichiarazione.

add_filter('post_type_link', function ($post_link, $post, $leavename, $sample) {
  if ($post->post_type == 'mycustomposttype') {
    ...
    $post_link = 'https://my.custom.site' . $some_uri;
  }
  return $post_link;
}, 999, 4);
20 nov 2019 12:15:31