web-dev-qa-db-fra.com

Détection du type de post dans l'action init

J'ai un identifiant ajax frontal sur mon site. Je souhaite définir l'URL de redirection sur '/services/clientarea'; pour chaque page ne faisant pas partie du blog. Pour les pages de blog, je veux que la redirection de connexion soit $_SERVER['REQUEST_URI'];

Voici le code que j'utilise et qui ne fonctionne pas pour moi:

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

Il semble que le type de publication n'est pas chargé dans le hook init. Y a-t-il un moyen de l'identifier?

3
Ralphonz

OK, essayons d'abord quelque chose de droit.

Voici la liste des actions exécutées pendant une requête typique . Ça va comme ça:

  • ...
  • init
  • ...
  • demande parse
  • ...
  • parse_query
  • pre_get_posts
  • posts_selection
  • ...
  • wp

Comme vous pouvez le constater, les publications sont sélectionnées beaucoup plus tard après init. Pour être plus précis, même la requête est analysée après le démarrage d'init. Il n’ya donc pas de moyen facile d’obtenir $post dans init action.

Si vous déplacez votre code de init à wp (ou version ultérieure), vous pouvez obtenir un objet $post à partir de $wp_query.

Mais ... je ne suis pas sûr de comprendre, qu'est-ce que vous essayez d'atteindre avec ce code. Si vous associez votre action AJAX basée sur un message interrogé, elle ne se déclenchera pas du tout, je suppose. Pourquoi? L'appel AJAX est une autre demande (/wp-admin/admin-ajax.php). Par conséquent, aucun $post ne sera récupéré dans cette demande. Par conséquent, votre action ne sera pas accrochée et ne se lancera pas.

Je suis à peu près sûr que c'est ce que tu veux vraiment:

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 Dróżdż

Bien que @krzysiek Answer soit la bonne méthode à suivre lors de la compression de fichiers, ne répondez pas à la question initiale: comment obtenir le type de publication au niveau du crochet d’initialisation;.

En gros, vous ne pouvez pas accéder à la variable post à ce hook, vous devez donc l'obtenir en utilisant l'URL. Le url_to_postid () est la fonction que vous devez utiliser et vous pouvez faire quelque chose comme ceci:

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

Ceci est juste une solution de contournement au cas où vous en auriez besoin, mais il serait préférable de commencer à déconner au hook wp où les variables sont déjà définies.

1
chifliiiii