Вопрос или проблема
У меня есть большой csv-файл, содержащий URL-адрес фотографии и заголовок. Я создал пользовательскую таксономию для своего типа записи. Я сделал поле для фото этой таксономии с помощью ACF и ищу возможность массовой загрузки всего контента. Я пробовал использовать плагин WP All Import Pro, но там нет возможности установить фото таксономии в это поле ACF, поэтому я ищу индивидуальное решение.
Функция: Добавление новых терминов и метаданных терминов из .csv файла, представленная ниже, должна помочь.
1. Требования
Файл .csv должен содержать строку заголовков.
Функция, указанная ниже, предназначена для получения .csv с минимум тремя колонками для заполнения этими полями WP_Term:
- имя,
- ярлык и
- описание.
Однако, предложенные ниже обновления функции и настройки переменных должны быть изменены для работы с двухколоночным .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 фото, в мета-информацию термина.
Применение
-
Подготовка CSV: Убедитесь, что ваш CSV содержит заголовки, соответствующие столбцам, которые вы хотите импортировать, например, "title" для названия и "url" для URL фото.
-
Настройка функции: В коде необходимо подставить ваши данные в строки, которые содержат
CUSTOM_TAXONOMY
и другие переменные. Убедитесь, что размещаете путь к вашему CSV-файлу. -
Запуск функции: Используйте WordPress какой-либо плагин для запуска пользовательского PHP-кода или выполните его в файле темы, чтобы иметь возможность запустить процесс импорта.
Этот подход позволит вам автоматизировать процесс создания и управления таксономиями и их метаданными, что значительно упрощает задачу массового импорта. Убедитесь, что у вас установлены все необходимые плагины, и ваша среда WordPress соответствует требованиям кода для успешной имплементации.