Verifică dacă utilizatorul este autentificat folosind jQuery
Vreau să execut cod jQuery personalizat care să afișeze un dialog de autentificare utilizatorului dacă face click pe un buton și nu este autentificat. Cum aș putea face asta?

Verifică atributul class
pentru body
: Dacă tema folosește body_class()
, elementul body va avea o clasă numită logged-in
pentru utilizatorii care sunt autentificați. Atenție, funcția poate fi folosită și pe elementul html
.
Exemplu cu jQuery:
if(jQuery('body').hasClass('logged-in')){
// Fă ceva
}
Exemplu cu JavaScript simplu:
if (document.body.classList.contains('logged-in')) {
// fă ceva
}
Poți folosi și is_user_logged_in()
ca condiție pentru a încărca sau afișa scriptul.

îmi place ideea de a verifica pur și simplu body pentru clasa logged-in
. Trebuie doar să ne asigurăm că temele folosesc body_class();
sau get_body_class();
Altfel, aceasta nu este o soluție foarte sigură. Totuși, eu folosesc aceste funcții în temele mele, așa că este o soluție bună pentru mine. Mulțumesc pentru ideea simplă.

În cazul în care doriți să verificați dacă utilizatorul este autentificat în momentul actual, încercați această soluție. Celelalte răspunsuri verifică dacă utilizatorul era autentificat sau nu în momentul în care pagina s-a încărcat, nu în momentul în care rulează JavaScript-ul. Utilizatorul ar fi putut să se autentifice într-un tab separat, de exemplu.
Puneți acest cod în JavaScript-ul vostru
var data = {
action: 'is_user_logged_in'
};
jQuery.post(ajaxurl, data, function(response) {
if(response == 'yes') {
// utilizatorul este autentificat, faceți ce aveți nevoie aici
} else {
// utilizatorul nu este autentificat, afișați formularul de autentificare aici
}
});
Puneți acest cod în functions.php
function ajax_check_user_logged_in() {
echo is_user_logged_in()?'yes':'no';
die();
}
add_action('wp_ajax_is_user_logged_in', 'ajax_check_user_logged_in');
add_action('wp_ajax_nopriv_is_user_logged_in', 'ajax_check_user_logged_in');

Wordpress o setează la 'siteultau.com/wp-admin/admin-ajax.php'. Acesta este URL-ul către care ar trebui trimise toate cererile AJAX

Am plasat jQuery.post în interiorul handler-ului de click jQuery dar nu funcționează. Ai vreo idee cum să rezolv problema?

Codex spune că în ultimele versiuni de WordPress aceasta este deja definită. Poți încerca să-ți definești propria versiune de ajaxurl cu wp_localize_script

URL-ul ar trebui să indice întotdeauna către "domain.com/wp-admin/admin-ajax.php"

În cazul în care cineva întâlnește eroarea "ajaxurl is not defined"... http://stackoverflow.com/questions/17710728/how-to-load-ajax-in-wordpress#17713643

@MridulAggarwal Mulțumesc foarte mult pentru asta. Chiar îți mulțumesc din suflet.

Te rog să adaugi body_class() în tag-ul body al tău HTML
<body <?php body_class(); ?>>
//codul tău html
</body>
Aceasta va adăuga clasa logged-in
pentru utilizatorii autentificați, apoi poți folosi următorul cod jQuery pentru a executa codul personalizat doar pentru utilizatorii logați.
if ($('body').hasClass('logged-in')) {
//execută codul tău jQuery.
}

Nu știu de ce a fost votat în jos acest răspuns. Abordarea este complet validă. +1

Nu știu. Am aceeași întrebare. Răspunsul este valid, dar de ce vot în jos.

Hm. Poate pentru că folosește jQuery în loc de metoda corectă (folosind un filtru și callback). Unii oameni sunt alergici la jQuery.

