Wordpress 自定义 Metabox 复选框保存问题

Posted

技术标签:

【中文标题】Wordpress 自定义 Metabox 复选框保存问题【英文标题】:Wordpress Custom Metabox Checkbox Save Issue 【发布时间】:2017-12-28 16:45:50 【问题描述】:

我创建了一个自定义元框,并在我的网站上使用了一段时间,但它的保存方式存在一些问题。它往往相当不稳定,这意味着在使用 xml 备份或批量编辑时,它总是会丢失数据。

以下是我用于复选框并保存它的代码

function member_page_featured_meta() 
        add_meta_box( 'member_page_meta', __( 'Page Template (if default, select none)', 'member_page_textdomain' ), 'member_page_meta_callback', 'page', 'side', 'low' );
    
add_action( 'add_meta_boxes', 'member_page_featured_meta' );

/**
 * Outputs the content of the meta box
 */

function member_page_meta_callback( $post ) 
    $values = get_post_meta( $post->ID );
    $check = isset( $values['member_box_check'] ) ? esc_attr( $values['member_box_check'][0] ) : '';
    wp_nonce_field( basename( __FILE__ ), 'member_page_nonce' );
    $member_page_stored_meta = get_post_meta( $post->ID );
    ?>

 <p>
    <div class="member_page-row-content">
        <label for="featured-checkbox">
            <input type="checkbox" name="featured-checkbox" id="featured-checkbox" value="yes" <?php if ( isset ( $member_page_stored_meta['featured-checkbox'] ) ) checked( $member_page_stored_meta['featured-checkbox'][0], 'yes' ); ?> />
            <?php _e( 'Member Page', 'member_page_textdomain' )?>
        </label><br />
        <label for="list-checkbox">
            <input type="checkbox" name="list-checkbox" id="list-checkbox" value="yes" <?php if ( isset ( $member_page_stored_meta['list-checkbox'] ) ) checked( $member_page_stored_meta['list-checkbox'][0], 'yes' ); ?> />
            <?php _e( 'Home List', 'member_page_textdomain' )?>
        </label><br />

    </div>
</p>   

    <?php


/**
 * Saves the custom meta input
 */
function member_page_meta_save( $post_id ) 

    // Checks save status - overcome autosave, etc.
    $is_autosave = wp_is_post_autosave( $post_id );
    $is_revision = wp_is_post_revision( $post_id );
    $is_valid_nonce = ( isset( $_POST[ 'member_page_nonce' ] ) && wp_verify_nonce( $_POST[ 'member_page_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false';

    // Exits script depending on save status
    if ( $is_autosave || $is_revision || !$is_valid_nonce ) 
        return;
    

    // Checks for input and saves - save checked as yes and unchecked at no
    //This line of code is my hack (just keeps the boxes from saving pretty much)
    //if (!empty($_POST['featured-checkbox']) && !empty($_POST['list-checkbox'])) 
            if( isset( $_POST[ 'featured-checkbox' ] ) ) 
                update_post_meta( $post_id, 'featured-checkbox', 'yes' );
             else 
                update_post_meta( $post_id, 'featured-checkbox', 'no' );
            ;
            if( isset( $_POST[ 'list-checkbox' ] ) ) 
                update_post_meta( $post_id, 'list-checkbox', 'yes' );
             else 
                update_post_meta( $post_id, 'list-checkbox', 'no' );
            ;
        // (bracket ending the first if statement) 
    
    add_action( 'save_post', 'member_page_meta_save' );

有什么方法可以防止这个问题发生,还是只是保存复选框时必须处理的事情?

我已经整理了一些目前正在使用的技巧,但是每当我需要更改复选框时(这通常取决于它们的使用方式),我必须注释掉几行代码,进行更改,然后取消注释代码行,这有点不合常规。

我主要需要在备份和恢复时让它工作(在我的备份/生产网站上)。

【问题讨论】:

【参考方案1】:

save_post 操作在创建或更新帖子时触发,因此快速编辑和定期编辑以及帖子的导入也会触发它。

在进行快速编辑或导入时,实际上是您的脚本清除了 post 元数据,因为 POST 数组不包含先前保存的复选框值。

要解决这个问题,您可能想知道当前正在发生的“保存类型”,并且仅在管理区域的帖子编辑屏幕上更新帖子元数据。这样做的一种方法是检查 POST 数组的 action 参数,如下所示,因为在从帖子编辑屏幕保存时,action 参数只有值 editpost

if (filter_input(INPUT_POST, 'action') != 'editpost') 
    return;

将此代码放在与save_post 操作挂钩的函数的开头(在您的情况下为member_page_meta_save)将使函数的其余部分仅在从帖子编辑屏幕保存时运行。

【讨论】:

这似乎可以很好地防止快速编辑擦除,但我还没有测试备份,但如果我有任何进一步的问题,我会在这里发表评论。感谢您的帮助:)

以上是关于Wordpress 自定义 Metabox 复选框保存问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义帖子类型上使用Woocommerce的二级图像上传Metabox?

WordPress JavaScript

按元框值自定义帖子类型查询

获取Wordpress查询中的所有类别,自定义字段值?

WooCommerce:将自定义 Metabox 添加到管理订单页面

php 默认隐藏wordpress中的MetaBox