Come filtrare l'output della funzione get_permalink()
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()?
Nota che il filtro post_link è valido solo per il tipo di post post.
Per altri tipi di post sono disponibili questi filtri:
post_type_linkper i post type personalizzatipage_linkper le pagineattachment_linkper i media allegati
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 );
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
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
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
ok, ho aggiornato la risposta con una soluzione alternativa non testata @Picard
birgire
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
Ecco la lista completa dei filtri per i link: https://codex.wordpress.org/Plugin_API/Filter_Reference#Link_Filters
Juniper Jones
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
Grazie per la segnalazione, sentiti libero di aggiornare la risposta se necessario. @Davey
birgire
Ho apportato una modifica - penso che sarà ampiamente compatibile con le versioni di PHP e WP ma è stato testato solo sulla mia istanza.
Davey