无法在帖子中保存和显示更新的自定义多选下拉字段

Posted

技术标签:

【中文标题】无法在帖子中保存和显示更新的自定义多选下拉字段【英文标题】:Unable to save and display updated custom multi-select dropdown fields in post 【发布时间】:2021-08-11 01:50:35 【问题描述】:

我在 woocommerce shop_order 页面中显示了一个自定义多选下拉菜单。 select2 多下拉菜单完美地工作并正确显示字段。但我也想在更新按钮上保存选定的字段,一旦页面重新加载,它将不会在框中显示以前保存的字段。这是我的代码


add_action( 'admin_menu', 'rudr_metabox_for_select2' ); 
function rudr_metabox_for_select2() 
  add_meta_box( 'rudr_select2', 'Stock Details', 'rudr_display_select2_metabox', 'shop_order', 'side', 'default' );


function rudr_display_select2_metabox( $post_object ) 
  global $wpdb;
?>

<select data-placeholder="Select item..." id="rudr_select2_tags" name="rudr_select2_tags" multiple="multiple" class="chosen-select" style="width: 100% !important">
        <option value=""></option>
        <?php
        $table = $wpdb->prefix.'dvs_stock_details';
        $rows = $wpdb->get_results("SELECT * FROM $table ORDER BY item ASC");
        foreach($rows as $row)
            echo "<option value='strtolower($row->item)'>$row->item</option>";
        
        ?>
    </select>
<?php

 
 
add_action( 'save_post', 'rudr_save_metaboxdata', 10, 2 ); 
function rudr_save_metaboxdata( $post_id, $post ) 
 
  if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
 
  if ( $post->post_type == 'shop_order' ) 
    if( isset( $_POST['rudr_select2_tags'] ) )
      update_post_meta( $post_id, 'rudr_select2_tags', $_POST['rudr_select2_tags'] );
    else
      delete_post_meta( $post_id, 'rudr_select2_tags' );
  
  return $post_id;



add_action( 'admin_enqueue_scripts', 'rudr_select2_enqueue' );
function rudr_select2_enqueue()
  wp_enqueue_style('select2', 'https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css' );
  wp_enqueue_script('select2', 'https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js', array('jquery') );
  wp_enqueue_script('mycustom', get_stylesheet_directory_uri() . '/mycustom.js', array( 'jquery', 'select2' ) ); 

这是我加载订单页面时的屏幕,它显示了所有 100% 正确的下拉列表。

但是当我添加字段并单击更新时,页面会重新加载,并且它没有保存该 post_id 中的字段,也没有显示以前选择的字段。

请帮忙。

【问题讨论】:

【参考方案1】:

您的代码中出现了一些问题。

将此name="rudr_select2_tags" 更改为此name="rudr_select2_tags[]" 这样您就可以在服务器中将数据作为数组抓取。

像这样修改你的 rudr_save_metaboxdata 函数。

add_action( 'save_post', 'rudr_save_metaboxdata', 10, 2 );
function rudr_save_metaboxdata( $post_id, $post ) 
    if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
        return $post_id;
     
    if( $post->post_type == 'shop_order' ) 
        if( isset( $_POST['rudr_select2_tags'] ) ) 
            $stock_data = $_POST['rudr_select2_tags'];
            if( !empty( $stock_data ) ) 
                $stock_data = array_map( 'sanitize_text_field', $stock_data ); 
                update_post_meta( $post_id, 'rudr_select2_tags', $stock_data );
            
        
    

    return $post_id;

为了更好的安全性,您可以在将数据保存在数据库中时使用WordPress nonces。

然后像这样修改你的rudr_display_select2_metabox函数。

function rudr_display_select2_metabox( $post_object ) 
  global $wpdb;
?>

    <select data-placeholder="Select item..." id="rudr_select2_tags" name="rudr_select2_tags[]" multiple="multiple" class="chosen-select" style="width: 100% !important">
        <?php
        $table = $wpdb->prefix.'dvs_stock_details';
        $rows = $wpdb->get_results("SELECT * FROM $table ORDER BY item ASC");

        // get current item
        $current_item = get_post_meta( $post_object->ID, 'rudr_select2_tags', true );
      
        foreach($rows as $row)
            if( !empty( $current_item ) && in_array( $row->item, $current_item ) ) 
                echo '<option value="'. $row->item .'" selected>'.$row->item.'</option>';
             else 
                echo '<option value="'. $row->item .'">'.$row->item.'</option>';
            
        
        ?>
    </select>
<?php

rudr_metabox_for_select2 函数的更好钩子将是 add_meta_boxes 根据Documentation

【讨论】:

以上是关于无法在帖子中保存和显示更新的自定义多选下拉字段的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Composer 自定义网格模板上显示自定义字段图像

从 CTP 添加自定义 WooCommerce 下拉结帐字段

Wordpress 过滤多个下拉分类以通过 ajax 显示自定义字段

如何在具有帖子类型的自定义页面上显示所有图像字段

在 Wordpress 中使用 ACF(高级自定义字段)显示自定义帖子标题的下拉菜单

在 Django 模板的 Bootstrap 4 多选下拉列表中显示多选字段值