Vă rugăm să rețineți că niciunul dintre exemplele de mai sus nu sunt sigure în cazul în care utilizați un plugin de cache pentru pagini, deoarece codul din tag-ul body va fi static. De asemenea, există o metodă simplă de a face acest lucru (fără interogări suplimentare către AJAX, care nu sunt optime).
Dacă doriți să testați starea de autentificare a utilizatorului cu JavaScript, puteți utiliza acest cod pentru a seta un cookie când utilizatorul se autentifică și pentru a șterge cookie-ul când utilizatorul se deconectează. Adăugați acest cod, de exemplu, în fișierul functions.php al temei dumneavoastră.
function login_function() {
setcookie('wp_user_logged_in', 1, time() + 31556926, '/');
$_COOKIE['wp_user_logged_in'] = 1;
}
add_action('wp_login', 'login_function');
function logout_function() {
unset($_COOKIE['wp_user_logged_in']);
setcookie('wp_user_logged_in', null, -1, '/');
}
add_action('wp_logout', 'logout_function');
Apoi, testarea cookie-ului în JavaScript este simplă.
if (document.cookie.indexOf('wp_user_logged_in') !== -1) {
//fă ceva când utilizatorul este autentificat
} else {
//fă ceva când utilizatorul nu este autentificat
}

Acest lucru este într-adevăr destul de simplu, fiabil și în cel mai rău caz se execută aproape instantaneu după încărcarea paginii (dacă încărcați scriptul în footer fără blocarea randării), spre deosebire de alte răspunsuri. Ajax este lent și bazarea pe clasele body va eșua din cauza cache-ului. Trebuie să adăugați acest cookie în textul Politicii de Cookie. Mulțumesc Janos.

Ca o continuare, există o problemă cu sincronizarea cookie-urilor implicite din WordPress și a noului cookie accesibil prin script, dar am primit un răspuns excelent și simplu despre cum să o rezolv: https://stackoverflow.com/questions/56208574/setting-script-accessible-cookie-expiry-based-on-wordpress-logged-in-cookie

Un alt exemplu, în cazul în care doriți să îl utilizați pentru apeluri AJAX.
// Simplificat... vă rugăm să rețineți că toate numele/variabilele/etc. din clasa mea au denumiri unice.
// ...același lucru este valabil și pentru handler-ul de script.
class wpse69814_example
{
public $response;
public function __construct()
{
add_action( 'wp_enqueue_scripts', array( $this, 'enqueue' ) );
add_action( 'wp_enqueue_scripts', array( $this, 'localize' ), 20 );
}
public function enqueue()
{
wp_enqueue_script(
'wpse69814_handler',
plugins_url( 'url/to/file.js', __FILE__ ),
array( 'jquery' ),
filemtime( plugins_dir_path( __FILE__ ).'/path/to/file.js' ),
true
);
}
public function localize()
{
wp_localize_script( 'wpse69814_handler', 'wpse69814_object', array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'ajax_nonce' => wp_create_nonce( 'wpse69814_nonce' ),
'action' => 'wpse69814-handler-action',
'data' => array(
'is_user_logged_in' => is_user_logged_in(),
)
) );
}
}

De menționat, această abordare nu funcționează în spatele unui CDN. :D

@BrianFegter Poate ai vrea să explici (sau să [editezi] în text) de ce? :)

Deoarece CDN-ul nu se autentifică cu WordPress, is_user_logged_in
va fi stocat în cache ca false în DOM când origin-ul este accesat. Starea utilizatorului ar trebui abstractizată într-un thread fără cache prin XHR atunci când se utilizează un CDN. Abordarea lui @Mridul Aggarwal funcționează, dar cu antete no-cache în răspuns.

Mulțumesc acestui articol și unui alt articol, am găsit o soluție pentru problema mea. Postez aici doar în caz că ar putea fi util cuiva.
Funcționează pe site-uri WordPress actuale
Acest cod verifică dacă utilizatorul este autentificat sau nu folosind jQuery. Dacă utilizatorul NU este autentificat, împiedică acțiunea de a face click dreapta pe conținut și de a copia imagini și text.
$(document).ready(function(){
// dacă utilizatorul nu este autentificat...
if (!document.querySelector('body.logged-in')){
//blochează tot conținutul
disableSelection(document.body);
// dezactivează click-ul pe imagini
$('img').bind('contextmenu', function(e){return false;});
console.log('salut');
}
// funcție pentru a bloca tot conținutul
function disableSelection(target){
$(function() {
$(this).bind("contextmenu", function(e) {
e.preventDefault();
});
});
if (typeof target.onselectstart!="undefined") //Pentru IE
target.onselectstart=function(){return false}
else if (typeof target.style.MozUserSelect!="undefined") //Pentru Firefox
target.style.MozUserSelect="none"
else //Pentru toate celelalte browsere (ex. Opera)
target.onmousedown=function(){return false}
target.style.cursor = "default";
}
})

