Как снять флажок acf с помощью delete_post_meta

Я работаю над плагином 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 не работает, отмеченное значение не снимается. Как это решить? Заранее спасибо.


person Trekdrop    schedule 22.07.2014    source источник
comment
Ваше утверждение If верно?   -  person David    schedule 23.07.2014
comment
Да, это так. Проверил эхом.   -  person Trekdrop    schedule 23.07.2014


Ответы (2)


Вам нужно проверить мета удаления сообщения.

Назначьте результат переменной:

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 - это идентификатор сообщения, mycustomfield и $ eventname, одно из них будет неверным. иногда удаляемая переменная неверна в зависимости от конкретного случая. Альтернативный способ сделать это - извлечь его из базы данных, чтобы не было ошибок.

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

или просто удалите все ключи с этим полем для сообщения:

delete_post_meta($RegisterTicket, 'my_custom_field');
person David    schedule 23.07.2014
comment
Спасибо за ваш ответ. Я изменил некоторые детали, как вы сказали. get_field($field_key, $mypostid); теперь изменен на get_post_meta($RegisterTicket, 'my_custom_field', true);. Я добавил $ result var. И я добавил несколько var_dumps для проверки переменных внутри оператора if. Это дает: $ RegisterTicket = int(1996) $ eventname = Opening $ result = bool(false). Поле field_checked дает: array(2) { [0]=> string(14) "Suited Reality" [1]=> string(7) "Opening" } Почему результат bool ложный? - person Trekdrop; 23.07.2014
comment
поскольку вы ищете массив, Mysql не хранит массивы как таковые, вы можете сериализовать (функция php) и сохранить эту строку и десериализовать ее при взятии из базы данных. какое значение фактически сохраняется в базе данных? (проверьте таблицу post_meta). Функция get_post_meta вернет только одно значение, если установлено true. Но на самом деле для этой операции действительно должен быть только 1 такой же ключ на каждый пост! - person David; 23.07.2014
comment
Хорошо. Функция get_post_meta будет возвращать только одно значение, если установлено true Фактически она отвечает массивом отмеченных значений моего флажка. Я думал, что delete_post_meta сможет снять отметку с этого значения, точно так же, как update_post_meta проверит его. - person Trekdrop; 23.07.2014
comment
Я проверил свою таблицу post_meta. Например, идентификатор сообщения: 1996 имеет мета-ключ my_custom_field с мета_значением a: 2: {i: 0; s: 14: Suited Reality; i: 1; s: 7: Opening;} < / b> - person Trekdrop; 23.07.2014

Все заработало. В то время как флажки 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 работает только с ключом, поэтому нам нужно сначала найти ключ с помощью array_search. А затем мы отключим его, что означает, что мы удалим значение из массива.

Вкратце: если $ eventname = 'Event 5', $ field_checked будет массивом событий 1 и 2.

update_post_meta в конечном итоге обновит сообщение и сохранит правильный массив флажков.

person Trekdrop    schedule 23.07.2014