web-dev-qa-db-ja.com

Initアクション内で投稿タイプを検出

私のサイトにはフロントエンドのAjaxログインがあります。ブログの一部ではないすべてのページのリダイレクトURLを'/services/clientarea';に設定したいです。ブログページの場合、私はログインリダイレクトを$_SERVER['REQUEST_URI'];にしたいです。

これは私が使っているコードで、私にはうまくいきません。

function ajax_login_init(){

wp_register_script('ajax-login-script', get_template_directory_uri() . '/library/js/ajax-login-script.js', array('jquery') ); 
wp_enqueue_script('ajax-login-script');

global  $post;
$posttype = get_post_type($post);

if ($posttype == 'post') {
    $loginredirect = $_SERVER['REQUEST_URI'];
} else {
    $loginredirect = '/services/clientarea';
}

wp_localize_script( 'ajax-login-script', 'ajax_login_object', array( 
    'ajaxurl' => admin_url( 'admin-ajax.php' ),
    'redirecturl' => $loginredirect,
    'loadingmessage' => __('Signing in, please wait...')
));

// Enable the user with no privileges to run ajax_login() in AJAX
add_action( 'wp_ajax_nopriv_ajaxlogin', 'ajax_login' );
}

// Execute the action only if the user isn't logged in
    if (!is_user_logged_in()) {
        add_action('init', 'ajax_login_init');
}

Postタイプがinitフックにロードされていないようです。それを識別する方法はありますか?

3
Ralphonz

さて、最初に何かのことを考えましょう。

これが 典型的なリクエストの間に実行されるアクションのリストです 。こんなふうになります:

  • ...
  • その中に
  • ...
  • parse_request
  • ...
  • parse_query
  • pre_get_posts
  • posts_selection
  • ...
  • wP

ご覧のとおり、投稿はinitの後に選択された後のほうがはるかに遅いです。より正確には、リクエストでさえinitフックの後に解析されます。 initアクションで$postを取得する簡単な方法はありません、私は怖いです。

コードをinitからwp(またはそれ以降)に移動すると、$postオブジェクトから$wp_queryを取得できます。

しかし...私が理解しているかどうかはわかりませんが、このコードで何を達成しようとしているのでしょうか。照会された投稿に基づいてAJAXアクションをフックしても、まったく起動しません。どうして? AJAX callは別のリクエスト(/wp-admin/admin-ajax.php)なので、このリクエストには$postが取り込まれないため、アクションがフックされず、起動しません。

私はこれがあなたが本当に欲しいものであると確信しています:

function enqueue_ajax_login_scripts() {
    wp_register_script('ajax-login-script', get_template_directory_uri() . '/library/js/ajax-login-script.js', array('jquery') ); 
    wp_enqueue_script('ajax-login-script');

    // check if it's single post
    if ( is_singular('post') ) {
        $loginredirect = $_SERVER['REQUEST_URI'];
    } else {
        $loginredirect = '/services/clientarea';
    }

    wp_localize_script( 'ajax-login-script', 'ajax_login_object', array( 
        'ajaxurl' => admin_url( 'admin-ajax.php' ),
        'redirecturl' => $loginredirect,
        'loadingmessage' => __('Signing in, please wait...')
    ));
}
add_action('wp_enqueue_scripts', 'enqueue_ajax_login_scripts');

// it can be registered every time (it won't fire up unless there will be such AJAX request
add_action( 'wp_ajax_nopriv_ajaxlogin', 'ajax_login' );
7

@krzysiek Answer はファイルをエンキューするときに従うべき正しい方法ですが、initフックで投稿タイプを取得する方法についての元の質問には答えないでください。

基本的に、あなたはそのフックでpost変数にアクセスすることができないので、あなたはURLを使ってそれを取得する必要があります。 url_to_postid() は使用する必要がある関数であり、次のようなことができます。

$actual_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? "https" : "http") . "://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]";
$post_id = url_to_postid($actual_url);
$post_type = get_post_type( $post_id );

これはあなたがそれを必要とする場合のただの回避策ですが、変数がすでに設定されているところでwp hookでいじって始めるほうがよいでしょう。

1
chifliiiii