Массовый импорт в пользовательскую таксономию

Вопрос или проблема

У меня есть большой csv-файл, содержащий URL-адрес фотографии и заголовок. Я создал пользовательскую таксономию для своего типа записи. Я сделал поле для фото этой таксономии с помощью ACF и ищу возможность массовой загрузки всего контента. Я пробовал использовать плагин WP All Import Pro, но там нет возможности установить фото таксономии в это поле ACF, поэтому я ищу индивидуальное решение.

Функция: Добавление новых терминов и метаданных терминов из .csv файла, представленная ниже, должна помочь.

1. Требования

Файл .csv должен содержать строку заголовков.

Функция, указанная ниже, предназначена для получения .csv с минимум тремя колонками для заполнения этими полями WP_Term:

  1. имя,
  2. ярлык и
  3. описание.

Однако, предложенные ниже обновления функции и настройки переменных должны быть изменены для работы с двухколоночным .csv.

2. Предложенные обновления функции

Так как в вашем .csv файл может быть только две колонки (title, url), вы можете изменить эти строки с:

'description' => \__( $taxonomy_term[ $taxonomy_term_description ], 'translation_domain' ),
'slug'        => $taxonomy_term[ $slug ],

…на…

'description' => '',
'slug'        => $taxonomy_term[ $taxonomy_term_name ],

…что повторно использует колонку $taxonomy_term_name для значения ярлыка.

Вы можете использовать функцию preg_replace() для замены недопустимых символов ярлыка. Однако, ничего не нужно делать, если вас устраивает, как WordPress обрабатывает ярлыки терминов.

3. Настройка переменных

Обновите переменные в функции для вашего .csv, используя:

// Имя пользовательской таксономии.
$custom_taxonomy = 'ВСТАВЬТЕ ИМЯ СВОЕЙ ПОЛЬЗОВАТЕЛЬСКОЙ ТАКСОНОМИИ ЗДЕСЬ';

// Заголовок столбца .csv для имени термина.
$taxonomy_term_name="title";

// Заголовок столбца .csv для описания термина.
$taxonomy_term_description = 'title';

// Заголовок столбца .csv для ярлыка.
$slug = 'title';

// Укажите абсолютный путь к вашему .csv файлу в этой строке в функции ниже.
$file_path = __DIR__ . '/file.csv'; 

Колонка url будет добавлена в метаданные термина.

Функция: Добавление новых терминов и метаданных терминов из .csv файла

/**
 * Добавляет новые термины и метаданные терминов из .csv файла.
 *
 * Файл .csv должен содержать заголовки столбцов для
 * term_name, term_description и slug.
 *
 * Обновите переменные $custom_taxonomy, $taxonomy_term_name,
 * $taxonomy_term_description и $slug с соответствующими значениями.
 *
 * @param string $file_path
 *
 * @return void
 */
