Программное добавление терминов к пользовательским типам записей

15 дек. 2014 г., 19:24:25
Просмотры: 18.2K
Голосов: 2

Я хочу назначить иерархический термин для пользовательского типа записи:

function create_frontles_posts() {
  $x = 1;

  do {
    $post_id = wp_insert_post(array(
        'comment_status'  =>  'closed', // закрыть комментарии
        'ping_status'   =>  'closed',   // закрыть пинги
        'post_author'   =>  1,          // ID автора
        '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
Комментарии

Я считаю, что эта проблема связана с http://wordpress.stackexchange.com/questions/18236/attaching-taxonomy-data-to-post-with-wp-insert-post

Karun Karun
15 дек. 2014 г. 20:18:04

Спасибо, Карун, но я не вижу решения в этом вопросе. Мне нужно, чтобы это работало..., мои знания PHP базовые..., я стараюсь учиться. Иногда я теряюсь в таких вещах

Dedalos01 Dedalos01
16 дек. 2014 г. 13:44:19
Все ответы на вопрос 2
0

Я обнаружил проблему и её решение. Я отладил функцию "wp_set_object_terms" с помощью "is_wp_error" и получил сообщение "Invalid Taxonomy", после чего понял, что во время создания постов этот термин ещё не существовал. Поэтому я изменил хук на "init" в функции programmatically_create_post(), и вуаля!

Ниже представлен рабочий код:

    <?php
// ДЕЙСТВИЯ ПРИ АКТИВАЦИИ ТЕМЫ ///////////////////////
if (isset($_GET['activated']) && is_admin()){

  // 3. Добавляем термин "mosaic-home" в пользовательскую таксономию "tiles_categories"
    function example_insert_category() {
      wp_insert_term(
        'Mosaic - Home',
        'tiles_categories',
        array(
          'description' => 'Добавьте плитки сюда для загрузки в первом термине',
          'slug'    => 'mosaic-home'
          )
        );
      }
    add_action('init','example_insert_category');

  // 4. Создаём цикл для генерации 24 записей
    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'    =>  'Плитка',
            '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. Добавляем цикл в функцию для создания записей
  function programmatically_create_post() {

    // Инициализируем ID страницы значением -1. Это означает, что никакие действия ещё не выполнялись.
    $post_id = -1;
    $title='';
    // Если страница ещё не существует, создаём её
    if( null == get_page_by_title( $title ) ) {
        create_frontles_posts();
        } else {
              // В противном случае прекращаем выполнение
              $post_id = -2;
      } 
    } 
    add_filter( 'init', 'programmatically_create_post' );

} // конец действий при активации
?>
17 дек. 2014 г. 15:10:23
3

Вот пример. Я постарался объяснить каждый процесс, происходящий в каждой строке. Надеюсь, этот код поможет вам легко понять, как это работает.

<?php 
//создаем пустой массив для хранения идентификаторов вставляемых терминов
$terms = array();

//вставляем термин "Kathmandu" в пользовательскую таксономию "region"
$tax_insert_id = wp_insert_term('Kathmandu','region' );

//если термин "Kathmandu" успешно вставлен, его term_id возвращается и сохраняется в $tax_insert_id
//возвращенный term_id добавляется в массив $terms
$terms[] = $tax_insert_id['term_id'];

//вставляем термин "Banepa" в пользовательскую таксономию "region"
$tax_insert_id = wp_insert_term('Banepa','region' );

//если термин "Banepa" успешно вставлен, его term_id возвращается и сохраняется в $tax_insert_id
//возвращенный term_id добавляется в массив $terms
$terms[] = $tax_insert_id['term_id'];

//Создаем массив для поста
$post = array(
    'post_title'      => 'Заголовок',
    'post_content'      => 'Это тестовый текст',
    'post_status'    => 'publish',
    'post_type'      => 'post',
);

//Вставляем пост в WordPress с помощью wp_insert_post()
//если пост успешно создан, его post_id возвращается и сохраняется в $the_post_id
$the_post_id = wp_insert_post( $post );

//назначаем термины из массива $terms посту с идентификатором $the_post_id
wp_set_post_terms( $the_post_id, $terms, 'region' );
16 дек. 2014 г. 14:40:06
Комментарии

Спасибо, Карун! Но я пытаюсь протестировать код и получаю ошибку PHP "Fatal error: Cannot use object of type WP_Error as array in..." в этой строке: $terms[] = $tax_insert_id['term_id'];

Dedalos01 Dedalos01
16 дек. 2014 г. 19:42:55

Можешь посмотреть, как сейчас выглядит весь код здесь: http://pastebin.com/embed_iframe.php?i=gxp71NLt

Dedalos01 Dedalos01
16 дек. 2014 г. 19:51:21

Он работает нормально. Но не мог бы ты немного подробнее объяснить, как создать несколько записей под разными терминами?

Shiplu Shiplu
29 апр. 2022 г. 12:18:16