隐藏包含帖子元的页面标题

时间:2019-02-18 作者:Feyt

我试图编写代码,在后端的页面上设置一个复选框,以检查是否要在前端隐藏页面标题。但我发现,帖子元有时会重置为显示标题,即使我确实将其设置为“隐藏标题”。这只会在我编辑页面或进行其他更改时随机发生。请就可能出现的错误或是否有更好的方法提供建议?

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-->

1 个回复
最合适的回答,由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
    );
}

相关推荐

Starting with tabbed metabox

我的插件需要一个带选项卡的metabox。实际上,它们是5个代谢箱,每个都在一个选项卡中。我找到了以下脚本:https://speckyboy.com/10-simple-code-snippets-creating-beautiful-tabs/哪一个最适合在元框中使用?最好只有CSS?JS必须注册?我想开始测试这些脚本,但想知道从哪里开始。非常感谢。