ตรวจสอบว่าผู้ใช้เข้าสู่ระบบโดยใช้ JQuery


17

ฉันต้องการรันโค้ด jquery ที่กำหนดเองซึ่งแสดงข้อความโต้ตอบกับผู้ใช้หากเขาคลิกปุ่มและเขาไม่ได้ล็อกอินฉันจะทำยังไง?

คำตอบ:


26

ในกรณีที่คุณต้องการทราบว่าผู้ใช้เข้าสู่ระบบในช่วงเวลาปัจจุบัน คำตอบอื่น ๆ ตรวจสอบว่าผู้ใช้เข้าสู่ระบบหรือไม่เมื่อหน้าโหลดไม่เวลาเมื่อคุณใช้จาวาสคริปต์ ผู้ใช้สามารถเข้าสู่ระบบในแท็บแยกเช่น

ใส่ไว้ในจาวาสคริปต์ของคุณ

var data = {
    action: 'is_user_logged_in'
};

jQuery.post(ajaxurl, data, function(response) {
    if(response == 'yes') {
        // user is logged in, do your stuff here
    } else {
        // user is not logged in, show login form here
    }
});

วางสิ่งนี้ไว้ในฟังก์ชั่นของคุณ

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

ค่าของ ajaxurl คืออะไร?
Feras Odeh

wordpress ตั้งค่าเป็น 'yoursite.com/wp-admin/admin-ajax.php' นั่นคือ URL ที่คำขอ
อาแจ็กซ์

ฉันวาง jQuery.post ไว้ใน jQuery click handler แต่มันใช้ไม่ได้ คุณมีความคิดวิธีการแก้ปัญหาหรือไม่?
Feras Odeh

ฉันเห็นว่า ajaxurl ไม่ได้ถูกกำหนดไว้ในคอนโซล
Feras Odeh

1
[codex] (codex.wordpress.org/AJAX_in_Plugins) กล่าวว่าในเวอร์ชั่นล่าสุดของ wordpress นี้มีการกำหนดไว้แล้ว บางทีคุณสามารถกำหนดเวอร์ชัน ajaxurl ของคุณเองด้วย wp_localize_script
Mridul Aggarwal

32

ตรวจสอบclassแอ็ตทริบิวต์สำหรับbody: หากธีมใช้body_class()เนื้อความมีคลาสชื่อlogged-inสำหรับผู้ใช้ที่ล็อกอินโปรดทราบว่าฟังก์ชันสามารถใช้กับองค์ประกอบได้htmlเช่นกัน

ตัวอย่าง

if(jQuery('body').hasClass('logged-in')){
    // Do something
}

นอกจากนี้คุณยังสามารถใช้is_user_logged_in()เป็นเงื่อนไขในการจัดคิวหรือพิมพ์สคริปต์


คะแนนสูงสุดสำหรับคำตอบนี้ - ง่ายและมีประสิทธิภาพ
Q Studio

ฉันชอบความคิดที่จะตรวจร่างกายเพื่อlogged-inเรียน เพียงแค่ต้องแน่ใจว่าชุดรูปแบบใช้body_class();หรือget_body_class();อื่น ๆ นั่นไม่ใช่โซลูชันที่น่าเชื่อถือที่สุด แม้ว่าฉันจะใช้ฟังก์ชั่นเหล่านั้นในธีมของฉันดังนั้นมันจึงเป็นทางออกที่ดีสำหรับฉัน ขอบคุณสำหรับความคิดที่เรียบง่าย
Michael Ecklund

18

โปรดเพิ่ม body_class () ไปยังเนื้อหา html ของคุณ

<body <?php body_class(); ?>>
   //your html code
</body>

สิ่งนี้จะเพิ่มlogged-inสำหรับผู้ใช้ที่เข้าสู่ระบบจากนั้นคุณสามารถใช้รหัส jquery ต่อไปนี้เพื่อเรียกใช้รหัส juqery ที่กำหนดเองสำหรับผู้ใช้ที่เข้าสู่ระบบเท่านั้น

if ($('body').hasClass('logged-in')) {
       //execute your jquery code.
}

ฉันไม่รู้ว่าทำไมคนนี้ถึงลงคะแนน วิธีการที่ถูกต้องอย่างเต็มที่ +1
ไกเซอร์

