Wordpress 自定义元框复选框保存问题
Wordpress Custom Metabox Checkbox Save Issue
我创建了一个自定义元数据框,并在我的网站上使用了一段时间,但它的保存方式有点问题。它往往相当不稳定,这意味着当使用 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' );
有什么方法可以防止这个问题的发生,还是保存复选框时必须处理的问题?
我整理了一些目前有效的 hack,但每当我需要更改复选框时(根据它们的使用方式,这很常见),我必须注释掉几行代码,进行更改,然后取消注释这些代码行,这有点不合常规。
备份和恢复时(在我的 backup/production 网站上),我主要需要让它工作。
创建或更新 post 时会触发 save_post
操作,因此快速编辑和常规编辑以及 post 的导入也会触发它。
实际上是您的脚本在进行快速编辑或导入时清除了 post 元数据,因为 POST 数组不包含先前保存的复选框值。
要解决这个问题,您可能想知道当前发生的 "type of saving",并且只有在管理区域的 post 编辑屏幕上时才更新 post 元数据。一种方法是像下面这样检查 POST 数组的操作参数,因为从 post 编辑保存时 action
参数只有值 editpost
屏幕:
if (filter_input(INPUT_POST, 'action') != 'editpost') {
return;
}
将此代码放在挂钩到 save_post
操作的函数的开头(在您的情况下为 member_page_meta_save
)将使函数的其余部分 运行 只有在从post 编辑屏幕。
我创建了一个自定义元数据框,并在我的网站上使用了一段时间,但它的保存方式有点问题。它往往相当不稳定,这意味着当使用 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' );
有什么方法可以防止这个问题的发生,还是保存复选框时必须处理的问题?
我整理了一些目前有效的 hack,但每当我需要更改复选框时(根据它们的使用方式,这很常见),我必须注释掉几行代码,进行更改,然后取消注释这些代码行,这有点不合常规。
备份和恢复时(在我的 backup/production 网站上),我主要需要让它工作。
创建或更新 post 时会触发 save_post
操作,因此快速编辑和常规编辑以及 post 的导入也会触发它。
实际上是您的脚本在进行快速编辑或导入时清除了 post 元数据,因为 POST 数组不包含先前保存的复选框值。
要解决这个问题,您可能想知道当前发生的 "type of saving",并且只有在管理区域的 post 编辑屏幕上时才更新 post 元数据。一种方法是像下面这样检查 POST 数组的操作参数,因为从 post 编辑保存时 action
参数只有值 editpost
屏幕:
if (filter_input(INPUT_POST, 'action') != 'editpost') {
return;
}
将此代码放在挂钩到 save_post
操作的函数的开头(在您的情况下为 member_page_meta_save
)将使函数的其余部分 运行 只有在从post 编辑屏幕。