Как сохранить мульти текстовое поле с WordPress Meta Box - PullRequest
0 голосов
/ 04 мая 2018

сначала извините за мой английский.

Я добавляю простой мета-бокс в мой пользовательский Wordpress Them

Вот мой код add_meta_boxes:

function download_link_boxes()
 {
   $screens = array('post', 'music');

   foreach ($screens as $screen) {
    add_meta_box('dl_link_box', 'LINKS', 'download_box_content',  $screen);
 }

}

Здесь Функции CallBack:

function download_box_content($post)
{
$music_links = get_post_meta($post->ID, 'music-links', 'false');

<input type="text" name="link-music[]" value="<?php echo $music_links ?>">
<input type="text" name="link-music[]" value="<?php echo $music_links ?>">
<input type="text" name="link-music[]" value="<?php echo $music_links ?>">
}

И для обновления и сохранения:

add_action('save_post', 'save_my_music_links');
function save_my_music_links($post_id)
{

if (!isset($_POST['link-music[]'])) {
    return;
}

if(defined('DOING_AUTOSAVE' && DOING_AUTOSAVE)){
    return;
}


$my_links = sanitize_text_field($_POST['link-music[]']);
update_post_meta($post_id, 'music-links', $my_links);
}

Теперь, если изменить имя моего текстового поля на «link-music» вместо «link-music []» и оставить только один текстовый блок, все будет в порядке. Я могу добавлять, обновлять и удалять, но для нескольких текстовых полей ничего не происходит!

1 Ответ

0 голосов
/ 07 мая 2018

Из того, что я вижу при быстром взгляде на ваш код, есть несколько вещей, которые не являются правильными.

Функция download_link_boxes() в порядке. Две другие функции не являются.

Давайте начнем с download_box_content():

  1. Каждый из ваших входов в php, они не могут быть внутри обертки php.
  2. Поскольку вы пытаетесь сохранить данные link-music в виде массива, я ожидаю, что какой-то цикл будет проходить через каждое из значений, то есть после explode самой переменной. Но в вашем случае, если вы ожидаете только 3 значения, используйте формат индекса массива для извлечения каждой ссылки

Теперь, чтобы исправить третью функцию, save_my_music_links(); Вы ищете link-music как массив, т.е. link-music[]. Это не правильно. Даже если в HTML вы используете квадратные скобки, в PHP индекс в $_POST будет только link-music . Так что это должно быть записано как: $_POST['link-music']. Кроме того, ваша функция sanitize_text_field преобразует массив в строку. Возможно, вы захотите перебрать каждое значение и очистить его или использовать array_map

Так что, если вы исправите эти изменения, у вас должно быть что-то подобное в ваших функциях. Php:

function download_box_content($post)
{
    $music_links = get_post_meta($post->ID, 'music-links', 'false');
    ?>
    <input type="text" name="link-music[]" value="<?php echo isset($music_links[0]) ? $music_links[0] : "" ?>">
    <input type="text" name="link-music[]" value="<?php echo isset($music_links[1]) ? $music_links[1] : "" ?>">
    <input type="text" name="link-music[]" value="<?php echo isset($music_links[2]) ? $music_links[2] : "" ?>">
    <?php
}

add_action('save_post', 'save_my_music_links');
function save_my_music_links($post_id)
{

    if (!isset($_POST['link-music'])) {
        return;
    }

    if(defined('DOING_AUTOSAVE' && DOING_AUTOSAVE)){
        return;
    }


    $my_links = array_map("sanitize_text_field",$_POST['link-music']);
    update_post_meta($post_id, 'music-links', $my_links);
}
...