Вопрос или проблема
Я импортирую данные из Google Sheets в пользовательский тип записи JetEngine через WP All Import. Мои данные включают поля с повторением (в данном случае “точки” с подполями, такими как заголовок, описание, адрес, телефон, веб-сайт и код встраивания Instagram).
Текущая структура (одна колонка на подполе — использование новых строк вместо разделителя):
Вместо объединения нескольких элементов с повторением в одну ячейку с использованием символа вертикальной черты (|), мой текущий лист использует несколько строк на каждую запись. Название записи появляется только в первой строке для каждой записи, а для дополнительных элементов с повторением ячейка с названием записи остаётся пустой.
Проблема:
WP All Import и JetEngine работают хорошо, когда все данные с повторением объединены в одной колонке с разделителем, но для лучшего управления данными мне необходимо использовать несколько строк/колонок. Задача заключается в том, что количество элементов с повторением варьируется для каждой записи (некоторые записи имеют 2 элемента, другие 3, 5 или даже 50).
Мне нужно динамическое решение, которое либо:
- Позволяет WP All Import обрабатывать эту многострочную структуру в одно поле с повторением для JetEngine
- Позволяет мне предобработать данные так, чтобы несколько строк (с пустыми ячейками названия записи) были объединены в ожидаемый формат с повторением во время импорта.
Любые идеи или пример кода для работы с этой динамической структурой полей с повторением будут очень полезны.
.
Ответ или решение
Импорт данных из Google Sheets в пользовательский тип записи (CPT) JetEngine с использованием WP All Import, особенно в случае работы с динамическими мультистрочными полями-репитерами, представляет собой специфическую задачу, требующую тщательной работы и понимания процесса. Это может быть сложной задачей, особенно когда количество элементов репитера варьируется от поста к посту. В данном случае, данные о каждом элементе репитера, включая такие подполях как название, описание, адрес, телефон, вебсайт и код для встраивания Instagram, представлены в разных строках на одном листе Google Sheets.
Теория
WP All Import — мощный инструмент для импорта данных в WordPress из различных источников, включая файлы CSV и Google Sheets. Он особенно полезен в контексте сложных структур данных, таких как JetEngine, который позволяет создавать обширные системы на базе CMS WordPress с кастомными полями и повторяющимися структурами данных (репитер-филдами).
Основная сложность данного случая заключается в корректной интерпретации многострочной структуры данных Google Sheets как одного непрерывного набора данных для поля репитера JetEngine. По умолчанию WP All Import ожидает, что все данные репитера будут объединены в одну колонку, разделенные специальным символом или делимитером (например, вертикальной чертой " | ").
Пример
Ваш нынешний подход заключается в хранении данных в формате, где каждая строка представляет отдельный элемент репитера для одного и того же поста, а название поста указывается только в первой строке. Это создает проблемы для WP All Import, который не может по умолчанию распознать принадлежность строк к одному посту.
Возможный пример данных может выглядеть следующим образом:
Post Title | Title | Description | Address | Phone | Website | Instagram Code |
---|---|---|---|---|---|---|
Post 1 | Item 1 | Desc 1 | Addr 1 | Phone1 | Site 1 | Code 1 |
Item 2 | Desc 2 | Addr 2 | Phone2 | Site 2 | Code 2 | |
Post 2 | Item 1 | Desc 1 | Addr 1 | Phone1 | Site 1 | Code 1 |
Item 2 | Desc 2 | Addr 2 | Phone2 | Site 2 | Code 2 |
Такая структура затрудняет импорт, потому что WP All Import считает отсутствие заголовка за окончание предыдущего набора данных.
Применение
Для решения этой проблемы вам потребуется промежуточная обработка данных, чтобы превратить их в нужный формат перед импортом в WordPress. Вот один из подходов к решению этой задачи:
Шаги:
-
Скрипт предобработки данных:
Можно использовать скрипт на Python или PHP для обработки данных Google Sheets и приведения их в желаемый формат CSV, где каждый элемент репитера будет представлен в одной строке и разделен нужным делиметром.
-
Конкатенация строк:
Скрипт должен считывать данные из Google Sheets, следить за изменениями в колонке
Post Title
и, при обнаружении пустой строки, сохранять данные в буфер, добавляя их к предыдущей строке до тех пор, пока не встретится новая запись вPost Title
. -
Импорт с использованием WP All Import:
После получения правильно структурированных данных их можно импортировать в JetEngine с помощью WP All Import, используя предварительный делиметр для полей репитера.
import csv
def process_google_sheet_data(input_file, output_file):
with open(input_file, mode='r', encoding='utf-8') as csvfile:
csvreader = csv.DictReader(csvfile)
processed_rows = []
current_post = {}
for row in csvreader:
if row['Post Title']:
if current_post:
processed_rows.append(current_post.copy())
current_post = {key: row[key] for key in row if key}
# Concatenate data for repeater fields
delimiter = "|"
for key in row:
if key not in ['Post Title'] and row[key]:
if key in current_post:
current_post[key] += delimiter + row[key]
else:
current_post[key] = row[key]
# Don't forget the last post
if current_post:
processed_rows.append(current_post)
with open(output_file, mode='w', encoding='utf-8', newline='') as csvfile:
fieldnames = ['Post Title', 'Title', 'Description', 'Address', 'Phone', 'Website', 'Instagram Code']
csvwriter = csv.DictWriter(csvfile, fieldnames=fieldnames)
csvwriter.writeheader()
csvwriter.writerows(processed_rows)
# Usage
process_google_sheet_data('input_google_sheet.csv', 'output_wp_import.csv')
-
Загрузка данных в WP All Import:
После того как CSV файл будет готов, загрузите его в WP All Import. Настройте импорт так, чтобы соответствие полей происходило корректно с учетом использования делиметров.
Эти шаги помогут вам справиться с задачей импорта динамических репитер-полей в JetEngine, сохраняя при этом гибкость управляемости и простоту импорта данных из Google Sheets.