function create_taxonomy_terms( $file_path="" ) {
    // Имя пользовательской таксономии.
    $custom_taxonomy = 'CUSTOM_TAXONOMY';

    // Заголовок столбца .csv для имени термина.
    $taxonomy_term_name="taxonomy_term_name";

    // Заголовок столбца .csv для описания термина.
    $taxonomy_term_description = 'taxonomy_term_description';

    // Заголовок столбца .csv для ярлыка.
    $slug = 'slug';

    // Заголовок столбца .csv для столбца, содержащего символы новой строки.
    // Этот столбец будет сохранен в метаданных термина.
    $column_with_newlines="csv_header_for_column_containing_newline_characters";

    // Для жестко заданных путей к файлам.
    if ( empty( $file_path ) ) {
          $file_path = __DIR__ . '/file.csv';
    }

    try {
        $rows = array_map( 'str_getcsv', file( $file_path ) );

        $headers = array_shift( $rows );

        $taxonomy_terms = array();
        foreach ( $rows as $row ) {
            $assoc_array = array();
            foreach ( $headers as $index => $header ) {
                $assoc_array = array_merge( $assoc_array, array( $header => $row[ $index ] ) );
            }

            $taxonomy_terms[] = $assoc_array;
        }

        foreach ( $taxonomy_terms as $taxonomy_term ) {
            $taxonomy_term_exists = \term_exists( $taxonomy_term[ $slug ], $custom_taxonomy );
            if ( $taxonomy_term_exists ) {
                continue;
            }

            $term_ids = \wp_insert_term(
                \__( $taxonomy_term[ $taxonomy_term_name ], 'translation_domain' ),
                $custom_taxonomy,
                array(
                    'description' => \__( $taxonomy_term[ $taxonomy_term_description ], 'translation_domain' ),
                    'slug'        => $taxonomy_term[ $slug ],
                    'parent'      => 0
                )
            );

            // Добавьте метаданные taxonomy_term, если в столбцах электронной таблицы .csv
            // содержатся дополнительные данные.
            // Мета-данные термина будут созданы для всех заголовков столбцов .csv. Чтобы избежать дублирования
            // столбцов taxonomy_term_name, taxonomy_term_description и slug,
            // используйте условия IF-Statement, чтобы пропустить создание ключей метаданных для этих столбцов.
            foreach ( $taxonomy_term as $meta_key => $meta_value ) {
                if ( $column_with_newlines == $meta_key ) {
                    $value  = addcslashes( $meta_value, "\n" );

                    // Можно сохранить $value как массив с одним элементом,
                    // сериализованный как строка, кодированная в JSON.
                    // При использовании get_term_meta, значение должно быть
                    // декодировано из JSON, и необходимое значение извлечено как
                    // первый элемент массива.
                    // Например:
                    // $json_encoded = \get_term_meta( $term_id, $column_with_newlines, $single_value = true );
                    // $json_decoded = json_decode( $json_encoded, $create_assoc_array = true );
                    // $value        = $json_decoded[0];
                    $meta_value = json_encode(
                        array( $value ),
                        ( JSON_HEX_TAG | JSON_HEX_QUOT )
                    );
                }

                // Четвертый параметр "$unique": Если true, add_term_meta блокируется, если ключ уже существует.
                $result = \add_term_meta( $term_ids['term_id'], $meta_key, $meta_value, $unique = true );
                if ( \is_wp_error( $result ) ) {
                    die( 'Ошибка импорта' );
                    // TODO: обработка ошибок WP_Error при импорте add_term_meta.
                }
            }
        }
    } catch ( \Exception $e ) {
        // TODO: обработка исключений, если используется импорт taxonomy_terms.
    }
}

Ответ или решение

Концепция массового импорта в пользовательскую таксономию может оказаться непростой задачей, особенно если вам необходимо управлять дополнительными метаданными, такими как фото. Исходя из описания вашей проблемы, вы хотите загрузить CSV-файл, содержащий URL-адрес фотографии и заголовок, и применить их к пользовательской таксономии, используя настройку Advanced Custom Fields (ACF).

Теория

Основная идея заключается в том, чтобы автоматизировать процесс импорта данных из CSV-файла в пользовательскую таксономию в WordPress, добавляя метаданные к каждой таксономии. WordPress допускает создание таксономий и управление метаданными с помощью встроенных функций, таких как wp_insert_term и add_term_meta. Скрипт на языке PHP может обрабатывать CSV-файл, извлекать строки и преобразовывать их в массив данных таксонов, после чего использовать эти массивы для добавления терминов в таксономию.

Пример

В приведенном вами коде показано, как использовать PHP для импорта данных из CSV-файла в таксономию WordPress. Обратите внимание на следующие ключевые моменты:

  • Парсинг CSV: Используя str_getcsv и file, вы можете эффективно обработать CSV-файл, разделяя строки на отдельные элементы массива.
  • Добавление терминов: Функция wp_insert_term добавляет новый термин в вашу таксономию.
  • Установка метаданных: Используйте add_term_meta для сохранения дополнительных данных, таких как URL фото, в мета-информацию термина.

Применение

  1. Подготовка CSV: Убедитесь, что ваш CSV содержит заголовки, соответствующие столбцам, которые вы хотите импортировать, например, "title" для названия и "url" для URL фото.

  2. Настройка функции: В коде необходимо подставить ваши данные в строки, которые содержат CUSTOM_TAXONOMY и другие переменные. Убедитесь, что размещаете путь к вашему CSV-файлу.

  3. Запуск функции: Используйте WordPress какой-либо плагин для запуска пользовательского PHP-кода или выполните его в файле темы, чтобы иметь возможность запустить процесс импорта.

Этот подход позволит вам автоматизировать процесс создания и управления таксономиями и их метаданными, что значительно упрощает задачу массового импорта. Убедитесь, что у вас установлены все необходимые плагины, и ваша среда WordPress соответствует требованиям кода для успешной имплементации.

Оцените материал
Добавить комментарий

Капча загружается...