验证自定义发布类型字段

时间:2016-04-05 作者:PeterInvincible

我正在开发一个插件,管理员可以在后端添加和删除邮政编码。我发现最好的方法是创建一个名为zip\\u代码的自定义帖子类型,只支持标题,因为该功能已经内置到Wordpress中。

我遇到的问题是验证标题,因为它必须是有效的邮政编码,以避免前端出错。

我添加了以下动作挂钩:

    // Action hook to intercept Wordpress\' default post saving function and redirect to ours
    add_action(\'save_post\', \'zip_code_save\');

    $validator = new Validator();
    // Called after the redirect
    add_action(\'admin_head-post.php\', array($validator, \'add_plugin_notice\'));
zip\\u code\\u保存功能:

public function zip_code_save() {

    global $post;

    if (defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE) return;

    if (isset($_POST[\'post_type\']) && $_POST[\'post_type\'] == \'zip_code\') {

        $validator = new Validator();

        if (!$validator->validate(get_the_title($post->ID))) {

            $validator->update_option(1);
            return false;
        } else {
            update_post_meta(
                $post->ID,
                \'zip_code\', get_the_title($post->ID));
        }

    }
}
最后,这是我的Validator类:

class Validator { 
    //This for your your admin_notices hook
    function show_error() {
        echo \'<div class="error">
       <p>The ZIP Code entered is not valid. <b>Note</b>: only US ZIP codes are accepted.</p>
       </div>\';
    }

    //update option when admin_notices is needed or not
    function update_option($val) {
        update_option(\'display_my_admin_message\', $val);
    }

    //function to use for your admin notice
    function add_plugin_notice() {
        if (get_option(\'display_my_admin_message\') == 1) {
            // check whether to display the message
            add_action(\'admin_notices\', array(&$this, \'show_error\'));
            // turn off the message
            update_option(\'display_my_admin_message\', 0);
        }
    }

    function validate($input) {

        $zip = (isset($input) && !empty($input)) ? sanitize_text_field($input) : \'\';

        if ( !preg_match( \'/(^\\d{5}$)|(^\\d{5}-\\d{4}$)/\', $zip  ) ) {
            return false;
        } else {
            return true;
        }

    }

}
如果输入的ZIP无效,上面的代码会成功输出错误消息,但是不管出现什么错误,它都会发布帖子。如果标题无效,是否有办法阻止发布帖子?

还有,有没有办法防止WP自动创建草稿?因为数据太少,所以这里真的不相关,而且更麻烦。

1 个回复
SO网友:kovshenin

帖子是草稿还是已发布是由帖子状态定义的,而不是由任何元字段定义的,因此您必须连接到wp_insert_post_data 并强制post_status 如果表单中的任何内容无效,请执行以下操作:

add_filter( \'wp_insert_post_data\', function( $data ) {
    if ( $data[\'post_type\'] != \'zip_code\' )
        return $data;

    // Validate your nonces and $_POST fields here
    if ( ! $valid ) {
        $data[\'post_status\'] = \'draft\'; // Force draft
    }
});
还要注意的是wp_insert_post_data 之前运行save_post, 因此,您必须再次验证并将元字段保存在save_post 就像你已经在做的一样。

我还建议不要对管理员通知触发器使用选项。它们对所有用户都是全局的,并且默认情况下,它们在任何时候、任何地方都会自动加载。使用usermeta 而不是使用set_user_setting() 然后get_user_setting().

希望有帮助!