【问题标题】:How do I update_post_meta with a checkbox array?如何使用复选框数组更新_post_meta?
【发布时间】:2020-02-07 22:26:24
【问题描述】:

如何选择所有选中的选项并填写我的自定义帖子类型复选框字段?

这是表格:

    <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 );
    }
}

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

【问题讨论】:

  • 您是否尝试过打印 $_POST 数据?例如var_dump($_POST); die;。如果帖子数据实际上具有所有值,这将帮助您调试。
  • @LeviCole 是的,我有,数据在那里:["grips"]=> array(3) { [0]=> string(8) "Top (T1)" [1] => string(8) "低 (34)" [2]=> string(11) "底部 (P4)" }

标签: php html wordpress metadata custom-wordpress-pages


【解决方案1】:

我仍然想学习如何处理元数据。但是如果你有 ACF,那么简单的方法是通过:

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

【讨论】:

    【解决方案2】:

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

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

    <?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 函数来处理此检查。

    如果帖子的元字段不存在,则会添加并返回其 ID。

    Find out more here

    并回答您的查询“我想我需要另一个数组函数,因为这个函数只更新单个自定义字段”。

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

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

    以下值被认为是空的:

    • “”(空字符串)
    • 0(0为整数)
    • 0.0(0 作为浮点数)
    • “0”(0作为字符串)
    • 错误
    • array()(一个空数组)

    Find out more here

    【讨论】:

      【解决方案3】:

      那么你可以做的最好的事情是将值保存为json格式,你可以使用maybe_serailizemaybe_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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 2016-07-26
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多