Añadir términos programáticamente a tipos de post personalizados

15 dic 2014, 19:24:25
Vistas: 18.2K
Votos: 2

Lo que quiero hacer es asignar un término jerárquico a un tipo de post personalizado:

function create_frontles_posts() {
  $x = 1;

  do {
    $post_id = wp_insert_post(array(
        'comment_status'  =>  'closed',
        'ping_status'   =>  'closed',
        'post_author'   =>  1,
        'post_name'   =>  'Tile'.$x,
        'post_title'    =>  'Tile',
        'post_status'   =>  'publish',
        'post_type'   =>  'frontiles',
      ));
wp_set_object_terms($post_id, array('mosaic-home'), 'tiles_categories', true);


    $x++;
  } while ($x <= 24);
}

Logro crear automáticamente los 24 posts personalizados pero no consigo asignarles el término en ese proceso. Previamente, creé el término con esta función, sin problemas:

function example_insert_category() {
  wp_insert_term(
    'Mosaic - Home',
    'tiles_categories',
    array(
      'description' => 'Añade Tiles aquí para cargar en el primer término',
      'slug'    => 'mosaic-home'
    )
  );
}
  add_action('init','example_insert_category');

¿Qué estoy haciendo mal?

2
Comentarios

Creo que este problema está relacionado con http://wordpress.stackexchange.com/questions/18236/attaching-taxonomy-data-to-post-with-wp-insert-post

Karun Karun
15 dic 2014 20:18:04

Gracias Karun pero no puedo ver la solución en esa pregunta. Necesito que esto funcione..., mi conocimiento de php es básico..., lucho por aprender. A veces me pierdo en estas cosas

Dedalos01 Dedalos01
16 dic 2014 13:44:19
Todas las respuestas a la pregunta 2
0

Descubrí el problema y la solución. Depuré "wp_set_object_terms" usando "is_wp_error" y recibí el mensaje "Taxonomía Inválida", entonces me di cuenta de que cuando se creaban los posts ese término no existía. Así que cambié el hook a "init" en la función programmatically_create_post(), y ¡voilà!

Debajo de esta línea el código funcionando:

    <?php
// ACCIONES CUANDO EL TEMA SE ACTIVA ///////////////////////
if (isset($_GET['activated']) && is_admin()){

  // 3. Añadir término "mosaic-home" a la taxonomía personalizada "tiles_categories"
    function example_insert_category() {
      wp_insert_term(
        'Mosaic - Home',
        'tiles_categories',
        array(
          'description' => 'Añade Tiles aquí para cargar en el primer término',
          'slug'    => 'mosaic-home'
          )
        );
      }
    add_action('init','example_insert_category');

  // 4. Bucle para crear 24 posts
    function create_frontles_posts() {
      $x = 1;

      do {
        $post_id = wp_insert_post(array(
            'comment_status'  =>  'closed',
            'ping_status'   =>  'closed',
            'post_author'   =>  1,
            'post_name'   =>  'tile'.$x,
            'post_title'    =>  'Tile',
            'post_status'   =>  'publish',
            'post_type'   =>  'frontiles',
            // 'tax_input' =>   array('tiles_categories' => 2),
          ));
          wp_set_object_terms($post_id, 'mosaic-home', 'tiles_categories', true);

            $x++;
          } while ($x <= 24);
        }


// 5. Añadir el bucle a la función para crear posts
  function programmatically_create_post() {

    // Inicializar el ID de página a -1. Esto indica que no se ha tomado ninguna acción.
    $post_id = -1;
    $title='';
    // Si la página no existe ya, entonces crearla
    if( null == get_page_by_title( $title ) ) {
        create_frontles_posts();
        } else {
              // De lo contrario, nos detendremos
              $post_id = -2;
      } 
    } 
    add_filter( 'init', 'programmatically_create_post' );

} // fin de acciones al activar
?>
17 dic 2014 15:10:23
3

Aquí tienes un ejemplo. He tratado de explicar cada proceso que ocurre en cada línea. Espero que este código pueda explicarte fácilmente cómo funciona.

<?php 
//creando un array vacío para almacenar los IDs de los términos insertados
$terms = array();

//insertando el término "Kathmandu" en la taxonomía personalizada "region"
$tax_insert_id = wp_insert_term('Kathmandu','region' );

//si el término "Kathmandu" se inserta correctamente, se devuelve su term_id y se almacena en $tax_insert_id
//el term_id devuelto se añade al array $terms
$terms[] = $tax_insert_id['term_id'];

//insertando el término "Banepa" en la taxonomía personalizada "region"
$tax_insert_id = wp_insert_term('Banepa','region' );

//si el término "Banepa" se inserta correctamente, se devuelve su term_id y se almacena en $tax_insert_id
//el term_id devuelto se añade al array $terms
$terms[] = $tax_insert_id['term_id'];

//Creando un array para el post
$post = array(
    'post_title'      => 'Título',
    'post_content'      => 'Este es un texto de ejemplo',
    'post_status'    => 'publish',
    'post_type'      => 'post',
);

//Insertando el post en WordPress usando wp_insert_post()
//si el post se publica correctamente, se devuelve el post_id y se almacena en $the_post_id
$the_post_id = wp_insert_post( $post );

//asignar los términos almacenados en el array $terms al post con ID $the_post_id
wp_set_post_terms( $the_post_id, $terms, 'region' );
16 dic 2014 14:40:06
Comentarios

¡Gracias Karun! Pero estoy intentando probarlo y tengo este error en PHP "Fatal error: Cannot use object of type WP_Error as array in..." en esta línea: $terms[] = $tax_insert_id['term_id'];

Dedalos01 Dedalos01
16 dic 2014 19:42:55

Puedes ver cómo se ve ahora el código completo aquí: http://pastebin.com/embed_iframe.php?i=gxp71NLt

Dedalos01 Dedalos01
16 dic 2014 19:51:21

Funciona bien. ¿Pero podrías explicar un poco cómo crear múltiples posts bajo diferentes términos?

Shiplu Shiplu
29 abr 2022 12:18:16