¿Te encuentras frustrado porque el orden de tus posts personalizados no se refleja en todas las traducciones?
Este es un problema común para muchos usuarios de WordPress que utilizan plugins como Post Types Order y Simple Custom Post Order.
Cuando organizas tus entradas utilizando arrastrar y soltar, es desalentador ver que este orden no se refleja en las traducciones de otros idiomas. Esto es especialmente problemático si usas WPML para gestionar un sitio multilingüe.
Aquí te traemos una solución simple y efectiva para sincronizar el orden de tus posts entre diferentes idiomas de forma rápida y eficiente.
Code Snippet para sincronizar el orden de las entradas entre idiomas
Este fragmento de código te permitirá sincronizar el orden de tus entradas personalizados entre todos los idiomas. La optimización asegura que solo se actualicen la entrada cuyo orden ha cambiado, mejorando significativamente el tiempo de sincronización.
Paso 1: Instalar el Plugin Code Snippets
Para utilizar este código, primero debes instalar el plugin Code Snippets. Este plugin te permite agregar fácilmente fragmentos de código a tu sitio de WordPress sin necesidad de modificar directamente el archivo functions.php de tu tema.
Paso 2: Crear un Nuevo Fragmento
- Una vez que el plugin Code Snippets esté instalado y activado, ve al menú «Snippets» en tu panel de administración de WordPress.
- Haz clic en «Add New» para crear un nuevo fragmento.
- Dale un título a tu fragmento, por ejemplo, «Sincronizar Orden de Posts entre Idiomas».
Paso 3: Añadir el Código para el Botón de Sincronización
Copia y pega el siguiente código en el área de código del nuevo fragmento. Este código agrega un botón para sincronizar el orden en la lista de posts personalizados.
add_action('admin_notices', 'add_sync_order_button');
function add_sync_order_button() {
global $typenow;
// Obtener el idioma actual y el idioma por defecto
$current_language = apply_filters('wpml_current_language', NULL);
$default_language = apply_filters('wpml_default_language', NULL);
if ($typenow && $current_language == $default_language) {
echo '<div class="notice notice-info is-dismissible">';
echo '<p><button id="sync-order-button" class="button button-primary">Sincronizar Orden en Otros Idiomas</button></p>';
echo '</div>';
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
$('#sync-order-button').on('click', function(e) {
e.preventDefault();
var $button = $(this);
$button.prop('disabled', true).text('Sincronizando...');
var data = {
'action': 'sync_menu_order_across_languages',
'post_type': '<?php echo $typenow; ?>'
};
$.post(ajaxurl, data, function(response) {
if(response.success) {
alert('Orden sincronizado en todos los idiomas.');
} else {
alert('Error al sincronizar el orden: ' + response.data);
}
$button.prop('disabled', false).text('Sincronizar Orden en Otros Idiomas');
});
});
});
</script>
<?php
}
}
Paso 4: Añadir el Código para la Sincronización del Orden
A continuación, copia y pega este segundo fragmento de código en el mismo área de código del nuevo fragmento. Este código maneja la sincronización del orden de los posts.
add_action('wp_ajax_sync_menu_order_across_languages', 'sync_menu_order_across_languages');
function sync_menu_order_across_languages() {
if (!current_user_can('edit_posts')) {
wp_send_json_error('No tienes permisos suficientes.');
return;
}
$post_type = $_POST['post_type'];
// Verificar que el tipo de post sea válido
if (!$post_type) {
wp_send_json_error('Tipo de post no válido.');
return;
}
// Obtener todos los posts del tipo en el idioma original (español)
$args = array(
'post_type' => $post_type,
'posts_per_page' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
'suppress_filters' => false,
'lang' => 'es' // Ajustar al código de idioma del español
);
$posts = get_posts($args);
if (empty($posts)) {
wp_send_json_error('No se encontraron posts.');
return;
}
// Obtener todos los idiomas activos
$languages = apply_filters('wpml_active_languages', NULL, 'orderby=id&order=desc');
global $wpdb;
// Desactivar el filtro de sincronización de WPML temporalmente
remove_all_filters('wpml_sync_post_action');
$errors = array();
// Iniciar la transacción
$wpdb->query('START TRANSACTION');
// Recorrer todos los posts en el orden actualizado
foreach ($posts as $post) {
$menu_order = $post->menu_order;
// Sincronizar el valor de menu_order en todos los idiomas
foreach ($languages as $lang) {
if ($lang['language_code'] !== 'es') { // Omitir el español
$translated_post_id = apply_filters('wpml_object_id', $post->ID, $post_type, false, $lang['language_code']);
if ($translated_post_id && $translated_post_id != $post->ID) {
// Obtener el valor actual de menu_order de la traducción
$current_menu_order = get_post_field('menu_order', $translated_post_id);
// Actualizar solo si el menu_order es diferente
if ($current_menu_order != $menu_order) {
$update_result = wp_update_post(array(
'ID' => $translated_post_id,
'menu_order' => $menu_order
));
// Verificar si la actualización fue exitosa
if (is_wp_error($update_result)) {
$errors[] = $update_result->get_error_message();
}
}
}
}
}
}
// Verificar si hubo errores
if (empty($errors)) {
$wpdb->query('COMMIT');
wp_send_json_success('Orden sincronizado correctamente.');
} else {
$wpdb->query('ROLLBACK');
wp_send_json_error('Errores al sincronizar: ' . implode(', ', $errors));
}
}
Paso 5: Guardar y Activar el Fragmento
- Una vez que hayas pegado ambos fragmentos de código, haz clic en «Save Changes and Activate».
- Ahora, verás un botón en la lista de posts personalizados en el idioma por defecto que te permitirá sincronizar el orden de los posts entre todos los idiomas.
Este método asegura que el orden de tus posts se sincronice eficientemente entre diferentes idiomas, optimizando el tiempo de sincronización y asegurando una mejor experiencia de usuario en tu sitio multilingüe. ¡Esperamos que esta solución te sea de gran ayuda!