以编程方式将术语添加到自定义帖子类型

时间:2014-12-15 作者:Dedalos01

我要做的是为自定义帖子类型分配一个层次术语:

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\');
我做错了什么?

2 个回复
最合适的回答,由SO网友:Dedalos01 整理而成

我找到了问题和解决方案。我使用“is\\u wp\\u error”调试了“wp\\u set\\u object\\u terms”,得到了“Invalid Taxonomy”消息,然后我意识到在创建帖子时,这个术语并不存在。因此,我在programmetically\\u create\\u 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
?>

SO网友:Karun

这里有一个例子。我试图解释每一行中发生的每一个过程。我希望这段代码可以很容易地解释这是如何工作的。

<?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\' );

结束