我有一个元盒子。它几乎可以正常工作了。除了它不节省空间。例如,如果我输入London City
保存的数据将为LondonCity
我看了一下这个SE:Why is my custom meta box input not saving和替换sanitize_html_class
具有esc_attr
但随后我收到以下错误消息:
Parse error: syntax error, unexpected end of file in [FILEPATH]/functions.php on line 235
我也试着替换
sanitize_html_class
具有
sanitize_text_field
但是,保存功能停止工作,输入的数据根本不保存。我也试着什么都不用
esc_html
但同样的情况也会发生(values does\'nt save/update)
我在干什么/我错过了什么?
元框的完整代码:
add_action( \'load-post.php\', \'city_meta_box_setup\');
add_action( \'load-post-new.php\', \'city_meta_box_setup\');
function city_meta_box_setup() {
add_action( \'add_meta_boxes\', \'city_add_meta_box\');
add_action( \'save_post\', \'city_save_meta\', 10,2);
}
function city_add_meta_box() {
add_meta_box(
\'city_id\', // $ID
\'City\', // $TITLE
\'city_meta_box\', // $CALLBACK
\'properties\', // $PAGE
\'normal\', // $CONTEXT
\'default\' // $PRIORITY
);
}
function city_meta_box($Object, $box) {
/* wp nonce-hash */
wp_nonce_field( basename(__FILE__), \'city_nonce\'); ?>
<p>
<label for="city-id"><?php _e("Where is this property located? ex. New York", \'default\'); ?> </label>
<br/>
<input class="widefat" type="text" name="city_id" id="city_id" value="<?php echo esc_attr( get_post_meta( $Object->ID, \'city_id\', true ) ); ?>" size="30" />
</p>
<?php }
function city_save_meta( $post_id, $post ) {
if ( !isset( $_POST[\'city_nonce\']) || !wp_verify_nonce( $_POST[\'city_nonce\'], basename(__FILE__) ) )
return $post_id;
$post_type = get_post_type_object( $post->post_type);
if ( !current_user_can( $post_type->cap->edit_post, $post_id ) )
return $post_id;
$new_meta_value = ( isset( $_POST[\'city_id\'] ) ? sanitize_html_class( $_POST[\'city_id\']) : \'\');
$meta_key = \'city_id\';
$meta_value = get_post_meta( $post_id, $meta_key, true );
if ( $new_meta_value && \'\' == $meta_value )
add_post_meta( $post_id, $meta_key, $new_meta_value, true );
elseif ( $new_meta_value && $new_meta_value != $meta_value )
update_post_meta( $post_id, $meta_key, $new_meta_value );
elseif ( \'\' == $new_meta_value && $meta_value )
delete_post_meta( $post_id, $meta_key, $meta_value );
}
最合适的回答,由SO网友:webtoure 整理而成
答案很简单:不要使用sanitize_html_class
. 按原样输入(您仍然可以进行基本验证,如长度,确保它仅为整数等),如果需要在前面输出,并且您不信任存储数据的用户,请使用以下方法esc_html
或wp_strip_all_tags
根据您的需要。当然,您可以使用wp_strip_all_tags
当处理元数据时,用户在保存帖子后发现内容不一样时会有多困惑?因此,您可能希望添加通知,以不包括任何HTML
标签。
作为一个补充说明,如果你真的继续使用内置的WordPress机制添加一个自定义字段,你会发现它不会删除任何内容,而是按原样存储一个值。
由于您仍然有问题,下面是经过一些重构的代码:
function city_save_meta( $post_id, $post ) {
if ( !isset( $_POST[\'city_nonce\']) || !wp_verify_nonce( $_POST[\'city_nonce\'], basename(__FILE__) ) )
return $post_id;
$post_type = get_post_type_object( $post->post_type);
if ( !current_user_can( $post_type->cap->edit_post, $post_id ) )
return $post_id;
$new_meta_value = isset( $_POST[\'city_id\'] ) ? $_POST[\'city_id\'] : \'\';
$meta_key = \'city_id\';
$meta_value = get_post_meta( $post_id, $meta_key, true );
if ( ! empty( $new_meta_value ) ) {
update_post_meta( $post_id, $meta_key, $new_meta_value );
} else {
/* Do you really expect to have multiple meta keys named exactly the same (\'city_id\')? */
/* If you don\'t, you can skip the third parameter from \'delete_post_meta\'. */
delete_post_meta( $post_id, $meta_key, $meta_value );
}
}