Evitar enlaces permanentes numéricos en WordPress con esta función
Si no incluimos un título antes de guardar el artículo como borrador o publicarlo, WordPress añade automáticamente el post_name (o slug) numérico basado en el id del artículo. Sabes a qué me refiero, ¿verdad?
El caso es que, en algunas ocasiones nos olvidamos de editar el slug antes de publicar nuestro artículo y claro, queda tremendamente feo un slug numérico (y no es que ayude mucho al SEO, por ejemplo).
Por eso, he creado esta función, que se encarga de reescribir el slug en el momento que guardamos o publicamos el post:
/*
* Rewrite post_name (slug) before publish it using
* WordPress function.
*/
// initial hook
add_action( 'save_post', 'rewrite_post_name' );
function rewrite_post_name( $post_id ) {
// verify post is not a revision
if ( ! wp_is_post_revision( $post_id ) ) {
// unhook this function to prevent infinite looping
remove_action( 'save_post', 'rewrite_post_name' );
$post_name = get_post_meta ( $post_id, 'post_name' );
$post_id2 = $post_id . "-2";
if( $post_name === $post_id || $post_name === $post_id2 ){
// update the post slug
wp_update_post( array(
'ID' => $post_id,
'post_name' => '' // Rewrite based on Post Title
));
}
// re-hook this function
add_action( 'save_post', 'rewrite_post_name' );
}
}
Lenguaje del código: PHP (php)
Explicándola paso a paso, tendríamos algo tal que así:
- Primero, añadimos la llamada a la función que re-escribe el slug al hook «save_post»; lo que hará que cada vez que guardemos un post se invoque a dicha función.
- A continuación creamos la función encargada de re-escribir el slug.
- Comprueba que no es una revisión, no nos interesa hacer esta comprobación para todas las revisiones.
- Recogemos los datos en dos variables: Por un lado el post_name (o slug) actual del artículo, por otro agregamos un -2 al post_id original por si es un artículo previamente descartado. Esto suele ocurrir en WordPress.
- A continuación hacemos la actualización del campo post_name sólo si el actual post_name (o slug) es igual al ID del post o al ID del post seguido de un «-2».
- Las líneas donde desenganchamos el hook save_post y lo reenganchamos no es necesario que entendáis por qué están ahí; pero -en resumen- evitan que entremos en un bucle infinito de actualización del campo post_name.
Esta función la puedes utilizar en tu instalación de WordPress copiándola en el functions.php de tu tema.