【问题标题】:How to uncheck an acf checkbox with delete_post_meta如何使用 delete_post_meta 取消选中 acf 复选框
【发布时间】:2014-09-13 23:55:41
【问题描述】:

我正在开发一个 wp 插件,人们可以在其中加入/取消加入活动。

到目前为止我做了什么:

我制作了一个自定义帖子类型“票证”,其中包含一个动态填充“事件”帖子的帖子标题的 ACF 复选框。在单个事件上,人们可以单击一个按钮,该按钮将创建一个带有 ACF 复选框选中值的票务帖子。如果用户已经有票,它将更新票帖。这一切都很好。

我想要什么:

当用户想取消加入活动时,acf 值必须取消选中。我已经尝试了几件事,比如delete_post_meta($RegisterTicket, 'my_custom_field', $eventname );

部分代码:

在这部分代码之前,我定义了是否必须创建或更新票帖。然后是:

/* Get the current field state */     
    $field_checked = get_field($field_key, $mypostid);             

            /* Check if the posttitle already is checked, if so delete_post_meta */
            if(is_array($field_checked) && in_array($eventname, $field_checked)) { 

              delete_post_meta($RegisterTicket, 'my_custom_field', $eventname );

            }  else {
              /* if not already checked, add the title to the array so it will be checked and update_post_meta */
              $field_checked[] = $eventname;      
              update_post_meta($RegisterTicket, 'my_custom_field', $field_checked );
            }  


        update_post_meta($RegisterTicket, 'user', $TheUserID); 

delete_post_meta 不起作用,选中的值没有被取消选中。如何解决这个问题?提前致谢。

【问题讨论】:

  • 你的If语句是真的吗?
  • 是的。我用回声检查了它。

标签: php wordpress checkbox advanced-custom-fields


【解决方案1】:

您需要检查删除帖子元。

将结果分配给一个变量:

if(is_array($field_checked) && in_array($eventname, $field_checked)) { 

         $result =delete_post_meta($RegisterTicket, 'my_custom_field', $eventname );
         echo '<h1>'.$result.'</h1>';
        }  else {
          /* if not already checked, add the title to the array so it will be checked and update_post_meta */
          $field_checked[] = $eventname;      
          update_post_meta($RegisterTicket, 'my_custom_field', $field_checked );
        }  

如果它是假的,你需要检查 $RegisterTicket 是一个帖子 id、'mycustomfield' 和 $eventname,其中一个是不正确的。有时要删除的 var 是错误的。另一种方法是从数据库中提取它,这样就不会出现错误。

$field_checked= get_post_meta($RegisterTicket, 'my_custom_field', true);

或者只是删除帖子中包含该字段的所有键:

delete_post_meta($RegisterTicket, 'my_custom_field');

【讨论】:

  • 感谢您的回复。正如你所说,我已经改变了一些位。 get_field($field_key, $mypostid); 现在更改为 get_post_meta($RegisterTicket, 'my_custom_field', true);。我添加了 $result 变量。我添加了一些 var_dumps 来检查 if 语句中的变量。它给出:$RegisterTicket = int(1996) $eventname = Opening $result = bool(false)。 field_checked 给出:array(2) { [0]=&gt; string(14) "Suited Reality" [1]=&gt; string(7) "Opening" } 为什么结果 bool 为假?
  • 因为您正在寻找数组,Mysql 不会这样存储数组,您可以序列化(php 函数)并保存该字符串并在从数据库中获取时将其反序列化。哪个值实际保存到数据库中? (检查 post_meta 表)。如果设置了 true,get_post_meta 函数将只返回一个值。但实际上对于这个操作,每个帖子应该只有 1 个相同的键!
  • 好的。 如果设置为 true,get_post_meta 函数将只返回一个值 实际上它响应的是我的复选框的选中值的数组。我认为 delete_post_meta 可以取消选中该值,就像 update_post_meta 会检查它一样。
  • 我检查了我的 post_meta 表。例如 post id: 1996 有 meta_key my_custom_field 和 meta_value a:2:{i:0;s:14:"Suited Reality";i:1;s:7:"Opening ";}
【解决方案2】:

搞定了。虽然 ACF 复选框将它们的值存储在一个数组中,但我们需要取消设置该数组中的值以取消选中它。

这就是我所做的:

$field_checked = get_field($field_key, $mypostid);

假设 $field_checked = 事件 1、事件 2 和事件 5 的数组

在这种情况下,get_field 是一个 acf 函数(因此它将返回事件 1、2 和 5)。我们也可以在这里使用 get_post_meta 和相应的变量。然后是:

    if(is_array($field_checked) && in_array($eventname, $field_checked)) { 
      if(($key = array_search($eventname, $field_checked)) !== false) {
           unset($field_checked[$key]);

      }

    }  else {

      $field_checked[] = $eventname;      

    }  

update_post_meta($RegisterTicket, 'my_custom_field', $field_checked );
update_post_meta($RegisterTicket, 'user', $TheUserID);

首先我们检查值是否存储在数组中,然后检查值是否已经在数组中(因此我们检查它是否被检查)。如果是:我们想从数组中取消设置变量。 unset 只对 key 起作用,所以我们需要先用 array_search 搜索 key。然后我们将取消设置它,这意味着我们将值从数组中删除。

简而言之: 如果 $eventname = '事件 5' $field_checked 将是事件 1 和事件 2 的数组。

update_post_meta 最终会更新帖子并保存正确的复选框数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2014-11-18
    相关资源
    最近更新 更多