带短代码的模板重定向(_R)

时间:2015-05-20 作者:Mayeenul Islam

在我的插件的一个短代码中,我在提交帖子的同时即时处理用户登录/注册。所以整个事情都是在短代码中发生的,比如:

<?php
function this_shortcode() {
    ob_start();
    //if isset(login)... process login, get $user_id
    //else if isset(registration)... process registration, get $user_id
    //else if already registered, get $current_user->ID as $user_id

    /**
     * if !empty($user_id){
     *  $p_id = wp_insert_post();
     *  if !empty($p_id) {
     *      echo success;
     *      **I NEED ONLY WHEN THE REDIRECTION SHOULD TAKE PLACE**
     *  } else {
     *      echo error;
     *  }
     * } else {
     * }
     */

    <form>
       <!-- registration/login + post insertion form here -->
    </form>

    return ob_get_clean();
}
add_shortcode( \'my-shortcode\', \'this_shortcode\' );
我已经知道了,wp_redirect() 不是从短代码重定向的正确方法。所以,我想做的是:

function project_registration_login_redirection(){
    global $post;
    if( has_shortcode( $post->post_content, \'my-shortcode\' ) ) {
        if ( isset( $_POST[\'my_submit\'] ) ) {
            wp_redirect( home_url(\'/that-page\') );
            exit();
        }
    }
}
add_action( \'template_redirect\', \'project_registration_login_redirection\' );
但很明显,这一个在没有任何检查的情况下重定向,即使表单验证在那里显示错误wp_insert_post() 正在返回空。

How can I process the form somewhere, but do the redirection only when the form returns a valid feedback?

我试过:

global $post, $p_id;
if ( isset( $_POST[\'my_submit\'] ) && !empty( $p_id ) ) {
但它不起作用。

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

下面的答案并不直接回答您的问题,但提供了一种可能的替代解决方案。

has_shortcode( $post->post_content, \'my-shortcode\' ) 陈述如果要验证nonce,则无需检查此项。所以验证应该是这样的。

function project_registration_login_redirection(){

    if ( !isset( $_POST[\'my_submit\'] ) ) {
        return;
    }

    // form validation here
    global $errors; // a global var so you can show errors on your form if any

    // I usually have a seperate validation class but you may do it different way.
    // this method is useful to feed mock array for testing purpose
    $validator = new My_Form_validator();
    $errors = $validator->validate($_POST);

    if(!empty($errors){
        return;
    }

    // no error found

    $data = $validator->get_data();
    // process form data here

    wp_redirect(home_url(\'that-page\'));
    exit;

}
add_action( \'template_redirect\', \'project_registration_login_redirection\' );
希望有帮助。

结束

相关推荐

Multiple level shortcodes

我正在开发一个插件,遇到了一种情况,我希望有人能帮我找到一个解决方案。我想要一个短代码结构,如:[shortcode_1] [shortcode_2] [shortcode_3] [shortcode_4][/shortcode_4] [/shortcode_3] [/shortcode_2] [/shortcode_1] 但如果我使用add\\u短代码,只有第一个短代码有效。。。有没有办法得到这样的短代码结构?谢谢