管理员筛选器/帖子标题太长时出错

时间:2014-05-19 作者:Shawn

如果帖子创建者输入的帖子标题过长,是否有过滤器会引发错误?

我想抛出一个错误,如:“您输入的标题超过30个字符。请更改标题,然后重试。”最好是像标准错误这样的横幅警告,或者至少是一些值得注意的东西。此外,在标题长度正确之前,不会保存帖子。

我知道有wp\\u insert\\u post\\u数据过滤器,您可以在保存标题之前对其进行修改,但我不想执行类似于截断的操作,因为这对最终用户可能没有意义。这是我想让博文作者改变的。

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

我使用transition\\u post\\u状态解决了这个问题。

function check_post_title_length($new_status, $old_status, $post){

    if($new_status == \'auto-draft\' || $new_status == \'draft\'){
        return;
    }

    if(str_word_count($post->post_title, 0) > 12){
        //update-nag is the term for a yellow warning box in admin_notices
        //notice here I use the WP_Error data field to choose the type of error box to show
        $admin_notices = new WP_Error(\'check_post_title_length\',\'If possible, consider making the post title shorter.\', \'update-nag\');
        //we could also if we needed, add more notices to the list such as
        //$admin_notices->add(\'some_other_check\', \'Sorry you need to add an author\');
        add_user_meta(get_current_user_id(), \'admin_notices\', $admin_notices, true);
    }
}
add_action(\'transition_post_status\', \'check_post_title_length\', 10, 3);

function display_admin_notices(){
    $user_id = get_current_user_id();
    $admin_notices = get_user_meta($user_id, \'admin_notices\', true);

    if(!empty($admin_notices)){
        //make sure its a WP_Error object
        if(is_wp_error($admin_notices)){
            //delete error from user meta so error is gone on page reload
            delete_user_meta($user_id, \'admin_notices\');
            $notices = $spm_admin_notices->get_error_messages();

            if(!empty($notices)){
                $notice_type = $admin_notices->get_error_data();
                if(!empty($notice_type)){
                ?>
                    <div class="<?php echo $notice_type; ?>">
                <?php
                } else {
                ?>
                    <div class="error">
                <?php
                }
                //here we loop through all notices we want to display
                //this is useful if the user needs to adjust more than one item
                foreach($notices AS $notice){
                ?>
                    <p><?php echo $notice; ?></p>
                <?php
                }
                ?>
                </div>
                <?php
            }
        }
    }
}
add_action(\'admin_notices\', \'display_admin_notices\');

SO网友:totels

我认为您缺少的关键是了解WordPress不使用线性路径来保存帖子。因为帖子是自动保存的,所以您需要以一种根据发布状态而不是保存状态来定义的方式来处理它。基本上,与其试图截断或调整标题,不如在wp_insert_post_data 或通过post status transition 并防止将post设置为publishfuture 状态,直到满足所有条件。管理通知的操作是admin_notices.

结束