Este código PHP implementa un plugin para WordPress llamado Meta Updater, el cual permite a los administradores actualizar metadatos (título y descripción) de las publicaciones basadas en una lista de URLs proporcionada. A continuación se explica cada sección del código:
1. Creación de la Página de Configuración en el Menú de Administración
La función meta_updater_options_page
agrega un nuevo elemento de menú en el panel de administración de WordPress. Esto permite a los administradores acceder a la página donde pueden introducir una lista de URLs para procesar y monitorear el progreso de la actualización.
phpCopiar códigoadd_action('admin_menu', 'meta_updater_options_page');
function meta_updater_options_page() {
add_menu_page(
'Meta Updater',
'Meta Updater',
'manage_options',
'meta-updater',
'meta_updater_page_html',
'dashicons-update',
20
);
}
2. Interfaz de Usuario en el Panel de Administración
La función meta_updater_page_html
genera el formulario para ingresar las URLs y muestra el progreso de la actualización. Al enviar el formulario, las URLs se guardan en las opciones de WordPress. También proporciona un botón "Continuar Actualización" que llama a la función JavaScript continueUpdating
para iniciar la actualización en segundo plano mediante AJAX.
phpCopiar códigofunction meta_updater_page_html() {
if (!current_user_can('manage_options')) {
return;
}
if (isset($_POST['meta_updater_action'])) {
$urls = isset($_POST['meta_updater_urls']) ? explode(',', sanitize_text_field($_POST['meta_updater_urls'])) : [];
update_option('meta_updater_urls', $urls);
update_option('meta_updater_current_index', 0);
update_option('meta_updater_progress', 'Processing...');
}
$progress = get_option('meta_updater_progress', 'Not started');
?>
<div class="wrap">
<h1><?php echo esc_html(get_admin_page_title()); ?></h1>
<form method="post">
<textarea name="meta_updater_urls" rows="10" cols="50" placeholder="Insert URLs separated by commas"><?php echo implode(',', (array)get_option('meta_updater_urls', [])); ?></textarea><br>
<button type="submit" class="button button-primary" name="meta_updater_action" value="1">Start Updating</button>
</form>
<hr>
<h2>Progress</h2>
<p><?php echo esc_html($progress); ?></p>
<button id="meta_updater_continue" class="button button-secondary">Continue Updating</button>
<div id="meta_updater_message"></div>
</div>
3. JavaScript para Continuar la Actualización con AJAX
Al hacer clic en el botón "Continue Updating", se envía una solicitud AJAX a admin-ajax.php
para procesar la siguiente URL en la lista, llamando a la acción meta_updater_process_next
.
javascriptCopiar código <script type="text/javascript">
document.getElementById('meta_updater_continue').addEventListener('click', function() {
this.disabled = true;
continueUpdating();
});
async function continueUpdating() {
let response = await fetch('<?php echo admin_url('admin-ajax.php?action=meta_updater_process_next'); ?>');
let result = await response.text();
document.getElementById('meta_updater_message').innerHTML = result;
document.getElementById('meta_updater_continue').disabled = false;
}
</script>
4. Función para Procesar URLs Individuales mediante AJAX
La función meta_updater_process_next
procesa una URL en la lista, extrayendo los metadatos de la página web para actualizar los valores en WordPress:
- Obtiene la lista de URLs y el índice actual desde las opciones.
- Verifica si el índice ha alcanzado el número de URLs. Si es así, marca el proceso como completado.
- Para la URL actual, busca el
post_id
correspondiente en WordPress. - Si el
post_id
es válido, realiza una solicitud a la URL y extrae los metadatos (title
ydescription
) desde el HTML. - Actualiza los metadatos en WordPress utilizando
update_post_meta
. - Incrementa el índice y actualiza el progreso.
phpCopiar códigoadd_action('wp_ajax_meta_updater_process_next', 'meta_updater_process_next');
function meta_updater_process_next() {
$urls = get_option('meta_updater_urls', []);
$current_index = get_option('meta_updater_current_index', 0);
if ($current_index >= count($urls)) {
echo "All URLs processed!";
update_option('meta_updater_progress', 'Completed');
wp_die();
}
$url = $urls[$current_index];
$post_id = url_to_postid($url);
if ($post_id) {
$meta_title = get_post_meta($post_id, '_genesis_title', true);
$meta_description = get_post_meta($post_id, '_genesis_description', true);
$response = wp_remote_get($url);
if (!is_wp_error($response)) {
$html = wp_remote_retrieve_body($response);
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
libxml_clear_errors();
$metaElements = $dom->getElementsByTagName('meta');
foreach ($metaElements as $metaElement) {
if ($metaElement->getAttribute('name') === 'title' || $metaElement->getAttribute('property') === 'og:title') {
$meta_title = $metaElement->getAttribute('content');
}
if ($metaElement->getAttribute('name') === 'description' || $metaElement->getAttribute('property') === 'og:description') {
$meta_description = $metaElement->getAttribute('content');
}
}
update_post_meta($post_id, '_genesis_title', $meta_title);
update_post_meta($post_id, '_genesis_description', $meta_description);
echo "Processed URL: " . esc_html($url);
} else {
echo "Failed to fetch the URL: " . esc_html($url);
}
} else {
echo "No post found for URL: " . esc_html($url);
}
$current_index++;
update_option('meta_updater_current_index', $current_index);
update_option('meta_updater_progress', "Processed $current_index of " . count($urls) . " URLs");
wp_die();
}
Resumen del Proceso Completo
- Inicio de actualización: El usuario ingresa una lista de URLs en el formulario del panel de administración.
- Procesamiento: Con cada clic en "Continuar Actualización", se procesa una URL a la vez.
- Extracción de Metadatos: Se extraen el título y la descripción de la página web de la URL.
- Actualización de Metadatos: Se actualizan los metadatos en el post de WordPress correspondiente.
- Progreso: Se muestra el progreso de la actualización, indicando la cantidad de URLs procesadas.
Este plugin es útil para actualizar masivamente los metadatos de las publicaciones en WordPress, sincronizando la información de las URLs externas de manera eficiente y sin necesidad de hacer modificaciones manuales para cada entrada.