it-swarm.com.de

Ermitteln des Post-Typs in der Init-Aktion

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?

3
Ralphonz

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:

  • ...
  • drin
  • ...
  • parse_request
  • ...
  • parse_query
  • pre_get_posts
  • posts_selection
  • ...
  • wp

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' );
7

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.

1
chifliiiii