Вопрос или проблема
Я создал 4 пользовательских мета-поля в пользовательской таксономии, и по какой-то причине значения полей для моих 2 текстовых полей обновляются только в первый раз, когда они добавляются в базу данных. Либо при их включении в форму “добавить”, либо если я создаю таксономию без них, а затем включаю их в форму “редактировать” в первый раз. Но как только я пытаюсь изменить значения, база данных не обновляется. Что я делаю не так?
Вот мой код:
// Добавляем поля к таксономии "группы", используя нашу функцию обратного вызова
add_action( 'groups_add_form_fields', 'groups_taxonomy_custom_fields', 10, 2 ); // Форма "Добавить новую"
add_action( 'groups_edit_form_fields', 'groups_taxonomy_custom_fields', 10, 2 ); // Форма "Редактировать"
function groups_taxonomy_custom_fields($term) {
// Получаем страницу
global $pagenow;
// Устанавливаем пустые переменные
$organization = '';
$email_domain = '';
$facilitators = array();
$access_ids = array();
// Если мы на странице "добавить новую"
if ($pagenow == 'edit-tags.php') {
// Настройка таблицы
$cont1 = '<div class="form-field">';
$cont2 = '';
$cont3 = '</div>';
// Если мы на странице редактирования термина
} elseif ($pagenow == 'term.php') {
// Проверяем существующие метаданные таксономии для редактируемого вами термина
$term_id = isset($term->term_id) ? $term->term_id : null;
$organization = get_term_meta( $term_id, 'organization', true );
$email_domain = get_term_meta( $term_id, 'email_domain', true );
if (get_term_meta( $term_id, 'facilitators', true )) {
$facilitators = get_term_meta( $term_id, 'facilitators', true );
}
if (get_term_meta( $term_id, 'access_ids', true )) {
$access_ids = get_term_meta( $term_id, 'access_ids', true );
}
// Настройка таблицы
$cont1 = '<tr class="form-field">
<th scope="row" valign="top">';
$cont2 = '</th>
<td>';
$cont3 = '</td>
</tr>';
// В противном случае ничего
} else {
$cont1 = '';
$cont2 = '';
$cont3 = '';
}
// Давайте получим все коды вебинаров
$codes = get_terms( array(
'taxonomy' => eri_access_id_taxonomy(),
'hide_empty' => false,
'order' => 'DESC',
) );
// Теперь получим всех фасилитаторов
$users = get_users( array(
'role__in' => array( 'facilitator' ),
'orderby' => 'display_name',
'order' => 'ASC'
) );
?>
<!-- ДОБАВИТЕ НЕКОТОРЫЕ CSS -->
<style>
.yoast-notification {
display: none;
}
.editor-training-groups-list {
background: white;
max-height: 20em;
overflow: hidden;
padding-left: 6px;
padding-top: 6px;
width: 94%;
overflow-y:auto;
}
.editor-training-groups-choice {
margin-bottom: 10px;
float: left;
clear: both;
}
.editor-code-label {
vertical-align: top !important;
display: inline !important;
}
.training-type-title {
font-weight: bold;
float: left;
clear: both;
margin-bottom: 10px;
}
</style>
<!-- ПОЛЕ ОРГАНИЗАЦИИ -->
<?php echo $cont1; ?>
<label for="organization"><?php _e('Организация/Группа'); ?></label>
<?php echo $cont2 ?? $cont2; ?>
<input type="text" name="organization" id="organization" size="25" value="<?php echo $organization; ?>"><br />
<span class="description"><?php _e('Полное название организации или группы.'); ?></span>
<?php echo $cont3; ?>
<!-- ПОЛЕ ДОМЕНА EMAIL -->
<?php echo $cont1; ?>
<label for="email_domain"><?php _e('Домен электронной почты'); ?></label>
<?php echo $cont2 ?? $cont2; ?>
<input type="text" name="email_domain" id="email_domain" size="25" value="<?php echo $email_domain; ?>"><br />
<span class="description"><?php _e('Доменное имя электронной почты вашей организации (после символа @), которое пользователи будут в основном использовать для регистрации. (ПРИМЕЧАНИЕ: любой пользователь, который регистрируется с помощью адреса электронной почты с этим доменом, будет автоматически добавлен в эту тренировочную группу.)'); ?></span>
<?php echo $cont3; ?>
<!-- ПОЛЕ ФАСИЛИТАТОРА -->
<?php echo $cont1; ?>
<span><?php _e('Фасилитаторы'); ?></span>
<?php echo $cont2 ?? $cont2; ?>
<div class="editor-training-groups-list">
<?php
// Переменные
$the_users_checked = [];
$the_users = [];
// Проходим по каждому пользователю
foreach ($users as $user) {
$is_checked = false;
$checked = '';
if (in_array($user->ID, $facilitators)) {
$is_checked = true;
$checked = ' checked="checked"';
}
$id = '<div class="editor-training-groups-choice">
<input type="hidden" value="0" name="facilitators['.$user->ID.']">
<input type="checkbox" id="facilitators['.$user->ID.']" name="facilitators['.$user->ID.']" value="1" '.$checked.'/><label for="facilitators['.$user->ID.']" class="editor-code-label">'.$user->display_name.' <span class="limit-length">('.$user->user_email.'): '.$user->organization.'</span></label>
</div>';
if ($is_checked) {
$the_users_checked[] = $id;
} else {
$the_users[] = $id;
}
}
echo implode('', $the_users_checked);
echo implode('', $the_users);
?>
</div>
<span class="description"><?php _e('Выберите фасилитаторов, которые получат доступ к панели управления этим обучением.'); ?></span>
<?php echo $cont3; ?>
<!-- ПОЛЕ ОБУЧЕНИЯ -->
<?php echo $cont1; ?>
<span><?php _e('Обучения'); ?></span>
<?php echo $cont2 ?? $cont2; ?>
<div class="editor-training-groups-list">
<?php
// Давайте получим все коды, чтобы создать ссылку
$tta_names = [];
foreach ($codes as $code) {
$code_names[] = strtolower($code->name);
}
// Создаем пустые массивы для хранения
$tta_names = [];
$ita_names = [];
$uta_names = [];
$tta_checked = [];
$ita_checked = [];
$uta_checked = [];
$tta = [];
$ita = [];
$uta = [];
// Проходим по каждому термину
foreach ($codes as $code) {
$is_checked = false;
$checked = '';
if (in_array($code->name, $access_ids)) {
$is_checked = true;
$checked = ' checked="checked"';
}
$code_title = get_the_title( $code->description );
$li = '<div class="editor-training-groups-choice">
<input type="hidden" value="0" name="access_ids['.$code->name.']">
<input type="checkbox" id="access_ids['.$code->name.']" name="access_ids['.$code->name.']" value="1" '.$checked.'/><label for="access_ids['.$code->name.']" class="editor-code-label">'.$code->name.': <span class="limit-length">'.$code_title.'</span></label>
</div>';
if (eri_is_TTA($code->name)) {
$tta_names[] = strtolower($code->name);
if ($is_checked) {
$tta_checked[] = $li;
} else {
$tta[] = $li;
}
} elseif (eri_is_ITA($code->name)) {
$ita_names[] = strtolower($code->name);
if ($is_checked) {
$ita_checked[] = $li;
} else {
$ita[] = $li;
}
} elseif (eri_is_UTA($code->name)) {
$uta_names[] = strtolower($code->name);
if ($is_checked) {
$uta_checked[] = $li;
} else {
$uta[] = $li;
}
}
}
// Дополнение заголовка
$title_ext=" Техническая помощь";
$top_margin = '30px';
$target = "_blank";
// Добавляем заголовок и элементы списка
if (!empty($tta_checked) || !empty($tta)) {
echo '<div class="training-type-title">Целевые'.$title_ext.': <a href="/wp-admin/edit.php?post_type=page&codes=".implode("%2C',$tta_names).'" target="'.$target.'">('.count($tta_names).')</a></div>';
echo implode('', $tta_checked);
echo implode('', $tta);
}
if (!empty($ita_checked) || !empty($ita)) {
$margin = (!empty($tta_checked) || !empty($tta)) ? ' style="margin-top: '.$top_margin.'"' : '';
echo '<div class="training-type-title"'.$margin.'>Интенсивные'.$title_ext.': <a href="/wp-admin/edit.php?post_type=page&codes=".implode("%2C',$ita_names).'" target="'.$target.'">('.count($ita_names).')</a></div>';
echo implode('', $ita_checked);
echo implode('', $ita);
}
if (!empty($uta_checked) || !empty($uta)) {
$margin = (!empty($tta_checked) || !empty($tta)) || (!empty($ita_checked) || !empty($ita)) ? ' style="margin-top: '.$top_margin.'"' : '';
echo '<div class="training-type-title"'.$margin.'>Универсальные'.$title_ext.': <a href="/wp-admin/edit.php?post_type=post&codes=".implode("%2C',$uta_names).'" target="'.$target.'">('.count($uta_names).')</a></div>';
echo implode('', $uta_checked);
echo implode('', $uta);
}
?>
</div>
<span class="description"><?php _e('Выберите коды вебинаров, к которым эта группа обучения имеет доступ.'); ?></span>
<?php echo $cont3; ?>
<?php
}
// Сохраняем изменения, внесенные в таксономию "группы", форма "добавить новую"
add_action( 'created_groups', 'save_groups_new_custom_fields', 10, 2 );
function save_groups_new_custom_fields( $term_id, $tt_id ) {
if ( isset($_POST['organization']) ) {
add_term_meta( $term_id, 'organization', $_POST['organization'], true );
}
if ( isset($_POST['email_domain']) ) {
add_term_meta( $term_id, 'email_domain', $_POST['email_domain'], true );
}
if ( isset($_POST['access_ids']) ) {
$aid_checked = [];
$access_ids = $_POST['access_ids'];
foreach ($access_ids as $key=>$value) {
if ($value == '1'){
$aid_checked[] = $key;
}
}
add_term_meta( $term_id, 'access_ids', $aid_checked );
}
if ( isset($_POST['facilitators']) ) {
$fac_checked = [];
$facilitators = $_POST['facilitators'];
foreach ($facilitators as $key=>$value) {
if ($value == '1'){
$fac_checked[] = $key;
}
}
add_term_meta( $term_id, 'facilitators', $fac_checked );
}
}
// Сохраняем изменения, внесенные в таксономию "группы", форма "редактировать"
add_action( 'edited_groups', 'save_groups_existing_custom_fields', 10, 2 );
function save_groups_existing_custom_fields( $term_id, $tt_id ) {
if ( isset($_POST['organization']) ) {
update_term_meta( $term_id, 'organization', $_POST['organization'], true ); // <-- ОБНОВЛЯЕТСЯ ТОЛЬКО ОДИН РАЗ
}
if ( isset($_POST['email_domain']) ) {
update_term_meta( $term_id, 'email_domain', $_POST['email_domain'], true ); // <-- ОБНОВЛЯЕТСЯ ТОЛЬКО ОДИН РАЗ
}
if ( isset($_POST['access_ids']) ) {
$aid_checked = [];
$access_ids = $_POST['access_ids'];
foreach ($access_ids as $key=>$value) {
if ($value == '1'){
$aid_checked[] = $key;
}
}
update_term_meta( $term_id, 'access_ids', $aid_checked );
}
if ( isset($_POST['facilitators']) ) {
$fac_checked = [];
$facilitators = $_POST['facilitators'];
foreach ($facilitators as $key=>$value) {
if ($value == '1'){
$fac_checked[] = $key;
}
}
update_term_meta( $term_id, 'facilitators', $fac_checked );
}
}
Интересно, что мои поля чекбоксов обновляются нормально каждый раз, так что что-то происходит с текстовыми полями.
Я разобрался:
update_term_meta( $term_id, 'organization', $_POST['organization'], true );
должно было быть
update_term_meta( $term_id, 'organization', $_POST['organization'] );
Где четвертый параметр делает его уникальным.
Ответ или решение
Причины некорректного обновления метаданных в WordPress: Анализ и решение
Ваша проблема с обновлением метаданных полей organization
и email_domain
в кастомной таксономии WordPress, вероятно, возникла из-за неправильного использования функции update_term_meta()
. Давайте более подробно рассмотрим, что происходит и как это исправить.
Контекст проблемы
Вы указали, что текстовые поля обновляются корректно только при первом добавлении, но не обновляются при дальнейших изменениях. Тем не менее, поля, основанные на чекбоксах, обновляются без проблем. Это говорит о том, что проблема, вероятно, связана с тем, как вы обрабатываете метаданные вашей кастомной таксономии.
Основание проблемы
Ваша строка кода:
update_term_meta( $term_id, 'organization', $_POST['organization'], true );
использует четвёртый параметр true
, который указывает на то, что значение должно быть уникальным. Это означает, что если для данного термина уже существует метаданные с тем же ключом, новое значение не будет добавлено, и функция не обновит его. В результате, изменение метаданных произойдет только один раз — при добавлении, но последующие попытки обновления будут игнорированы, так как update_term_meta
воспринимает, что вы пытаетесь добавить нестандартное значение.
Решение проблемы
Вам необходимо удалить четвёртый параметр из вызова update_term_meta()
для текстовых полей, чтобы позволить обновление метаданных каждый раз:
update_term_meta( $term_id, 'organization', $_POST['organization'] );
update_term_meta( $term_id, 'email_domain', $_POST['email_domain'] );
Это изменит поведение функции таким образом, что она будет обновлять значения каждый раз, как вы этого ожидаете.
Пример исправленного кода
Вот обновленный код для функции сохранения метаданных:
// Сохранение изменений для существующих кастомных полей таксономии
add_action( 'edited_groups', 'save_groups_existing_custom_fields', 10, 2 );
function save_groups_existing_custom_fields( $term_id, $tt_id ) {
if ( isset($_POST['organization']) ) {
update_term_meta( $term_id, 'organization', $_POST['organization'] ); // исправлено
}
if ( isset($_POST['email_domain']) ) {
update_term_meta( $term_id, 'email_domain', $_POST['email_domain'] ); // исправлено
}
if ( isset($_POST['access_ids']) ) {
$aid_checked = [];
$access_ids = $_POST['access_ids'];
foreach ($access_ids as $key => $value) {
if ($value == '1'){
$aid_checked[] = $key;
}
}
update_term_meta( $term_id, 'access_ids', $aid_checked );
}
if ( isset($_POST['facilitators']) ) {
$fac_checked = [];
$facilitators = $_POST['facilitators'];
foreach ($facilitators as $key => $value) {
if ($value == '1'){
$fac_checked[] = $key;
}
}
update_term_meta( $term_id, 'facilitators', $fac_checked );
}
}
Заключение
Теперь, когда вы изменили параметры функции, текстовые поля organization
и email_domain
будут обновляться правильно при каждом изменении. Убедитесь, что в будущем, если вы хотите сохранить уникальные значения, вы можете рассмотреть возможность разработки логики для проверки существующих значений перед их обновлением или использованием другой схемы хранения.
Если у вас будут дополнительные вопросы или вам потребуется дальнейшая помощь, не стесняйтесь обращаться.