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_link
para tipos de entrada personalizadospage_link
para páginasattachment_link
para 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.

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

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.

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

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.

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

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
.

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

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