使用DELETE_POST_META删除多个选定选项

时间:2016-10-22 作者:Shwan Namiq

我使用的导航菜单中有多个选定框add_post_meta() 用于添加值和delete_post_meta 用于删除选定选项。代码工作,意味着添加和删除选项正确,但我有一个小问题

删除选项时delete_post_meta() 删除所选选项(第一个选项除外)意味着仍保留其中一个选项,我无法删除它

在删除所有选定选项之前,我如何管理下面的代码?

if(!empty($_REQUEST[\'menu-item-custom-category\'][$menu_item_db_id])) {
    delete_post_meta($menu_item_db_id, \'_menu_item_custom_category\');
    $values = $_REQUEST[\'menu-item-custom-category\'][$menu_item_db_id];
    foreach($values as $value) {
        add_post_meta($menu_item_db_id, \'_menu_item_custom_category\', $value);
    }
}

$item->custom_category = get_post_meta( $item->ID, \'_menu_item_custom_content\');
这是我的多选框

<p class="field-custom-category description description-thin">
<label for="edit-menu-item-custom-category-<?php echo $item_id; ?>">
    <?php _e( \'Custom Categories\' ); ?><br />
    <select name="menu-item-custom-category[<?php echo $item_id; ?>][]" id="edit-menu-item-custom-category-<?php echo $item_id; ?>" class="widefat code edit-menu-item-custom-category" multiple>
        <?php
            $YPE_cats = get_categories();
            foreach ($YPE_cats as $YPE_cat) { ?>
                <option value="<?php echo $YPE_cat->slug; ?>"  <?php echo selected(in_array($YPE_cat->slug, $item->custom_category)); ?>><?php echo $YPE_cat->name;?></option><?php
            }
        ?>
    </select>
</label>
</p>

2 个回复
最合适的回答,由SO网友:cybmeta 整理而成

我认为这只是一个逻辑问题。如果未选择任何值,$_REQUEST[\'menu-item-custom-category\'][$menu_item_db_id] 为空。那么,下一行delete_post_meta() 在代码中从未触发。只需按照逻辑思考,您需要知道何时删除之前的元值。

例如:

if( !empty( $_REQUEST[\'menu-item-custom-category\'][$menu_item_db_id] ) ) {

    // Delete all previous values from database and save
    // only the selected values in the current request
    delete_post_meta( $menu_item_db_id, \'_menu_item_custom_category\' );

    $values = $_REQUEST[\'menu-item-custom-category\'][$menu_item_db_id];

    if( is_array( $values ) ) {
        // We have several values
        // Sanitize values first (needed if you have not registered a sanitization callback with register_meta())
        $values = array_map( \'sanitize_text_field\', wp_unslash( $_REQUEST[\'menu-item-content-multiple\'][$menu_item_db_id] ) );
        foreach( $values as $value ) {
            add_post_meta( $menu_item_db_id, \'_menu_item_custom_category\', $value );
        }
    } else {
        // We have single value
        add_post_meta( $menu_item_db_id, \'_menu_item_custom_category\', sanitize_text_field( $values ) );
    }

} else {

    // All values unselected, delete all of them from post meta
    delete_post_meta($menu_item_db_id, \'_menu_item_custom_category\');

}
这可以优化,因此只添加新值,只删除取消选择的值,而不需要每次都删除和添加所有内容。例如(基于this answer):

if ( empty( $_REQUEST[\'menu-item-content-multiple\'][$menu_item_db_id] ) ) {

   // no values selected, delete all post meta for our key
   delete_post_meta( $menu_item_db_id, \'_menu_item_content_multiple\' );

} else {

  $old_values = get_post_meta( $menu_item_db_id, \'_menu_item_custom_category\' );
  $new_values = $_REQUEST[\'menu-item-content-multiple\'][$menu_item_db_id] 
  $values_to_skip = array();

  if( !empty( $old_values ) ) {

    foreach( $old_values as $old_value ) {

      if ( ! in_array( $old_value, $new_values ) ) {

        // this value was in meta, but now it is not selected,
        // so it has to be deletec
        delete_post_meta( $menu_item_db_id, \'_menu_item_custom_category\', $old_value );

      } else {

        // This value was in meta and it is selected again,
        // So, we don\'t need to save it again
        $values_to_skip[] = $old_value;

      }
    }
  }

  // Get the values that are not already in database
  // And store them
  $values_to_save = array_diff( $new_values, $values_to_skip );

  if ( ! empty( $values_to_save ) ) {

    foreach ( $values_to_save as $value ) {

       add_post_meta( $menu_item_db_id, \'_menu_item_content_multiple\', $value );

    }
  }
}

SO网友:SAFEEN 1990

在选择任何值之前,您没有array() 意味着您必须选择选项,直到$_REQUEST[\'menu-item-custom-category\'][$menu_item_db_id] 成为array(). 要进行检查,必须使用phpis_array() 作用

然后,当您取消选择选项时$_REQUEST[\'menu-item-custom-category\'][$menu_item_db_id]) 不作为数组保留。那么在这种情况下delete_post_meta() 在指定的_menu_item_content_multiple 指定的元键

意味着您必须使用if()else{} php条件语句如下

<?php
    if(is_array($_REQUEST[\'menu-item-content-multiple\'][$menu_item_db_id])) {
        $values = $_REQUEST[\'menu-item-content-multiple\'][$menu_item_db_id];
        foreach($values as $value) {
            add_post_meta($menu_item_db_id, \'_menu_item_content_multiple\', $value);
        }
    } else {
        delete_post_meta($menu_item_db_id, \'_menu_item_content_multiple\');
    }
?>

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在