Cum să adaugi termeni programatic la postări personalizate în WordPress

15 dec. 2014, 19:24:25
Vizualizări: 18.2K
Voturi: 2

Ceea ce vreau să fac este să atribui un termen ierarhic unei postări personalizate:

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);
}

Am reușit să creez automat cele 24 de postări personalizate, dar nu reușesc să le atribui termenul în acel proces. Anterior, am creat termenul cu această funcție, fără probleme:

function example_insert_category() {
  wp_insert_term(
    'Mosaic - Home',
    'tiles_categories',
    array(
      'description' => 'Adaugă Tile-uri aici pentru încărcare în prima secțiune',
      'slug'    => 'mosaic-home'
    )
  );
}
  add_action('init','example_insert_category');

Ce fac greșit?

2
Comentarii

Cred că această problemă este legată de http://wordpress.stackexchange.com/questions/18236/attaching-taxonomy-data-to-post-with-wp-insert-post

Karun Karun
15 dec. 2014 20:18:04

Mulțumesc Karun, dar nu văd soluția în acea întrebare. Am nevoie ca asta să funcționeze..., cunoștințele mele de php sunt de bază..., mă străduiesc să învăț. Uneori mă pierd în aceste lucruri

Dedalos01 Dedalos01
16 dec. 2014 13:44:19
Toate răspunsurile la întrebare 2
0

Am descoperit problema și soluția. Am depanat funcția "wp_set_object_terms" folosind "is_wp_error" și am primit mesajul "Invalid Taxonomy", apoi mi-am dat seama că atunci când postările erau create, acel termen nu exista. Așa că am schimbat hook-ul în "init" în funcția programmatically_create_post(), și voila!

Mai jos este codul care funcționează:

    <?php
// DE EXECUTAT CÂND TEMA ESTE ACTIVATĂ ///////////////////////
if (isset($_GET['activated']) && is_admin()){

  // 3. Adaugă termenul "mosaic-home" la taxonomia personalizată "tiles_categories"
    function example_insert_category() {
      wp_insert_term(
        'Mosaic - Home',
        'tiles_categories',
        array(
          'description' => 'Adaugă Tile-uri aici pentru a fi încărcate în prima categorie',
          'slug'    => 'mosaic-home'
          )
        );
      }
    add_action('init','example_insert_category');

  // 4. Crează bucla pentru generarea a 24 de postări
    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. adaugă bucla în funcția pentru crearea postărilor
  function programmatically_create_post() {

    // Inițializează ID-ul postării cu -1. Acest lucru indică faptul că nu s-a întâmplat nimic.
    $post_id = -1;
    $title='';
    // Dacă postarea nu există deja, atunci o creează
    if( null == get_page_by_title( $title ) ) {
        create_frontles_posts();
        } else {
              // Altfel, se oprește
              $post_id = -2;
      } 
    } 
    add_filter( 'init', 'programmatically_create_post' );

} // sfârșitul acțiunilor la activare
?>
17 dec. 2014 15:10:23
3

Iată un exemplu. Am încercat să explic fiecare proces care are loc în fiecare linie. Sper că acest cod vă poate explica ușor cum funcționează.

<?php 
//creăm un array gol pentru a stoca ID-urile termenilor inserați
$terms = array();

//inserăm termenul "Kathmandu" într-o taxonomie personalizată "region"
$tax_insert_id = wp_insert_term('Kathmandu','region' );

//dacă termenul "Kathmandu" este inserat cu succes, term_id este returnat și stocat în $tax_insert_id
//term_id returnat este adăugat în array-ul $terms
$terms[] = $tax_insert_id['term_id'];

//inserăm termenul "Banepa" într-o taxonomie personalizată "region"
$tax_insert_id = wp_insert_term('Banepa','region' );

//dacă termenul "Banepa" este inserat cu succes, term_id este returnat și stocat în $tax_insert_id
//term_id returnat este adăugat în array-ul $terms
$terms[] = $tax_insert_id['term_id'];

//Creăm un array pentru postare
$post = array(
    'post_title'      => 'Titlu',
    'post_content'      => 'Acesta este un text dummy',
    'post_status'    => 'publish',
    'post_type'      => 'post',
);

//Inserăm postarea în WordPress folosind wp_insert_post()
//dacă postarea este creată cu succes, post_id este returnat și stocat în $the_post_id
$the_post_id = wp_insert_post( $post );

//atribuim termenii stocați în array-ul $terms postării cu ID-ul $the_post_id
wp_set_post_terms( $the_post_id, $terms, 'region' );
16 dec. 2014 14:40:06
Comentarii

Mulțumesc Karun! Dar încerc să-l testez și primesc această eroare php "Fatal error: Cannot use object of type WP_Error as array in..." la această linie: $terms[] = $tax_insert_id['term_id'];

Dedalos01 Dedalos01
16 dec. 2014 19:42:55

Poți vedea cum arată acum întregul cod aici: http://pastebin.com/embed_iframe.php?i=gxp71NLt

Dedalos01 Dedalos01
16 dec. 2014 19:51:21

Funcționează bine. Dar poți să explici puțin cum să creez mai multe postări sub diferiți termeni?

Shiplu Shiplu
29 apr. 2022 12:18:16