在发布时检查帖子中的空白标题

时间:2017-09-13 作者:Ryan Coolwebs

我有几个wp用户在创建新帖子(和自定义类型帖子)时不插入标题。这意味着永久链接被分配了一个编号作为链接。在我正在开发的多站点中,这通常会停止链接的工作(页面只是刷新)。

当用户在发布前未能在帖子中插入标题时,我想显示一条警告消息(告诉他们插入标题并编辑永久链接)。

我的代码到目前为止都在函数中。php文件:

function check_for_post_title( $post, $ID )
{
    $title = $post->post_title;
    $permalink = get_permalink( $ID );
    if($title ==\'\' || $title == null) {
        no_post_title_notice();
    } else {
        some_post_title_notice();
    }
}
add_action( \'publish_post\', \'check_for_post_title\', 10, 2 );

function no_post_title_notice() {
    ?>
    <div class="notice notice-warning is-dismissible">
        <p><?php _e( \'You have not provided a title for your post/page. This will cause the link to be broken. Please revise\', \'understrap-post-title\' ); ?></p>
    </div>
    <?php
}

function some_post_title_notice() {
    ?>
    <div class="notice notice-warning is-dismissible">
        <p><?php _e( \'I dont know why this message is appearing\', \'understrap-post-title\' ); ?></p>
    </div>
    <?php
}
目前,它不起作用,在发布/更新后,编辑帖子屏幕的顶部不会出现任何通知。不知道为什么它根本没有启动(甚至“else”语句也应该启动一些东西)。我做错了什么?

2 个回复
最合适的回答,由SO网友:Kumar 整理而成

您的错误不会显示在屏幕上,因为该页面在操作后会重新加载publish_post.

我完全遵循了一种不同的方法,我正在wp_insert_post_data 如果标题为空,我将post\\U状态标记为草稿,并在选项表中保存一个简单的标志。我保存的标志用于隐藏帖子发布通知,并显示管理员通知,用于指定标题以发布帖子。

同时,我删除了该选项,因此通知是一次性的。您可以根据需要对其进行更大程度的修改,但这是一个基本的解决方案,应该可以很好地工作。

/**
 * Checks for empty post title, if empty sets the post status to draft
 *
 * @param $data
 * @param $postarr
 *
 * @return array
 */
function wse_279994_check_post_title( $data, $postarr ) {
    if ( is_array( $data ) && \'publish\' == $data[\'post_status\'] && empty( $data[\'post_title\'] ) ) {
        $data[\'post_status\'] = \'draft\';
        update_option( \'wse_279994_post_error\', \'empty_title\' );
    }

    return $data;
}
add_filter( \'wp_insert_post_data\', \'wse_279994_check_post_title\', 10, 2 );

/**
 * If the post title was empty, do not show post published message
 */
add_filter( \'post_updated_messages\', \'wse_279994_remove_all_messages\' );

function wse_279994_remove_all_messages( $messages ) {
    if ( get_option( \'wse_279994_post_error\' ) ) {
        return array();
    } else {
        return $messages;
    }
}

/**
 * Show admin notice for empty post title
 */
add_action( \'admin_notices\', \'wse_279994_show_error\' );
function wse_279994_show_error() {
    $screen = get_current_screen();
    if ( $screen->id != \'post\' ) {
        return;
    }
    if ( ! get_option( \'wse_279994_post_error\' ) ) {
        return;
    }
    echo \'<div class="error"><p>\' . esc_html__( "You need to enter a Post Title in order to publish it.", "wse" ) . \'</p></div>\';
    delete_option( \'wse_279994_post_error\' );
}

SO网友:Ronak J Vanpariya

对于自定义帖子类型演示,请修改以上答案

/**
 * Checks for empty post title, if empty sets the post status to draft
 *
 * @param $data
 * @param $postarr
 *
 * @return array
 */
function wse_279994_check_post_title( $data, $postarr ) {
    global $post;
    if( "demo" == get_post_type($post) ){
       if ( is_array( $data ) && \'publish\' == $data[\'post_status\'] && empty( $data[\'post_title\'] ) ) {
         $data[\'post_status\'] = \'draft\';
         update_option( \'wse_279994_post_error\', \'empty_title\' );
     }
   }

    return $data;
}
add_filter( \'wp_insert_post_data\', \'wse_279994_check_post_title\', 10, 2 );

结束