Ich habe ein Front-End-Ajax-Login auf meiner Website. Ich möchte die Weiterleitungs-URL für jede Seite, die nicht Teil des Blogs ist, auf '/services/clientarea';
setzen. Für Blog-Seiten möchte ich, dass die Login-Weiterleitung $_SERVER['REQUEST_URI'];
lautet.
Hier ist der Code, den ich verwende und der bei mir nicht funktioniert:
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');
}
Es scheint, dass der Beitragstyp nicht in den Init-Hook geladen ist. Gibt es eine Möglichkeit, es zu identifizieren?
OK, lassen Sie uns zuerst etwas klarstellen.
Hier ist eine Liste von Aktionen, die während einer typischen Anfrage ausgeführt werden . Es geht so:
Wie Sie sehen, werden Posts viel später nach init ausgewählt. Genauer gesagt wird sogar die Anfrage nach dem Init-Hook analysiert. Ich fürchte, es gibt keine einfache Möglichkeit, $post
in init
Action zu bekommen.
Wenn Sie Ihren Code von init
nach wp
(oder später) verschieben, können Sie $post
vom $wp_query
-Objekt abrufen.
Aber ... ich bin mir nicht sicher, ob ich verstehe, was Sie mit diesem Code erreichen wollen. Wenn Sie Ihre AJAX -Aktion basierend auf dem abgefragten Beitrag einbinden, wird sie vermutlich überhaupt nicht ausgelöst. Warum? AJAX -Aufruf ist eine andere Anforderung (/wp-admin/admin-ajax.php
), daher wird in dieser Anforderung kein $post
abgerufen, sodass Ihre Aktion nicht blockiert wird und nicht ausgelöst wird.
Ich bin mir ziemlich sicher, dass Sie das wirklich wollen:
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' );
Während @krzysiek Answer die richtige Methode zum Einreihen von Dateien ist, beantworten Sie nicht die ursprüngliche Frage, wie Sie den Post-Typ am Init-Hook erhalten.
Grundsätzlich können Sie an diesem Hook nicht auf die Post-Variable zugreifen, sodass Sie sie über die URL abrufen müssen. Das url_to_postid () ist die Funktion, die Sie verwenden müssen, und Sie können so etwas tun:
$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 );
Dies ist nur eine Umgehung für den Fall, dass Sie es brauchen, aber es ist besser, mit dem wp hook zu beginnen, in dem die Variablen bereits gesetzt sind.