Te explico como encontrar y editar una página, entrada, categoría o etiqueta de WordPress usando su Permalink. La solución final la he implementado en un plugin que puedes descargar haciendo clic en este botón:
¿Qué hace este plugin?
- Añade una nueva caja de búsqueda en la sección Herramientas > Permalink Search
- Puedes introducir el Permalink en la caja de búsqueda y te llevará directamente a la página, entrada, tag o categoría en cuestión, para que puedas editarla.
¿Para qué es útil esta funcionalidad?
Si tienes una web con cientos o miles de URLs en la que algunas de esas URLs están redirigidas hacia otras, no podrás acceder a las opciones de edición de la URL original, y tendrás que buscarla manualmente. Por desgracia, el buscador interno de WordPress es conocido por los malos resultados que arroja, y buscar una entrada o página puede convertirse en una tarea tediosa y a veces infructuosa.
Con este código podemos solventar el problema y conseguir editar directamente una página, entrada, categoría o etiqueta, introduciendo su Permalink. Al hacerlo, la función buscará el ID de la página o entrada y cargará el editor de ese contenido.
Cómo implementar tú mismo la solución
Si prefieres no instalar el plugin, te explico como añadir el código necesario para implementar esta nueva funcionalidad. Siéntete libre de modificarlo y redistribuirlo. Solo te pido que mantengas la autoría y URL original (la de esta página), no lo vendas, compártelo gratuitamente. ¡Gracias!
- Tiempo de implementación: 5/7 min
- Nivel de dificultad: Fácil
Crear el directorio y los ficheros para el plugin
Crea un directorio para tu plugin en el directorio wp-content/plugins
de tu instalación de WordPress. Por ejemplo, podrías llamar a tu directorio permalink-search-plugin
.
Dentro de este directorio, crea un archivo llamado permalink-search-plugin.php
y otro llamado script.js
Contenido de permalink-search-plugin.php
En el archivo permalink-search-plugin.php
, agrega el siguiente código:
<?php
/**
* Plugin Name: WP Permalink Search
* Description: Añade una funcionalidad para buscar páginas y entradas por permalink.
* Version: 0.3
* Author: Daniel Pajuelo
* URL: https://danielpajuelo.com/encontrar-entradas-paginas-wordpress-permalink
*/
function psp_enqueue_scripts($hook) {
if ('tools_page_permalink-search' != $hook) {
return;
}
wp_enqueue_script('psp-script', plugin_dir_url(__FILE__) . 'script.js', array('jquery'), null, true);
wp_localize_script('psp-script', 'psp_params', array(
'ajaxurl' => admin_url('admin-ajax.php')
));
}
add_action('admin_enqueue_scripts', 'psp_enqueue_scripts');
function psp_ajax_handler() {
global $wpdb;
$permalink = $_POST['permalink'];
$permalink = esc_url($permalink);
$post_id = url_to_postid($permalink);
if ($post_id) {
wp_send_json_success(admin_url('post.php?post=' . $post_id . '&action=edit'));
} else {
$slug = basename($permalink);
$path_parts = explode('/', trim(parse_url($permalink, PHP_URL_PATH), '/'));
if(count($path_parts) == 1) {
$term = get_term_by('slug', $slug, '');
if ($term) {
wp_send_json_success(admin_url('term.php?taxonomy=' . $term->taxonomy . '&tag_ID=' . $term->term_id));
} else {
wp_send_json_error("Slug simple: [$slug]. No se encontró como entrada, página, categoría ni etiqueta.");
}
} else {
$parent_slug = $path_parts[count($path_parts) - 2];
$parent_term = get_term_by('slug', $parent_slug, '');
$term = get_term_by('slug', $slug, '');
if($term && $parent_term) {
$term_hierarchy = get_ancestors($term->term_id, $term->taxonomy, 'taxonomy');
if(in_array($parent_term->term_id, $term_hierarchy)) {
wp_send_json_success(admin_url('term.php?taxonomy=' . $term->taxonomy . '&tag_ID=' . $term->term_id));
} else {
wp_send_json_error("URL jerárquica: [$permalink]. La jerarquía de términos no es consistente ({$term->name} no es hijo de {$parent_term->name}).");
}
} else {
wp_send_json_error("URL jerárquica: [$permalink]. No se encontró la categoría/etiqueta para los slugs [$slug] o [$parent_slug].");
}
}
}
wp_die();
}
// Función para añadir la página de herramientas
function psp_add_tools_page() {
add_management_page(
'Buscar por Permalink',
'Permalink Search',
'manage_options',
'permalink-search',
'psp_render_tools_page'
);
}
// Función para renderizar la página de herramientas
function psp_render_tools_page() {
?>
<div class="wrap">
<h2>Buscar por Permalink</h2>
<p>Introduce el Permalink de la página o entrada que quieres editar y haz clic en buscar.</p>
<input type="text" id="psp_permalink" placeholder="Buscar por permalink">
<button type="button" id="psp_search_button">Buscar por Permalink</button>
</div>
<?php
}
add_action('admin_menu', 'psp_add_tools_page');
add_action('wp_ajax_psp_search_permalink', 'psp_ajax_handler');
Contenido de script.js
Agrega el siguiente código al fichero scripts.js:
jQuery(document).ready(function($) {
$('#psp_search_button').on('click', function() {
var permalink = $('#psp_permalink').val();
$.post(psp_params.ajaxurl, {
action: 'psp_search_permalink',
permalink: permalink
}, function(response) {
if (response.success) {
window.location.href = response.data;
} else {
alert(response.data);
}
});
});
});
Con esto, tendrás una nueva caja de búsqueda debajo de la caja de búsqueda existente en la página de listado de entradas y páginas. Cuando ingreses un permalink y hagas clic en «Buscar por Permalink», la función AJAX buscará la entrada o página correspondiente y te redireccionará a la página de edición de esa entrada o página.
Qué hace este código
- Un usuario inserta un permalink en la caja de texto y hace clic en «Buscar por Permalink».
- El archivo
script.js
envía este permalink al servidor mediante una solicitud AJAX. - En el servidor,
psp_ajax_handler
busca en la base de datos de WordPress una entrada o página que coincida con el slug proporcionado y devuelve un enlace a la página de edición de esa entrada/página o un mensaje de error. script.js
recibe esta respuesta, y según sea exitosa o no, redirecciona al usuario a la página de edición correspondiente o muestra un mensaje de error.
Notas sobre la versión actual
- Funciona correctamente con entradas y posts
- Se han encontrado bugs cuando se trata de categorías anidadas. Lo corregiré en la siguiente revisión