如何 update_post_meta 使用复选框数组?

How do I update_post_meta with a checkbox array?

如何获取所有选中的选项并填写自定义 Post 类型复选框字段?

表格如下:

    <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']);

我试图遍历,但这将删除所有其他复选标记,并且只留下最后添加的复选标记:

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

这是我的 Functions.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 );
    }
}

这是我设置的自定义字段的图片:

我仍然想了解如何使用元数据执行此操作。但是如果你有 ACF,最简单的方法是通过:

$field_key = "grips";
$value = $_POST['grips']; 
update_field( $field_key, $value, $the_post_id );
}

我怀疑以下内容能否完全解决您的问题,但它可能有助于缩小原因范围。

我建议对您的自定义函数进行一些更改...

<?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 函数负责此检查。

If the meta field for the post does not exist, it will be added and its ID returned.

Find out more here

并回答您的问题 "I imagine I need another function for arrays since this one only updates single custom fields"。

没有。这不是必需的,因为 update_post_meta 函数会自动序列化值。

最后,empty 函数检查空字符串,因此不需要 OR !$value

The following values are considered to be empty:

  • "" (an empty string)
  • 0 (0 as an integer)
  • 0.0 (0 as a float)
  • "0" (0 as a string)
  • NULL
  • FALSE
  • array() (an empty array)

Find out more here

那么你能做的最好的事情就是将值保存为 json 格式,你可以使用 maybe_serailize and maybe_unserialize 将数组转换为 json 并反转。

首先,您应该为那些可以很容易 check/compared 使用 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);