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_linkpentru tipuri de postări personalizatepage_linkpentru paginăattachment_linkpentru 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.
Picard
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
birgire
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.
Picard
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.
Picard
Iată lista completă de filtre pentru linkuri: https://codex.wordpress.org/Plugin_API/Filter_Reference#Link_Filters
Juniper Jones
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.
Davey
Mulțumesc pentru informație, te rog să modifici răspunsul după cum este necesar. @Davey
birgire
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.
Davey