Как сохранить несколько значений input с одинаковым meta_key

1 мар. 2011 г., 16:34:13
Просмотры: 13.5K
Голосов: 2

Есть ли способ сохранить значения из нескольких полей пользовательских метабоксов с одинаковым meta_key? Я использую следующий код для сохранения ОДНОГО значения с meta_key 'startdate':

function startdate() {
  global $post;
  $custom = get_post_custom($post->ID);
  $startdate = $custom["startdate"][0];
  ?>

<label>Дата начала</label><br/>
<input type="text" name="startdate" value="<?php echo $startdate; ?>"/>

<?php }

add_action('save_post', 'save_details');
function save_details(){
  global $post;
  update_post_meta($post->ID, "startdate", $_POST["startdate"]);
}

Если бы у меня было второе поле ввода, как я могу сохранить его значение с другим meta_id, но тем же meta_key (startdate)? Большое спасибо!

(Если использовать встроенную функциональность пользовательских полей, можно сохранить несколько значений для одного и того же meta ключа...)

7
Комментарии

Да, просто создайте массив данных, обновите имена полей на name="startdate[]"

t31os t31os
1 мар. 2011 г. 16:43:12

Моя проблема в том, что у меня есть решение для пользовательского запроса, которое работает без массивов. http://wordpress.stackexchange.com/questions/10328/custom-post-type-event-chronological-list-of-recurring-events/10390#10390 Я не знаю, как сделать запрос с массивом.

Christoph Christoph
1 мар. 2011 г. 16:55:51

Что вы пытаетесь получить из этого запроса?

Bainternet Bainternet
1 мар. 2011 г. 17:38:13

Я пытаюсь получить хронологический список событий. Суть в том, что каждое событие (произвольный тип записи) может иметь несколько дат, добавленных как метаданные. @Scribu показал, как выполнить запрос, если метаданные хранятся как отдельные произвольные поля с одинаковым meta_key http://wordpress.stackexchange.com/questions/10328/custom-post-type-event-chronological-list-of-recurring-events

Christoph Christoph
1 мар. 2011 г. 17:59:15

Есть ли причина, по которой вы не можете использовать встроенную функциональность произвольных полей для ввода этих дат? Раз уж вы храните это в метаданных, почему бы не вводить эти даты в стандартном метабоксе?

t31os t31os
2 мар. 2011 г. 00:53:06

@t31os: Если вы спросите меня, интерфейс произвольных полей — один из самых неудачных элементов интерфейса, оставшихся в WP. Он для разработчиков, а не для пользователей. Поэтому я не могу винить тех, кто хочет реализовать метабокс вместо этого.

wyrfel wyrfel
2 мар. 2011 г. 02:16:41

Даты — это лишь небольшая часть пользовательского типа записи. Проект представляет собой сайт театра. Этот пользовательский тип записи предназначен для постановок. У постановки есть изображения, даты, время, актёрский состав, режиссёр, место проведения, описание и так далее... Мне нужно, чтобы интерфейс был очень чистым и интуитивно понятным. Сейчас я беспокоюсь, что застрял на этой проблеме "множественные значения / один ключ", и, возможно, лучше было бы искать запрос, который работает с массивом... Ох уж это!

Christoph Christoph
2 мар. 2011 г. 02:21:54
Показать остальные 2 комментариев
Все ответы на вопрос 2
2

Измените вашу форму, как предложено:

function startdate() {
    global $post;
    $custom = get_post_custom($post->ID);
    echo "<label>Даты начала</label><br/>";
    for ($i=0; $i<count($custom["startdate"]);$i++) {
        echo "<input type=\"text\" name=\"startdate[".$i."]\" value=\"".$custom["startdate"][$i]."\" />";
    }
}

Вам потребуется удалить и заново установить ваши индивидуальные записи postmeta:

add_action('save_post', 'save_details');

function save_details($post_id) {
    if ($parent_id = wp_is_post_revision($post_id)) $post_id = $parent_id;

    if (!empty($_POST['startdate']) && is_array($_POST['startdate'])) {
        delete_post_meta($post_id, 'startdate');
        foreach ($_POST['startdate'] as $startdate) {
            add_post_meta($post_id, 'startdate', $startdate);
        }
    }
}

Затем, конечно, вам понадобится добавить какой-нибудь механизм добавления/удаления в форму метабокса, вероятно, через JS.

1 мар. 2011 г. 21:29:02
Комментарии

Ого, почти готово! У меня две проблемы: (1) Когда я создаю новую запись (событие), в области редактирования появляется предупреждение: "Warning: Invalid argument supplied for foreach()". Когда я ввожу даты в форму и сохраняю запись, значения корректно сохраняются как отдельные записи postmeta (я вижу их в базе данных), и предупреждение исчезает. Но (2) при перезагрузке значения meta_values не устанавливаются как значения полей формы, поэтому поля формы выглядят пустыми. Есть идеи, как решить эти проблемы? Большое спасибо!

Christoph Christoph
2 мар. 2011 г. 00:37:50

@Christoph: Извини, это моя невнимательность. Во-первых, wp_is_post_revision() принимает ID записи в качестве параметра, затем я неправильно настроил атрибут value для полей ввода в форме, и наконец, я добавил базовые проверки в функцию обновления. Смотри изменения.

wyrfel wyrfel
2 мар. 2011 г. 02:03:53
1

Как упомянул t31os, попробуйте изменить ваши поля формы, чтобы использовать name="startdate[]", затем пройдитесь по массиву, сохраняя каждое значение:

foreach ($_POST["startdate"] as $datevalue) {
    update_post_meta($post->ID, "startdate", $datevalue);
}
1 мар. 2011 г. 19:33:48
Комментарии

Для тех, кто все еще читает эту страницу, этот ответ неверен. Каждая итерация будет перезаписывать значение post_meta вместо добавления дополнительных post_meta с тем же именем.

brett brett
18 сент. 2019 г. 13:57:04