Cum să filtrezi output-ul funcției get_permalink() în WordPress

17 mai 2017, 11:05:52
Vizualizări: 14.9K
Voturi: 7

Ș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()?

2
Comentarii

Știu că pot defini o funcție ca get_my_permalink() și să o folosesc în loc de get_permalink(), dar mă întreb dacă pot face asta la un nivel superior.

Picard Picard
17 mai 2017 11:16:33

^ Această soluție funcționează excelent, dar generează o avertizare PHP: PHP Warning: Missing argument 3 for {closure} ()

Stefan Georgiev Andonov Stefan Georgiev Andonov
29 mai 2019 15:07:43
Toate răspunsurile la întrebare 2
10
12

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:

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 );
17 mai 2017 11:17:54
Comentarii

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 Picard
17 mai 2017 11:26:53

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 birgire
17 mai 2017 11:46:03

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 Picard
17 mai 2017 11:50:47

ok, am actualizat răspunsul cu o soluție netestată @Picard

birgire birgire
17 mai 2017 12:11:49

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 Picard
17 mai 2017 13:08:34

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

Juniper Jones Juniper Jones
13 oct. 2018 21:04:01

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 Davey
12 nov. 2021 18:31:55

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

birgire birgire
12 nov. 2021 19:07:06

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 Davey
15 nov. 2021 12:03:59

super, mulțumesc @Davey

birgire birgire
15 nov. 2021 13:57:25
Arată celelalte 5 comentarii
0

Folosesc cu succes această declarație.

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