Вопрос или проблема
update_post_meta()
продолжает добавлять элементы в массив вместо замены значения. Есть какие-нибудь советы?
Ранее я по ошибке использовал add_post_meta()
, и, возможно, это как-то пометило поле как массив?
Обновление
Как я могу установить метаполе, чтобы оно НЕ было массивом?
код:
$lowjobtrig = 1;
foreach ( $values as $value ) :
//====================myedit==================
if ($key == 'public_paywall') {
if ($value == 'paywall') {
add_post_meta($postId, $key, $value, /*unique=*/ false);
} elseif ($value == 'public') {
add_post_meta($postId, $key, $value, /*unique=*/ false);
}
} elseif ($key == 'pay_offer') {
if ($value == 'pay') {
add_post_meta($postId, $key, $value, false);
} elseif ($value == 'no pay') {
add_post_meta($postId, $key, $value, false);
} else {
}
} elseif ($key == 'low_jobs' AND $value == 'under 100') {
$lowjobtrig = 1;
update_post_meta($postId, $key, 'under 100');
} elseif ($key == 'low_jobs' AND $value != 'under 100' AND $lowjobtrig == 0) {
add_post_meta($postId, $key, 'OVER 100', true);
$lowjobtrig = 1;
}
else {
FeedWordPress::diagnostic('syndicated_posts:meta_data', ">>>>>>>>>>ELSE Добавление метаданных поста [$postId]: [$key] = ".MyPHP::val($value, /*no newlines=*/ true));
add_post_meta($postId, $key, $value, /*unique=*/ false);
}
Из кода, который вы поделились, следует, что строка ниже FeedWordPress::diagnostic()
может быть ответственной за дублирование пользовательского поля low_jobs
.
Если в цикле встречается ключ low_jobs
и:
$value == 'under 100'
, тогда поле будет обновлено$value != 'under 100' AND $lowjobtrig == 0
, тогда если метаlow_jobs
не существует, она будет создана, но$lowjobtrig
всегда1
- в других случаях мета
low_jobs
будет создана, даже если она уже существует
Так что каждый раз, когда ключ low_jobs
и значение отличается от under 100
, эта строка
add_post_meta($postId, $key, 'OVER 100', true);
не будет выполнена. Вместо этого будет выполнен следующий код:
FeedWordPress::diagnostic( ... );
add_post_meta($postId, $key, $value, /*unique=*/ false); // <---
Ответ или решение
Проблема с update_post_meta
: добавление в массив вместо замены значения
Ваша проблема заключается в том, что функция update_post_meta()
в WordPress добавляет новые значения в массив вместо замены уже существующего значения. Это может происходить по нескольким причинам, и давайте рассмотрим, как это можно исправить.
Причины и решение
-
Понимание работы
add_post_meta()
иupdate_post_meta()
:add_post_meta($postId, $meta_key, $meta_value, $unique)
— добавляет мета-данные к записи. Если значение мета-данных с тем же ключом уже существует, оно будет добавлено как новое, если аргумент$unique
равенfalse
. Если$unique
равенtrue
, добавлять будет только в том случае, если этот ключ отсутствует.update_post_meta($postId, $meta_key, $meta_value)
— обновляет значение мета-данных. Если мета-данные с указанным ключом не существуют, они будут созданы, а если существуют, старое значение будет заменено на новое.
-
Проблема с флагом массива:
Еслиadd_post_meta()
используется до вызоваupdate_post_meta()
, то мета-данные могут быть добавлены в массив и WordPress будет считать, что это массив. Если следующие вызовы будут выполнятьupdate_post_meta()
, они не заменят значение, а добавят его в уже существующий массив. Это указывает на то, что поле уже было определено как массив. -
Как заставить поле не быть массивом:
Если вы хотите, чтобы поле не было массивом, вы можете сделать следующее:-
Удалите все текущие значения мета-данных перед обновлением:
delete_post_meta($postId, $key); // Удаление всех мета-данных с этим ключом update_post_meta($postId, $key, 'новое значение'); // Установка нового значения
-
Проверьте логику в вашем цикле:
Убедитесь, что ваша логика не вызывает добавление данных в массивы каждый раз, когда вы обновляете значения. Например, если код обрабатывает различные состояния, убедитесь, что все сценарии корректно обрабатываются, а лишние вызовы кadd_post_meta()
минимизированы:if ($key == 'low_jobs') { if ($value == 'under 100') { update_post_meta($postId, $key, 'under 100'); } else { // В этом случае вы можете просто установить значение, не добавляя его как новый элемент update_post_meta($postId, $key, 'OVER 100'); } }
-
-
Использование уникальных ключей:
Если ваше приложение требует, чтобы по одному ключу было несколько значений, рассмотрите возможность добавления уникальных идентификаторов к ключам мета-данных.
Вывод
Для решения проблемы с добавлением в массив вместо замены значения в мета-данных WordPress, вам нужно избегать использования add_post_meta()
, когда вы намерены обновить существующее значение. Применяйте delete_post_meta()
перед update_post_meta()
, если хотите убедиться, что поле не будет массивом. Перепроверка логики вашего кода поможет избежать нежелательного поведения, где значение добавляется вместо замены.
Следуя указанным выше рекомендациям и оптимизируя логику функции обработки мета-данных, вы сможете добиться желаемой функциональности.