از کار افتادن ورود آژاکس با اضافه کردن یک اکشن به functions.php

alihesari

کاربر عضو
20/3/13
430
0
16
28
Neyshabur
سلام

وقتی کد زیر رو به function قالب اضافه میکنم قسمت ورود آژاکس قالب که از کار میفته. با استفاده از این کد میخوام کاربر به پیشخوان وردپرس دسترسی نداشته باشه. همچنین وقتی کاربر لاگین میکنه این کد از دسترسی به پیشخوان جلوگیری میکنه چون برای کاربر یک صفحه پروفایل اختصاصی نوشته شده است. در این حالت اگر کاربر آدرس پیشخوان یا صفحه لاگین وردپرس رو زد با استفاده از کد زیر به صفحه پروفایل خودش منتقل میشه:

// Redirect user to profile.php page add_action('init' , 'prevent_profile_access');function prevent_profile_access(){ if (current_user_can('manage_options')) return ''; if (strpos($_SERVER ['REQUEST_URI'] , 'wp-admin' )){ wp_redirect ("http://www.domain.com/profile"); } if (strpos($_SERVER ['REQUEST_URI'] , 'wp-login.php' )){ wp_redirect ("http://www.domain.com/profile"); }}کدهای ورود آژاکس قالب رو هم در زیر قرار میدم وقت داشتین بررسی کنید:

کدهای HTML:

<form id="login" action="login" method="post"> <h1>Site Login</h1> <p class="status"></p> <label for="username">Username</label> <input id="username" type="text" name="username"> <label for="password">Password</label> <input id="password" type="password" name="password"> <a class="lost" href="<?php echo wp_lostpassword_url(); ?>">Lost your password?</a> <input class="submit_button" type="submit" value="Login" name="submit"> <a class="close" href="">(close)</a> <?php wp_nonce_field( 'ajax-login-nonce', 'security' ); ?></form>کدهایی که در function قالب باید قرار بگیرد:

