我试图编写代码,在后端的页面上设置一个复选框,以检查是否要在前端隐藏页面标题。但我发现,帖子元有时会重置为显示标题,即使我确实将其设置为“隐藏标题”。这只会在我编辑页面或进行其他更改时随机发生。请就可能出现的错误或是否有更好的方法提供建议?
Here is my code in functions.php
function mysite_page_metabox() {
add_meta_box(
\'remove-title\',
__(\'Hide Page Title\', \'textdomain\' ),
\'hide_title_callback\',
\'page\',
\'side\',
\'high\'
);
}
add_action( \'add_meta_boxes\' , \'mysite_page_metabox\');
function hide_title_callback() {
$value = get_post_meta(get_the_ID(), \'_mysite_meta_hide_title\', true);
?>
<?php if($value == "on") : ?>
<label for="hide">Hide: </label><input type="checkbox" name="hide" checked>
<?php else : ?>
<label for="hide">Hide: </label><input type="checkbox" name="hide">
<?php endif; ?>
<?php
}
// Save meta key and value
function mysite_save_postdata($post_id)
{
if ( isset( $_POST[\'hide\']) ) {
update_post_meta(
$post_id,
\'_mysite_meta_hide_title\',
sanitize_text_field( $_POST[\'hide\'] )
);
} else {
update_post_meta(
$post_id,
\'_mysite_meta_hide_title\',
sanitize_text_field( "off" )
);
}
}
add_action(\'save_post\', \'mysite_save_postdata\');
In my content-page.php template-parts I call it like this: <!--Start the hide title-->
<?php
$hide_title_status = get_post_meta( get_the_ID(), \'_mysite_meta_hide_title\', true);
$post_id = get_the_ID();
if($hide_title_status == "off" || !metadata_exists( \'post\', $post_id, \'_mysite_meta_hide_title\' ) ) :
?>
<header class="entry-header">
<?php the_title( \'<h1 class="entry-title">\', \'</h1>\' ); ?>
</header><!-- .entry-header -->
<?php endif; ?> <!--End the hide title-->
最合适的回答,由SO网友:Max Yudin 整理而成
$value
始终为空,因为缺少帖子ID。传递参数($post
对象)到hide_title_callback()
函数并以正确的方式获取帖子ID。
此外,您应该注意nonce。
<?php
// pass the $post object
function hide_title_callback( $post ) {
// you have to verify this nonce inside `mysite_save_postdata()`
// https://codex.wordpress.org/Function_Reference/wp_nonce_field
wp_nonce_field( \'mysite_action_name\', \'mysite_nonce_field_name\' );
// now you have the post ID
$value = get_post_meta( $post->ID, \'_mysite_meta_hide_title\', true );
if( $value == "on" ) : ?>
<label for="hide">Hide: </label><input type="checkbox" name="hide" checked>
<?php else : ?>
<label for="hide">Hide: </label><input type="checkbox" name="hide">
<?php endif;
}
验证nonce
<?php
function mysite_save_postdata( $post_id ) {
// https://codex.wordpress.org/Function_Reference/wp_verify_nonce
if ( !wp_verify_nonce( $_POST[\'mysite_nonce_field_name\'], \'mysite_action_name\' ) ) {
return;
}
if ( isset( $_POST[\'hide\']) ) {
update_post_meta(
$post_id,
\'_mysite_meta_hide_title\',
sanitize_text_field( $_POST[\'hide\'] )
);
} else {
update_post_meta(
$post_id,
\'_mysite_meta_hide_title\',
sanitize_text_field( "off" )
);
}
}
为了保持数据库更干净,我个人不应该保存“off”元值。我应该删除
_mysite_meta_hide_title
如果复选框未选中,则为完全。因此,如果“开”,它将存在,如果“关”,它将不存在。
if()
中的声明
hide_title_callback()
将保持不变。
<?php
if ( ! isset( $_POST[\'hide\'] ) ) {
// unchecked
delete_post_meta(
$post_id,
\'_mysite_meta_hide_title\',
);
} else {
// checked
update_post_meta(
$post_id,
\'_mysite_meta_hide_title\',
\'on\' // nothing to sanitize here
);
}