私のサイトにはフロントエンドの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フックにロードされていないようです。それを識別する方法はありますか?
さて、最初に何かのことを考えましょう。
これが 典型的なリクエストの間に実行されるアクションのリストです 。こんなふうになります:
ご覧のとおり、投稿は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' );
@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でいじって始めるほうがよいでしょう。