Crear posts y traducciones en WordPress para WPML con código

En el tutorial crear un posts de WordPress con código te explicaba mismamente eso, pero en esta ocasión vamos a ir un poco más allá para crear no sólo el post o la entrada sino que vamos a crear, publicar y conectar las traducciones de un mismo post.

Creo que no hace falta decirlo pero vaya usted a saber. Necesitas tener instalado WPML y para el ejemplo que te voy a mostrar, 3 idiomas configurados en WPML. En este caso yo tengo configurados «español», «inglés» y «euskera».

El idioma que he configurado como «principal» o «por defecto» en WPML es «español».

Aclarado esto, vamos al lío:

Lo que voy a hacer es crear una función donde crear el contenido de cada post: «título», «contenido» y «estado». Almaceno el contenido de cada idioma en un array para crear cada unos de los posts por separado y luego ya los conectaré.

Por ejemplo, para crear el contenido en español:

    $post_original_es = array(
        'post_title'    => 'Título del post en español',
        'post_content'  => 'Contenido del post en español y bla, bla, blac...',
        'post_status'   => 'publish'       
    );

Y para crear el contenido en inglés:

    $post_traducido_en = array(
        'post_title'    => 'My post title - English',
        'post_content'  => 'My post content in english and ble, ble, ble...',
        'post_status'   => 'publish',
    );

De momento no pongo el de euskera porque es más de lo mismo pero en otro idioma.

Como puedes observar, creo un array con el contenido que quiero, un array por cada idioma.

De momento no he publicado nada, sólo he creado esos arrays para preparar el contenido que publicaré.

Ahora voy a utilizar la función wp_insert_post() que ya usé en el tutorial que te comentaba al inicio. Lo que hace es precisamente eso, crear el post en WordPress y como el estado está establecido a «publish», pues los publicará, de esta forma:

$post_original_es_id = wp_insert_post( $post_original_es );
$post_traducido_en_id = wp_insert_post( $post_traducido_en );

Con estas dos líneas que acabo de poner, lo que hago es publicar dos posts, cada uno con su información. Pero ¡Ojo! todavía no están conectados. Cada uno va a su bola, ahora mismo no tienen nada que ver el uno con el otro.

Pues bien, este código mas el relativo al tercer idioma, lo metemos en una función y al final de la misma devolvemos un array con estos 3 arrays de posts.

function nuevos_posts_para_publicar() {
    $output = array(); // array que contendrá los posts para publicar
 
    // Crear el post original en español
    $post_original_es = array(
        'post_title'    => 'Título del post en español',
        'post_content'  => 'Contenido del post en español y bla, bla, blac...',
        'post_status'   => 'publish',
    );
 
    // Crear el contenido del post para inglés
    $post_traducido_en = array(
        'post_title'    => 'My post title - English',
        'post_content'  => 'My post content in english and ble, ble, ble...',
        'post_status'   => 'publish',
    );

    // Crear el contenido del post para euskera
    $post_traducido_eu = array(
	'post_title'    => 'Nire mezuaren izenburua - Euskara',
	'post_content'  => 'Nire mezuaren edukia euzkaraz eta bleu, bleu, bleu...',
	'post_status'   => 'publish',
    );
 
    // Insertar los 3 posts en la base de datos con wp_insert_post();
    $post_original_es_id = wp_insert_post( $post_original_es );
    $post_traducido_en_id = wp_insert_post( $post_traducido_en );
    $post_traducido_eu_id = wp_insert_post( $post_traducido_eu );
 
    return $output = array(
        'original' => $post_original_es_id,
        'traduccion_en' => $post_traducido_en_id,
	'traduccion_eu' => $post_traducido_eu_id
    );
}

Hasta el momento todo bien. Puedes ejecutar este código para que lo que hacer y te darás cuenta que crea un post en cada idioma, sin más. Todavía no hay magia.

Ahora vamos a crear otra función que hará la conexión entre los 3 posts, el original en español y los otros dos en inglés y euskera.

Esta función recogerá lo que ha retornado la función anterior como $output y lo recoge, por ejemplo así:

$nuevos_posts_ids = nuevos_posts_para_publicar();

Perfecto, ya tengo los tres posts en la nueva función para trabajar con ellos.

En primer lugar establecemos el tipo de elemento con un el filtro wpml_element_type de WPML de esta forma:

$wpml_element_type = apply_filters( 'wpml_element_type', 'post' );

Ahora, obtengo información del idioma original para usarlo más adelante. De esta forma:

$get_language_args = array('element_id' => $nuevos_posts_ids['original'], 'element_type' => 'post' );
$original_post_language_info = apply_filters( 'wpml_element_language_details', null, $get_language_args );

Como ves, uso el filtro wpml_element_language_details de WPML.

Ahora que ya tengo los detalles del idioma orginal (español), voy a establecer los detalles de los otros dos idiomas pero para este ejemplo pongo solo uno, ya lo tendrás todo al final del tutorial.

$set_language_args_en = array(
   'element_id'    => $nuevos_posts_ids['traduccion_en'],
   'element_type'  => $wpml_element_type,
   'trid'   => $original_post_language_info->trid,
   'language_code'   => 'en',
   'source_language_code' => $original_post_language_info->language_code
);

Ya ves. Simplemente creo un array con una serie de información que nos va a hacer falta, como el id del post, el tipo, que ya había establecido anteriormente, el código del idioma y el idioma original.

Por último, ejecuto una acción de WPML con los argumentos que acabamos de establecer para inglés. De esta forma:

do_action( 'wpml_set_element_language_details', $set_language_args_en );

De esta forma, WPML ya sabe qué post tiene que conectar y con qué post.

Más información sobre wpml_set_element_language_details.

Ya lo tienes todo para crear traducciones a manta.

Lo suyo sería crear un «trigger» para que se ejecutara esta función pero este caso es algo diferente ya que que si lo dejamos así y lo metemos en el ‘wp_footer‘ pues no pararía de crear posts y eso no interesa.

Como hace poco publiqué un post sobre cómo crear cron jobs en WordPress, pues me he tomado la libertad de añadir para que puedas probarlo y ejecutar el cron cuando quieras y vayas viendo los resultado. Pero eso si, como esto es algo más «gordo», no nos quedaríamos aquí sino que tal vez habría que añadir código para que se borraran todos los posts antes de crear los nuevos.

Lo que molaría es sincronizar los posts. Que es el caso. El mío, me refiero. La información de los posts la traemos de una base de datos externa que no tiene nada que ver con WordPress pero tenemos un campo para saber cuando se hizo el último cambio del contenido y así, comparando ese campo con el correspondiente campo en nuestro WordPress, podemos saber si tenemos o no tenemos que eliminar ese post y crearlo de nuevo. Cuando digo post, me refiero al post en los 3 idiomas, ok?

Pero bueno, de lo que se trata es de que lo pruebes y lo entiendes y para eso creo que con un cron job es suficiente.

A continuación tienes todo el código:

Espero que te haya gustado este tutorial y no dejes de comentarme cosas relacionadas con este tutorial, ok?

Venga, mucho ánimo!