Как мне обновить update_post_meta с массивом флажков? - PullRequest
1 голос
/ 06 февраля 2020

Как мне взять все отмеченные варианты и заполнить поле «Пользовательский тип записи»?

Вот форма:

    <form action="#" method="post">
          <div class="row">
          <div class="column left labels">
<input type="checkbox" name="grips[]" value="Top (T1)"><label>Top (T1)</label>
<input type="checkbox" name="grips[]" value="High (12)"><label>High (12)</label>
                </div>
              <div class="column left labels">
<input type="checkbox" name="grips[]" value="Mid (23)"><label>Mid (23)</label>
<input type="checkbox" name="grips[]" value="Low (34)"><label>Low (34)</label>
              </div>
              <div class="column left labels">
<input type="checkbox" name="grips[]" value="Bottom (P4)"><label>Bottom (P4)</label>
<input type="checkbox" name="grips[]" value="Other"><label>Other</label>
    </div>
    </div>

<input type="submit" name="submit" value="Submit"/>
</form>

Я хочу сделать это, но это не так Это не сработает, оно будет принимать только последнее значение в массиве:

__update_post_meta( $the_post_id, 'grips', $_POST['grips']);

Я пытался выполнить l oop, но это уберет все остальные галочки и оставит только последнюю добавленную:

foreach($_POST['grips'] as $selected){
    echo $selected."</br>";
__update_post_meta( $the_post_id, 'grips', $selected);  
}

Это то, что у меня есть в моих функциях. php Файл: мне кажется, мне нужна другая функция для массивов, так как эта обновляет только отдельные настраиваемые поля:

function __update_post_meta( $post_id, $field_name, $value = '' ) {
    if ( empty( $value ) OR ! $value )
    {
        delete_post_meta( $post_id, $field_name );
    }
    elseif ( ! get_post_meta( $post_id, $field_name ) )
    {
        add_post_meta( $post_id, $field_name, $value );
    }
    else
    {
        update_post_meta( $post_id, $field_name, $value );
    }
}

Здесь это изображение пользовательского поля, которое я установил: enter image description here

Ответы [ 3 ]

1 голос
/ 07 февраля 2020

Я все еще хочу научиться делать это с метаданными. Но если у вас есть ACF, простой способ сделать это через:

$field_key = "grips";
$value = $_POST['grips']; 
update_field( $field_key, $value, $the_post_id );
}
0 голосов
/ 07 февраля 2020

Тогда лучшее, что вы можете сделать, это сохранить значение в формате json, вы можете использовать Maybe_serailize и Maybe_unserialize , чтобы преобразовать массив в json и наоборот.

Во-первых, вы должны присвоить значение тем флажкам, которые можно легко проверить / сравнить с состоянием if. Затем извлеките текущее значение этого мета-блока и проверьте, уже установлены ли какие-либо из этих флажков, и вы можете назначить им проверенный атрибут при загрузке.

Вот пример кода, хотя и НЕ ИСПЫТАН. но это должно дать вам представление

Получение старых значений и назначение отмеченных атрибутов на вашем флажке ввода

$grips = get_post_meta( get_the_ID(), '_grips', true); // Pull the value of meta key
$grips = $grips ? maybe_unserialize( $grips ) : false; // unserialize its value

//Create a function to check if value exist on the array and to assign checked attribute on input checkbox
function _check_grips( $array, $key ) {
    if ( !$array || !is_array( $array ) ) return;
    return in_array($key, $array) ? ' checked': '';
}

Тогда ваш HTML должен выглядеть следующим образом

<form action="#" method="post">
    <div class="row">
        <div class="column left labels">
            <input type="checkbox" name="grips[]" value="1"<?php echo _check_grips('1'); ?>><label>Top (T1)</label>
            <input type="checkbox" name="grips[]" value="2"<?php echo _check_grips('2'); ?>><label>High (12)</label>
        </div>
        <div class="column left labels">
            <input type="checkbox" name="grips[]" value="3"<?php echo _check_grips('3'); ?>><label>Mid (23)</label>
            <input type="checkbox" name="grips[]" value="4"<?php echo _check_grips('4'); ?>><label>Low (34)</label>
        </div>
        <div class="column left labels">
            <input type="checkbox" name="grips[]" value="5"<?php echo _check_grips('5'); ?>><label>Bottom (P4)</label>
            <input type="checkbox" name="grips[]" value="6r"<?php echo _check_grips('6'); ?>><label>Other</label>
        </div>
    </div>
    <input type="submit" name="submit" value="Submit"/>
</form>

Затем, чтобы сохранить значение, просто сделайте что-то вроде ниже

$grips = maybe_serialize( $_POST['grips'] );
__update_post_meta( $the_post_id, '_grips', $grips);
0 голосов
/ 07 февраля 2020

Я сомневаюсь, что следующее полностью решит вашу проблему, но это может помочь сузить причину.

Некоторые изменения, которые я предлагаю внести в вашу пользовательскую функцию ...

<?php

function __update_post_meta( $post_id, $field_name, $value = '' ) {
    if ( empty( $value ) ) {
        delete_post_meta( $post_id, $field_name );
    } else {
        update_post_meta( $post_id, $field_name, $value );
    }
}

Середина шаг в исходном вопросе является излишним, так как WordPress заботится об этой проверке с помощью функции update_post_meta.

Если мета-поле для публикации не существует, оно будет добавлено и его идентификатор будет возвращен.

Узнайте больше здесь

И чтобы ответить на ваш запрос «Мне кажется, мне нужна другая функция для массивов, так как эта функция обновляет только отдельные настраиваемые поля».

Нет. В этом нет необходимости, поскольку функция update_post_meta автоматически сериализует значения.

Наконец, функция empty проверяет наличие пустых строк, поэтому нет необходимости в OR !$value.

Следующие значения считаются пустыми:

  • "" (пустая строка)
  • 0 (0 в виде целого числа)
  • 0.0 (0 в виде числа с плавающей запятой)
  • "0" (0 в виде строки)
  • NULL
  • FALSE
  • array () (пустой массив)

Узнайте больше здесь

...