ฉันไม่รู้ ฉันมีคำถามเดียวกัน คำตอบนั้นถูกต้อง แต่ทำไมลงคะแนนเสียง
Monirul Islam

ฮึ่ม อาจเป็นเพราะใช้ jQuery แทนวิธีที่ถูกต้อง (ใช้ตัวกรองและการโทรกลับ) บางคนแพ้ jQuery
ไกเซอร์

1
ดี แต่มันจะไม่บอกสถานะการเข้าสู่ระบบจริงถ้าคุณใช้ปลั๊กอินการแคชที่เปิดใช้งานแคชหน้า
Janos Szabo

6

อีกตัวอย่างหนึ่งในกรณีที่คุณต้องการใช้สำหรับการโทร AJAX

// Simplified... please note, that all names/vars/etc. in my class got unique names.
// ...the same goes for the script handler.
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(),
            )
         )

    }
}

วิธีการนี้ใช้ไม่ได้กับ CDN : D
Brian Fegter

@BrianFegter อาจต้องการอธิบาย (หรือแก้ไขใน) ทำไม? :)
ไกเซอร์

เนื่องจาก CDN ไม่รับรองความถูกต้องกับ WordPress is_user_logged_inจะถูกแคชเป็นเท็จใน DOM เมื่อจุดเริ่มต้นถูกตีสถานะของผู้ใช้ควรถูกแยกออกเป็นเธรดที่ไม่มีแคชผ่าน XHR เมื่อใช้ CDN @Mridul Aggarwal ใช้วิธีการได้ แต่ไม่มีส่วนหัวแคชในการตอบกลับ
Brian Fegter

@ BrianFegter จับได้ดี แก้ไขที่ ... ฉันคิดว่า อัพโหวตคำตอบอื่น ๆ เช่นกัน
ไกเซอร์

2

โปรดทราบว่าไม่มีตัวอย่างใด ๆ ข้างต้นที่มีความน่าเชื่อถือในกรณีที่คุณใช้ปลั๊กอินการแคชหน้าจากนั้นรหัสในแท็กร่างกายจะคงที่ นอกจากนี้ยังมีวิธีง่ายๆในการทำเช่นนี้ (โดยไม่ต้องสอบถามเพิ่มเติมเพื่อ ajax ซึ่งไม่เหมาะสม)

หากคุณต้องการทดสอบผู้ใช้ที่เข้าสู่ระบบด้วย javascript คุณสามารถใช้รหัสนี้เพื่อตั้งค่าคุกกี้เมื่อผู้ใช้เข้าสู่ระบบและลบคุกกี้เมื่อผู้ใช้ออกจากระบบ เพิ่มเช่น เพื่อฟังก์ชั่นชุดรูปแบบของคุณ

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

จากนั้นเป็นการทดสอบคุกกี้อย่างง่าย ๆ ใน javascript

if (document.cookie.indexOf('wp_user_logged_in') !== -1) {
    //do something when user logged in
} else {
    //do something when user logged out
}

นี่เป็นเรื่องที่ค่อนข้างง่ายน่าเชื่อถือและในกรณีที่เลวร้ายที่สุดก็สามารถเรียกใช้งานได้ทันทีหลังจากการโหลดหน้าเว็บ (หากโหลดสคริปต์ในส่วนท้ายโดยไม่มีการบล็อกการแสดงผล) ต่างจากคำตอบอื่น ๆ อาแจ็กซ์ช้าและการพึ่งพาคลาสร่างกายจะล้มเหลวในการแคช จำเป็นต้องเพิ่มคุกกี้นี้ไปที่ข้อความนโยบายคุกกี้ ขอบคุณ Janos
Ryszard Jędraszyk

จากการติดตามมีปัญหากับการซิงโครไนซ์คุกกี้เริ่มต้นของคุกกี้และคุกกี้ที่เข้าถึงสคริปต์ที่สร้างขึ้นใหม่ แต่ฉันได้รับคำตอบที่ยอดเยี่ยมและง่าย ๆ เกี่ยวกับวิธีการแก้ปัญหา: stackoverflow.com/questions/56208574/ ......
Ryszard Jędraszyk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.