web-dev-qa-db-ja.com

'error'という名前のGET変数にアクセスする

プロジェクトの一環として、認証用にGoogleと統合するワードプレスプラグインを作成する必要があります(既存のプラグインを使用するのではなく、新しいプラグインを開発するには十分な理由があります)。ユーザーが認証プロセス中にログインをキャンセルすることを決定した場合、Googleは私のサイトにリダイレクトし、 'error'という名前のGET変数を設定します。

それで、私は$_GET['error']が決して利用可能ではなかったことに気付きました、そして、少し研究の後、私はget_query_var()と関連する関数に出会いました - それで私はこれを試みましたが、まだ 'error'変数にアクセスできませんでした。その後、$wp_query->query_varsの値を出力し、URLに変数が設定されているかどうかにかかわらず、 'error'変数が存在し、空であることに気付きました。

それで、私の質問は、 'error'変数の存在をどうやって確認できるかです(できればURLを解析する必要はありません。ただし、これをバックアップ計画として保持します)。私はたぶん私は通常Wordpressのプラグインの開発者ではないことに言及するべきです。

/ ****編集** /

これが私がやろうとしていることをシミュレートするテストコードです。私は 'send_headers'アクションにハンドラを付けたことがわかります - これが私が本当に変数を取得する必要がある場所です。 'the_content'は比較のためにあります。

コード: https://Gist.github.com/ryanlund/e644b10a9e50ae7b03e6 (かなり長いのでGistにあります)

ログ: https://Gist.github.com/ryanlund/e0d685545a09eff93a83

ログのshowAllセクションを目的の部分だけにトリミングしました。次のクエリ文字列をURLに使用してコードを実行しました。?test=A%20Test&error=An%20error

/**************************** 最終的解決 ******************* ************ /

皆さん、こんにちは。トムが私にくれたアイディアに基づく私の最終的な解決策です。

基本的に、予約されている変数を使用しようとしているのではなく(単純なワードプレスではありません)、単に名前を変更しました。

    add_action('init',function() { 
        if(preg_match('/^\/test-page\//',$_SERVER['REQUEST_URI'])){
            if(isset($_GET['error'])){
                /*call it something unlikely to be used elsewhere*/
                $_GET['error_mpp']=$_GET['error']; 
            }

            global $wp; 
            $wp->add_query_var('test');
            $wp->add_query_var('error_mpp');
        }
    });
1
Ryan Lund

あなたの問題は、あなたが 予約語 を使っていることです。 errorは予約語です。使用できません。

これを回避するには、 リクエストを早期に傍受し 、リダイレクトを実行してプロセス内のクエリパラメータを変更します。たとえば、link getパラメータを処理すると、次のようになります。

add_action( 'wp' , 'reserved_term_intercept' );

function reserved_term_intercept(){
    global $wp_query;
    if( $wp_query->queried_object_id == 72 && isset( $_GET["link"] ) ){

        wp_redirect( get_permalink( 72 ) . "?newlink=" . urlencode( $_GET["link"] ) . "&nonce=" . wp_create_nonce( 'nonce-name' ) );
        exit;
    }
}

その後、新しい変数を処理します。

add_action( 'wp_head' , 'reserved_term_handling' );

function reserved_term_handling(){
    if( wp_verify_nonce( $_GET["nonce"], 'nonce-name' ) == TRUE && isset( $_GET["newlink" ) ){
        printf( '<a href="%s">Hello World!</a>', esc_url( urldecode( $_GET["newlink"] ) ) );
    }
}

wp_headはコードを実行するための最も適切なフックではないかもしれません、おそらくinit

3
Tom J Nowell