web-dev-qa-db-ja.com

プログラムでカスタム投稿タイプに用語を追加する

私がやりたいことは、カスタム投稿タイプに階層用語を割り当てることです。

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

私はその24のカスタム投稿を自動的に作成しますが、その過程でそれらに用語を割り当てる方法はありません。以前は、この関数を使ってこの用語を作成しましたが、問題はありません。

function example_insert_category() {
  wp_insert_term(
    'Mosaic - Home',
    'tiles_categories',
    array(
      'description' => 'Add Tiles here to load in first term',
      'slug'    => 'mosaic-home'
    )
  );
}
  add_action('init','example_insert_category');

何が悪いの?

1
Dedalos01

私はその問題と解決策を見つけました。 「is_wp_error」を使用して「wp_set_object_terms」をデバッグしたところ、「Invalid Taxonomy」というメッセージが表示され、投稿が作成されたときにはその用語は存在しないことがわかりました。そのため、programmatic_create_post()関数でフックを "init"に変更しました。

この行の下のコードは動作しました:

    <?php
// TO DO WHEN THEME IS ACTIVATED ///////////////////////
if (isset($_GET['activated']) && is_admin()){

  // 3. Add term "mosaic-home" to custom taxonomy "tiles_categories"
    function example_insert_category() {
      wp_insert_term(
        'Mosaic - Home',
        'tiles_categories',
        array(
          'description' => 'Add Tiles here to load in first term',
          'slug'    => 'mosaic-home'
          )
        );
      }
    add_action('init','example_insert_category');

  // 4. Make loop for creating 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. add the loop to the function for create posts
  function programmatically_create_post() {

    // Initialize the page ID to -1. This indicates no action has been taken.
    $post_id = -1;
    $title='';
    // If the page doesn't already exist, then create it
    if( null == get_page_by_title( $title ) ) {
        create_frontles_posts();
        } else {
              // Otherwise, we'll stop
              $post_id = -2;
      } 
    } 
    add_filter( 'init', 'programmatically_create_post' );

} // end to do on activation
?>
2
Dedalos01

これが一例です。各行で発生する各プロセスを説明しようとしました。このコードが、これがどのように機能しているかを簡単に説明できることを願っています。

<?php 
//creating a blank array to store the inserted terms ids
$terms = array();

//inserting the term "Kathmandu" in a custom taxonomy "region"
$tax_insert_id = wp_insert_term('Kathmandu','region' );

//if the term "Kathmandu" is inserted successfully, its term_id is returned and stored in $tax_insert_id
//the returned term_id is pushed in the array $terms
$terms[] = $tax_insert_id['term_id'];

//inserting the term "Banepa" in a custom taxonomy "region"
$tax_insert_id = wp_insert_term('Banepa','region' );

//if the term "Banepa" is inserted successfully, its term_id is returned and stored in $tax_insert_id
//the returned term_id is pushed in the array $terms
$terms[] = $tax_insert_id['term_id'];

//Creating a post array
$post = array(
    'post_title'      => 'Title',
    'post_content'      => 'This is a dummy text',
    'post_status'    => 'publish',
    'post_type'      => 'post',
);

//Inserting the post in WordPress using wp_insert_post()
//if the post is successfully posted, post_id is returned and stored in $the_post_id
$the_post_id = wp_insert_post( $post );

//assign the terms stored in $terms array to $the_post_id post
wp_set_post_terms( $the_post_id, $terms, 'region' );
0
Karun