Cómo filtrar la salida de la función get_permalink()

17 may 2017, 11:05:52
Vistas: 14.9K
Votos: 7

Sé cómo filtrar la salida de la función the_permalink - es así:

add_filter('the_permalink', 'my_the_permalink');
function my_the_permalink($url) {
    return 'http://misitio/mi-enlace/';
}

Y funciona cuando lo uso como: <?php the_permalink($id); ?>, pero quería cambiar el enlace devuelto por la función get_permalink($id). Y este filtro no afecta al enlace permanente devuelto en ese caso.

Intenté capturarlo con:

add_filter('post_link', 'my_get_permalink', 10, 3);
function my_get_permalink($url, $post, $leavename=false) {
    return 'http://misitio/mi-enlace/';
}

Pero este filtro no se ejecuta para get_permalink(). Entonces, ¿cómo puedo alterar los enlaces devueltos por get_permalink()?

2
Comentarios

Sé que puedo definir una función como get_my_permalink() y usarla en lugar de get_permalink() pero me pregunto si puedo hacer esto a un nivel más alto.

Picard Picard
17 may 2017 11:16:33

^ Esa solución funciona genial, solo que genera una advertencia de PHP: PHP Warning: Missing argument 3 for {closure} ()

Stefan Georgiev Andonov Stefan Georgiev Andonov
29 may 2019 15:07:43
Todas las respuestas a la pregunta 2
10
12

Ten en cuenta que el filtro post_link solo funciona para el tipo de entrada post.

Para otros tipos de entrada están disponibles estos filtros:

La función get_permalink() es en realidad un envoltorio para:

  • get_post_permalink()
  • get_attachement_link()
  • get_page_link()

en esos casos.

Aquí hay una forma (no probada) de crear un filtro personalizado wpse_link para todos los casos mencionados de 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 );
}

donde ahora podemos filtrar todos los casos con:

add_filter( 'wpse_link', function(  $url, $post_id, $sample, $type )
{
    return $url;
}, 10, 4 );
17 may 2017 11:17:54
Comentarios

Lo estoy probando en una publicación regular add_filter('post_type_link',... tampoco afecta a get_permalink() en mi caso. Creo que simplemente escribiré mi propia función como get_my_permalink() para envolver el get_permalink() y resolver este "problema" de manera rápida y sencilla.

Picard Picard
17 may 2017 11:26:53

Extraño, ¿ocurre lo mismo en una instalación limpia? ¿Y estás seguro (perdón por preguntar) de que el $id en get_permalink( $id ) es para el tipo de publicación post? @Picard

birgire birgire
17 may 2017 11:46:03

Debería haber sido más específico: es del tipo page, y page_link funciona bien con él. Esperaba algún filtro para todos los tipos de publicaciones como add_filter('get_permalink', ..., pero como no existe, tu respuesta está bien, gracias.

Picard Picard
17 may 2017 11:50:47

ok, actualicé la respuesta con una solución alternativa no probada @Picard

birgire birgire
17 may 2017 12:11:49

Gracias, solo agrega { cuando foreach se abre, aparte de eso funciona genial - permite sobrescribir enlaces tanto para get_permalink() como para the_permalink en publicaciones de tipo página - haré pruebas para otros tipos de publicaciones más adelante.

Picard Picard
17 may 2017 13:08:34

Aquí está la lista completa de filtros de enlaces: https://codex.wordpress.org/Plugin_API/Filter_Reference#Link_Filters

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

Mi biblioteca de medios se rompió con esto. Dice que hay muy pocos argumentos. Para solucionarlo, en la línea 3 agrega un valor predeterminado para sample, $sample = null.

Davey Davey
12 nov 2021 18:31:55

Gracias por el aviso, no dudes en actualizar la respuesta según sea necesario. @Davey

birgire birgire
12 nov 2021 19:07:06

Hice una edición - creo que será ampliamente compatible con versiones de PHP y WP, pero solo se ha probado en mi única instancia.

Davey Davey
15 nov 2021 12:03:59

increíble, gracias @Davey

birgire birgire
15 nov 2021 13:57:25
Mostrar los 5 comentarios restantes
0

Utilizo con éxito esta declaración.

add_filter('post_type_link', function ($post_link, $post, $leavename, $sample) {
  if ($post->post_type == 'mycustomposttype') {
    ...
    $post_link = 'https://mi.sitio.personalizado' . $some_uri;
  }
  return $post_link;
}, 999, 4);
20 nov 2019 12:15:31