Folosesc o metodă alternativă fără ajaxurl
și body class
. Pur și simplu nu am încredere în clasa body, care s-ar putea să nu existe în toate temele.
În functions.php
ar trebui să aveți:
add_action( 'wp_body_open', 'custom_body_open' );
function custom_body_open() {
$logged_in = is_user_logged_in() ? 'yes' : 'no'; //Funcție WP pentru a verifica dacă utilizatorul este autentificat sau nu
echo '<div style="display:none" class="user_is_logged_in" data-logged-in="' . $logged_in . '" ></div>';
}
Aceasta creează un div
invizibil la începutul tag-ului body cu:
- numele clasei "user_is_logged_in" - doar pentru referință jQuery.
- stilul "display: none" - face div-ul invizibil. În schimb, puteți folosi CSS:
.user_is_logged_in { display: none }
- valoarea "data-(logged-in)" "yes" (autentificat) sau "no" (neautentificat). Această valoare va fi verificată ulterior cu
jQuery
.
În jQuery verific valoarea "data-logged-in" și acționez în consecință:
jQuery(document).ready(function($) {
var logged_in = $(".user_is_logged_in").data("logged-in") == 'yes' ? true : false;
if (logged_in) {
...
}
else {
...
}
}

Iată scriptul WordPress care va adăuga o clasă în tag-ul Body în funcție de starea de autentificare a utilizatorului (conectat sau neconectat)
https://gist.github.com/raftaar1191/55fe297db0724e62883846b3ed31b543

Am apreciat toate răspunsurile, dar localizarea scriptului sau verificarea clasei CSS nu ar fi, în opinia mea, cea mai bună practică, întrucât verificarea clasei CSS nu este 100% sigură, iar funcția de localizare a scriptului este, așa cum sugerează și numele, doar pentru localizare.
După WordPress 4.5, cea mai bună soluție ar fi adăugarea unui script inline astfel:
<?php
function detect_login() {
$isLoggedIn = is_user_logged_in();
wp_register_script( 'detect_login', '' );
wp_enqueue_script( 'detect_login');
wp_add_inline_script( 'detect_login', "var isLoggedIn = $isLoggedIn" );
}
add_action( 'wp_enqueue_scripts', 'detect_login' );
Și apoi, evident, verificăm scope-ul global care este acum, din păcate, poluat de variabila noastră globală isLoggedIn, astfel: window.isLoggedIn

@JacobPeattie Da, motivul pentru care au creat wp_add_inline_script()
a fost pentru a evita ca oamenii să folosească funcția de localizare a scripturilor pentru a declara variabile globale. După cum sugerează și numele, aceasta este o soluție mai potrivită. De ce să folosim altceva care nu a fost inițial conceput pentru acest scop, când avem o alternativă bună?

Nu pentru asta a fost adăugat. A fost adăugat pentru a suporta adăugarea de fragmente mici de cod executabil înainte sau după un script, pentru a suporta lucruri precum încărcătoarele de fonturi. https://make.wordpress.org/core/2016/03/08/enhanced-script-loader-in-wordpress-4-5/

@JacobPeattie exact, și pentru ce a fost adăugat șirul wp_localize_script()
? Poluarea scope-ului global cu variabile globale? Sau pentru a localiza efectiv, așa cum sugerează numele?

Despre ce vorbești? wp_localize_script te forțează să namespace-ui variabilele tale în interiorul unui obiect. Răspunsul tău adaugă o variabilă în scope-ul global fără niciun fel de namespace.

@JacobPeattie hm, unde crezi că vei stoca obiectul din wp_localize_script()
? indiciu: window
, oricum, de vreme ce ești atât de atașat de wp_localize_script()
, simte-te liber să-ți păstrezi părerea despre folosirea lui pentru declararea de variabile nelegate de localizare în loc să folosești funcția vanilla făcută special pentru asta, fiecăruia pe placul lui.
