WordPress — Как я могу изменить значение поля Post Object расширенных пользовательских полей через PHP?

Я работаю над созданием сценария импорта для переноса данных из электронной таблицы Excel, предоставляемой клиентом, и преобразования каждой строки в публикацию WordPress. Пока что у меня есть сообщения, которые создаются и все пользовательские поля заполнены правильно … кроме одного.

Одно из полей — «Связанные части». Я хотел бы использовать объект Post для этого поля, но я не могу найти какую-либо документацию по форматированию, чтобы использовать его для назначения объекта Post (или, предпочтительно, нескольких объектов) значению этого поля через мой PHP-скрипт.

Ниже приведен пример некоторого кода, который я использую для заполнения поля повторителя «спецификации», которое имеет два подполя: метка и значение.

$field_key = 'field_53ef95cead820';
$value = get_field($field_key, $postID);
foreach($specs as $spec):
$specArray = explode(':',$spec);
if($specArray[0] && $specArray[1]):
$value[] = array("label" => $specArray[0], "value" => $specArray[1]);
endif;
++$i;
endforeach;
update_field( $field_key, $value, $postID );

Чтобы изменить поле связанных частей, я должен установить его как ретранслятор, подобный этому, и затем создать какой-то массив для его заполнения, или я должен использовать опцию множественного выбора и все равно передать ему какой-то массив. Я счастлив идти любым путем, мне просто нужен какой-то способ, чтобы эти поля были там.

1

Решение

Невозможно добавить связанные продукты (другие публикации) во время первоначального импорта, поскольку при импорте первого продукта в WordPress связанные части еще не созданы. По этой причине мне пришлось запустить два импорта электронной таблицы в WordPress.

При первом импорте он создал все записи и добавил все нереляционные настраиваемые поля в том виде, в каком они появились в электронной таблице. Я настроил скрипт для печати идентификаторов постов импортированных продуктов в формате таблицы, что позволило мне легко скопировать и вставить все идентификаторы сразу из вывода скрипта обратно в поле «Идентификатор продукта» в электронной таблице. Сценарий проверяет наличие идентификатора продукта, и это поле определяет, будет ли оно создавать новую публикацию / продукт или обновлять существующую.

После того, как все продукты были импортированы и их идентификаторы были добавлены в электронную таблицу, мы начали второй импорт. Мы использовали точно такую ​​же электронную таблицу, с той лишь разницей, что теперь в нее добавлен идентификатор WordPress, добавленный в столбец.

        1. if($product['Associated Parts']):
2.      $assParts = explode('|',$product['Associated Parts']);
3.      unset($assIDs);
4.      foreach($assParts as $assPart):
5.          unset($assID);
6.          if($assPart):
7.              $assID = get_page_by_title( $assPart , 'OBJECT' , 'product' );
8.              $assIDs[] = $assID->ID;
9.          endif;
10.     endforeach;
11.     $assIDs = array_filter($assIDs);
12.     update_field( 'field_542c5dc44272e' , $assIDs , $product['Page ID'] );
13. endif;

Разбивка кода строка за строкой:

  1. Я проверяю, есть ли у этого продукта какие-либо связанные с ним детали.
  2. Я преобразую разделенный по трубам список связанных частей в массив.
  3. Я отключил массив, который мы будем использовать для хранения массива идентификаторов записей. Я делаю это так, чтобы связанные детали из первого продукта еще не сохранялись в массиве, когда мы начинаем обработку второго продукта.
  4. Я начинаю цикл по массиву связанных частей. Каждый элемент в этом массиве содержит заголовок связанной части. Чтобы это работало, заголовки должны быть написаны, отформатированы и во всех остальных отношениях идентичны заголовку поста WordPress.
  5. То же, что 3, только теперь это для этой конкретной связанной части.
  6. Эта строка была добавлена, чтобы убедиться, что я не искал связанную часть, если этот элемент массива был пустой строкой.
  7. Я извлекаю элемент сообщения WordPress, который соответствует названию этого конкретного элемента.
  8. Я добавляю идентификатор связанного продукта в числовой массив.
  9. Закройте оператор if в строке 6.
  10. Завершите цикл связанных продуктов.
  11. Отфильтруйте все пустые строки или нулевые значения из нашего массива идентификаторов записей.
  12. Мы передаем числовой массив, содержащий идентификаторы поста, в функцию «Advanced_field ()» расширенных пользовательских полей. Первый параметр — это уникальный ключ поля настраиваемого поля Post Object. Второй параметр — это массив идентификаторов связанных продуктов. Третий параметр — это идентификатор продукта, который мы редактируем.
  13. Закройте оператор if в строке 1.

Я должен был угадать, какой формат мне нужно было использовать для значения поля. Сначала я попытался передать массив объектов Post, но это не сработало. В редакторе сообщений WordPress я проверил код и увидел, что значением их поля ввода (когда был выбран другой пост) был идентификатор этого сообщения. После переключения на числовой массив, содержащий идентификаторы сообщений, функция update_field () приняла их совершенно без происшествий.

Были сделаны.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]