function ajax_login_init(){ wp_register_script('ajax-login-script', get_template_directory_uri() . '/ajax-login-script.js', array('jquery') ); wp_enqueue_script('ajax-login-script'); wp_localize_script( 'ajax-login-script', 'ajax_login_object', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ), 'redirecturl' => home_url(), 'loadingmessage' => __('Sending user info, 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'); }function ajax_login(){ // First check the nonce, if it fails the function will break check_ajax_referer( 'ajax-login-nonce', 'security' ); // Nonce is checked, get the POST data and sign user on $info = array(); $info['user_login'] = $_POST['username']; $info['user_password'] = $_POST['password']; $info['remember'] = true; $user_signon = wp_signon( $info, false ); if ( is_wp_error($user_signon) ){ echo json_encode(array('loggedin'=>false, 'message'=>__('Wrong username or password.'))); } else { echo json_encode(array('loggedin'=>true, 'message'=>__('Login successful, redirecting...'))); } die();}کدهایی جکوئری و آژاکس که باید در فایل (ajax-login-script.js) قرار بگیرد:

کد:
jQuery(document).ready(function($) {    // Show the login dialog box on click    $('a#show_login').on('click', function(e){        $('body').prepend('<div class="login_overlay"></div>');        $('form#login').fadeIn(500);        $('div.login_overlay, form#login a.close').on('click', function(){            $('div.login_overlay').remove();            $('form#login').hide();        });        e.preventDefault();    });    // Perform AJAX login on form submit    $('form#login').on('submit', function(e){        $('form#login p.status').show().text(ajax_login_object.loadingmessage);        $.ajax({            type: 'POST',            dataType: 'json',            url: ajax_login_object.ajaxurl,            data: {                 'action': 'ajaxlogin', //calls wp_ajax_nopriv_ajaxlogin                'username': $('form#login #username').val(),                 'password': $('form#login #password').val(),                 'security': $('form#login #security').val() },            success: function(data){                $('form#login p.status').text(data.message);                if (data.loggedin == true){                    document.location.href = ajax_login_object.redirecturl;                }            }        });        e.preventDefault();    });});
 

hannanstd.ir

مدیر انجمن و توسعه دهنده ووکامرس پارسی
27/9/12
3,477
4
38
لنگرود
خب این مشکل طبیعی هست چون دقیقا فایل آجاکس وردپرس در مسیر زیر قرار داره :

شما عملا دسترسی کاربر رو ازش جلوگیری کردید .

اگر هم دقت کرده باشید تو برخی افزونه ها مثل EDD ، وقتی از طریق سی پنل روی پوشته wp-admin رمز میذارن ، وقتی میخوان محصولی رو به سبد خرید اضافه کنن چون آجکس فراخونی میشه از کاربر پسورد میخواد که به همین دلیل هست ...

 

alihesari

کاربر عضو
20/3/13
430
0
16
28
Neyshabur
اره منم مشکلم همینه شما درست میگی.

ولی راه حل میخوام. که کاربر به پیشخوان وردپرس دسترسی نداشته باشه. راه حلی سراغ دارید؟

اگر توسط افزونه ها امنیتی  مسیر ادمین وردپرس رو تغییر بدم مشکل حل نمیشه؟

 
آخرین ویرایش توسط مدیر:

hannanstd.ir

مدیر انجمن و توسعه دهنده ووکامرس پارسی
27/9/12
3,477
4
38
لنگرود
خب ببینید شما میخواید که اگه کاربری معمولی بود یا سطح بالا نبود مستقیما به آدرس پروفایلش هدایت بشه ... خب توی 2 تا کد پایانی شما مشخص کردید که فقط برای مسیر wp-admin یا wp-login.php این انتقال صورت بگیره که ظاهرا درست هست اما برای کدی که نوشتید به صورت زیر :

if (current_user_can('manage_options')) return '';شما مشخص نکردید که دقیقا توی چه مسیری باید این کار انجام بشه و به این دلیل همه جای سایت این تابع return میشه و از ادامه کد ها جلو گیری میکنه . به نظرم باید به صورت زیر کد رو مینوشتید :

add_action('init' , 'prevent_profile_access');function prevent_profile_access(){ if (strpos($_SERVER ['REQUEST_URI'] , 'wp-admin' ) && !current_user_can('manage_options') ){ wp_redirect ("http://www.domain.com/profile"); } if (strpos($_SERVER ['REQUEST_URI'] , 'wp-login.php' ) && !current_user_can('manage_options') ){ wp_redirect ("http://www.domain.com/profile"); }}که یعنی اگه مسیر wp-admin یا wp-login.php بود و کاربر هم معمولی یا سطح پایین بود این هدایت انجام بگیره ....

البته اگه جواب نداد میتونید از افزونه ی که میتونید برای هر کاربر یا هر نقش خاص آدرس هدایت مشخصی رو انتخاب کنید .

 
آخرین ویرایش توسط مدیر:

alihesari

کاربر عضو
20/3/13
430
0
16
28
Neyshabur
کد زیر رو که شما میگی فقط برای وقتی کاربرد داره که کاربر لاگین شده باشه و قبل از اون کاربردی نداره.

if (current_user_can('manage_options')) return '';کدی هم که باز شما ارائه دادین و ممنون هستم. این کدهم برای هر دو زمانی که کاربر لاگین شده و نشده کار میکنه ولی در اصل برای زمانی که کاربر لاگین نیست و میخواد توسط Ajax لاگین بشه این کد یا کد قبلی من نباید استفاده بشه چون از دسترسی به ajax وردپرس در مسیر wp-admin جلوگیری میکنه. 

if (strpos($_SERVER ['REQUEST_URI'] , 'wp-admin' ) && !current_user_can('manage_options') ){ wp_redirect ("http://www.domain.com/profile"); }حالا من کد رو به صورت زیر تغییر دادم و مشکل ورود آژاکس رفع شده و تنها زمانی که کاربر لاگین هست این کد کاربرد داره. 

if(is_user_logged_in()){ if (current_user_can('manage_options')) return ''; if (strpos($_SERVER ['REQUEST_URI'] , 'wp-admin' )){ wp_redirect ("http://www.toure1.com/profile"); } if (strpos($_SERVER ['REQUEST_URI'] , 'wp-login.php' )){ wp_redirect ("http://www.toure1.com/profile"); } }اگر بخوام در کل مسیر wp-admin رو تغییر بدم یعنی به صورت عادی وقتی کاربر لاگین هم نیست wp-admin یا wp-login.php استفاده کرد با صفحه 404 روبرو بشه از همون افزونه ای که گفتم استفاده کنم خوبه؟ افزونه دیگه ای هم که تست شده باشه و شما بشناسی هست؟

 

hannanstd.ir

مدیر انجمن و توسعه دهنده ووکامرس پارسی
27/9/12
3,477
4
38
لنگرود
راستش تا اونجا که یادمه من خودم واسه این کار از hidemywp استفاده میکردم .

یجا داره نقش کاربری های اصلی رو فقط trust میکردی

 

Mohammad

مدیر انجمن
عضو کادر مدیریت
6/4/08
15,331
278
83
31
PersianScript
ببین این کار نمیکنه

کد:
function themeblvd_disable_admin_bar() {    if( ! current_user_can('edit_posts') )        add_filter('show_admin_bar', '__return_false');    }add_action( 'after_setup_theme', 'themeblvd_disable_admin_bar' ); /** * Redirect back to homepage and not allow access to * WP admin for Subscribers. */function themeblvd_redirect_admin(){    if ( ! current_user_can( 'edit_posts' ) ){        wp_redirect( site_url() );        exit;            }}add_action( 'admin_init', 'themeblvd_redirect_admin' );