WordPress как на ладони
wordpress jino

создание/обновление терма

Братцы, помогите please решить такую проблему. Совершенно запутался в возвратах функций для работы с термами.
Некий внешний сервис отдает в виде массива ассоциативных массивов информацию об адресообразующих элементах (регион, район, город и т.п.), которые я в соответствии с моей логикой как-то вывожу на своем сайте.
У меня это форма для выбора адреса. из четырех селектов.
Всякий раз дергать внешний сервис мне не интересно, потому результат каждого запроса у меня должен в цикле сохраняться в термах таксономии.
Если без всяких интерфейсных подробностей, таксономия регистрируется следующим образом:

register_taxonomy( 'kladr', array('practice'), array(
'hierarchical' => true,
'labels' => $kladr_labels,
'slug' => 'kladr',
'query_var' => true,
'meta_box_cb' => false,
'show_ui' => true,
'show_in_nav_menus' => true,
'show_admin_column' => false
)
);

Далее я пишу функцию add_kladr_term(), которая по задумке должна сохранять результат запроса в термах иерархической таксономии.
Функция принимает на входе два параметра:

  1. Ассоциативный массив данных о конкретном адресообразующем элементе.
  2. ID родительского терма. По умолчанию 0. т.е. если параметр не передан, создаем терм верхнего уровня.
    Дамп массива адресообразующих элементов выглядит например вот так:
    array(8) {
    ["id"]=> string(13) "4200100003800"
    ["name"]=> string(14) "Панинск"
    ["zip"]=> int(650523)
    ["type"]=> string(18) "Поселение"
    ["typeShort"]=> string(2) "п"
    ["okato"]=> string(11) "32207824009"
    ["contentType"]=> string(4) "city"
    ["parents"]=> array(2) { [0]=> array(7) { ["id"]=> string(13) "4200000000000" ["name"]=> string(22) "Кемеровская" ["zip"]=> int(652472) ["type"]=> string(14) "Область" ["typeShort"]=> string(6) "обл" ["okato"]=> string(11) "32000000000" ["contentType"]=> string(6) "region" } [1]=> array(7) { ["id"]=> string(13) "4200100000000" ["name"]=> string(22) "Кемеровский" ["zip"]=> int(650523) ["type"]=> string(10) "Район" ["typeShort"]=> string(5) "р-н" ["okato"]=> string(11) "32207000000" ["contentType"]=> string(8) "district" } } }

city - это населенный пункт, над которым два родительских элемента: район, в который входит населенный пункт и регион, в который входит район. Родительским является последний элемент подмассива '[parents'. В данном случае это район.

Итак, объявление функции выглядит следующим образом:

function add_kladr_term($array_kladr, $parent = 0) {
// Если нет родительского объекта
if (!isset($array_kladr['parents'])) {
// Создаем или обновляем терм верхнего уровня
// А вдруг терм уже существует?
if ($term_array = term_exists($array_term['id'], 'kladr')) {
// Таки существует. Обновляем его
$new_term = wp_update_term($term_array['term_id'], 'kladr' array(
'slug' => $array_kladr['id'],
'name' => $array_kladr['name']
);
} else {
// Создаем новый терм
$new_term = wp_insert_term($array_kladr['name'], // Новый термин
'kladr', // таксономия
array(
'slug' => $array_term['id'],
) );
}
// При обновлении я беру id из того, что вернула term_exists(), а при создании нового терма- из параметра функции. В обеих случаях обновление и создание нового терма при неудаче должны вернуть ошибку
if (!is_wp_error($new_term)) {
// добавляем метаполя к созданному или обновленному терму
$metas = array(
'zip' => $array_kladr['zip'],
'type' => $array_kladr['type'],
'typeShort' => $array_kladr['typeShort'],
'okato' => $array_kladr['okato'],
'contentType' => $array_kladr['contentType']
);
foreach ($metas as $k => $v) {
add_term_meta($new_term['term_id'], $k, $v, true);
} // End foreach
} else { // Операция добавления/обновления вернула ошибку
return false;
}
return $new_term['term_id'];
} else { // Есть родительские записи
// Порядковый номер родительской записи
$parent_id = count($array_kladr['parents']) -1;
// Родительская запись
$parent_kladr = $array_kladr['parents'][$parent_id];
// Если такого терма не существует, рекурсивно вызываем add_kladr_term()
if (!term_exists($parent_kladr['id'], 'kladr')) $parent_id = add_kladr_term($parent_kladr);
// Проверяем существование целевого терма, с которым мы сейчас работаем
if (term_exists($array_kladr['id'], 'kladr')) {
// Обновляем существующий терм
// Получаем id обновляемого терма
$term_id = get_term_by('name', $array_kladr['name'], 'kladr')->term_id;
$new_term = wp_update_term($term_id, 'kladr' array(
'slug' => $array_kladr['id'],
'name' => $array_kladr['name'],
'parent' $parent_id
);
} else {
// Создаем новый терм
$new_term = wp_insert_term($array_kladr['name'], // Новый термин
'kladr', // таксономия
array(
'slug' => $array_term['id'],
'parent' => $parent_id
) );
}
if (!is_wp_error($new_term)) {
// Добавление/обновление прошло успешно, генерируем метаполя
$metas = array(
'zip' => $array_kladr['zip'],
'type' => $array_kladr['type'],
'typeShort' => $array_kladr['typeShort'],
'okato' => $array_kladr['okato'],
'contentType' => $array_kladr['contentType']
);
foreach ($metas as $k => $v) {
add_term_meta($term['term_id'], $k, $v, true);
} // End foreach
} else { // Операция добавления/обновления вернула ошибку
return false;
}
return $new_term['term_id'];
} // Конец создания дочернего терма
} // End function

При выполнении php упорно ругается на строку, где в первый раз обновляется терм (строка 8 функции). Неожиданный массив, говорит.
Parse error: syntax error, unexpected T_ARRAY in...
Буду чрезвычайно признателен за указание на мои ошибки.

0
horror 4 месяца назад

Нет ответов на этот вопрос.

На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.