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_link
per i post type personalizzatipage_link
per le pagineattachment_link
per 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.

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

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.

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

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.

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

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
.

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

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