Cómo filtrar la salida de la función get_permalink()
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()?
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:
post_type_linkpara tipos de entrada personalizadospage_linkpara páginasattachment_linkpara archivos adjuntos
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 );
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
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
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
ok, actualicé la respuesta con una solución alternativa no probada @Picard
birgire
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
Aquí está la lista completa de filtros de enlaces: https://codex.wordpress.org/Plugin_API/Filter_Reference#Link_Filters
Juniper Jones
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
Gracias por el aviso, no dudes en actualizar la respuesta según sea necesario. @Davey
birgire
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