Cum să filtrezi output-ul funcției get_permalink() în WordPress
Știu cum să filtrez output-ul funcției the_permalink
- se face astfel:
add_filter('the_permalink', 'my_the_permalink');
function my_the_permalink($url) {
return 'http://mysite/my-link/';
}
Și funcționează când o folosesc astfel: <?php the_permalink($id); ?>
, dar am vrut să modific link-ul returnat de funcția get_permalink($id)
. Și acest filtru nu afectează permalink-ul returnat în acest caz.
Am încercat să-l prind cu:
add_filter('post_link', 'my_get_permalink', 10, 3);
function my_get_permalink($url, $post, $leavename=false) {
return 'http://mysite/my-link/';
}
Dar acest filtru nu se activează pentru get_permalink()
. Deci cum pot modifica link-urile returnate de get_permalink()
?

Rețineți că filtrul post_link
este doar pentru tipul de postare post
.
Pentru alte tipuri de postări sunt disponibile următoarele filtre:
post_type_link
pentru tipuri de postări personalizatepage_link
pentru paginăattachment_link
pentru atașament
Funcția get_permalink()
este de fapt un wrapper pentru:
get_post_permalink()
get_attachement_link()
get_page_link()
în acele cazuri.
Iată o metodă (netestată) pentru a crea un filtru personalizat wpse_link
pentru toate cazurile menționate ale 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 );
}
unde acum putem filtra toate cazurile cu:
add_filter( 'wpse_link', function( $url, $post_id, $sample, $type )
{
return $url;
}, 10, 4 );

Testez pe un post obișnuit add_filter('post_type_link',...
nu afectează get_permalink()
nici pentru mine. Cred că voi scrie propria mea funcție precum get_my_permalink()
care să înfășoare get_permalink()
pentru a rezolva această "problemă" rapid și ușor.

Ciudat, se întâmplă același lucru într-o instalare vanilla? și ești sigur (îmi pare rău că întreb asta) că $id
din get_permalink( $id )
este pentru tipul de post post? @Picard

Trebuia să fiu mai specific - este de tip page
, iar page_link
funcționează bine cu el. Mă așteptam la un filtru pentru toate tipurile de postări precum add_filter('get_permalink', ...
, dar din moment ce nu există, răspunsul tău este bun, mulțumesc.

Mulțumesc, doar adaugă {
când foreach
începe, în afară de asta funcționează perfect - permite suprascrierea linkurilor atât pentru get_permalink()
cât și pentru the_permalink
pentru postări de tip pagină - voi testa pentru alte tipuri de postări mai târziu.

Iată lista completă de filtre pentru linkuri: https://codex.wordpress.org/Plugin_API/Filter_Reference#Link_Filters

Biblioteca mea de fișiere media a avut probleme cu asta, afișând eroarea de argumente insuficiente. Pentru a remedia, pe linia 3 adaugă o valoare implicită pentru sample, $sample = null
.

Mulțumesc pentru informație, te rog să modifici răspunsul după cum este necesar. @Davey

Am făcut o modificare - cred că va fi compatibilă cu majoritatea versiunilor de php și WP, dar a fost testată doar pe instanța mea.
