is_admin () trả về true khi sử dụng admin-ajax.php từ tập lệnh front end


7

Có một tình huống ngày hôm nay khi tôi đang sử dụng admin-ajax.php từ một kịch bản giao diện người dùng. Theo tôi hiểu thì đây là cách wp để thực hiện các cuộc gọi ajax (đăng ký chức năng của tôi với hook wp_ajax_nopriv_myfeft)

Dường như với tôi rằng vì admin-ajax.php ở phía quản trị is_admin () trả về true trong khi tập lệnh của tôi gọi nó từ phía trước.

Điều này gây ra sự cố với plugin tôi sử dụng, thực hiện mọi thứ khác nhau ở phía trước và phía quản trị viên.

Vì vậy, tôi đã tự hỏi nếu tôi đã làm điều gì sai

Có cách nào để sử dụng ajax ở phía trước kết thúc wp và có is_admin () để trả về false không?

hy vọng tôi có thể làm cho mình hiểu


Đúng. Bạn có thể sử dụng hàm wp_doing_ajax () để kiểm tra xem nó có thực hiện yêu cầu AJAX hay không.
maheshwaghmare

Câu trả lời:


5

WordPress đặt is_admin()thành đúng cho tất cả các yêu cầu ajax (front-end hoặc admin-side). (Xem bản ).

Không có chuyện vượt quá điều này (và dù sao bạn cũng không nên). Nếu yêu cầu ajax của bạn có thể được loại bỏ từ cả phía trước và phía quản trị viên, thì bạn có thể muốn đưa vào đó có phải là 'quản trị viên' hay không khi bạn đăng dữ liệu. Nhưng không có bất kỳ chi tiết nào về 'các vấn đề' mà ​​trình cắm của bạn gây ra, thật khó để cung cấp một công việc.


1

is_admin()luôn trả về truecho mọi cuộc gọi AJAX. Nếu bạn muốn xác thực các cuộc gọi AJAX chỉ từ frontend, đây có thể là một cách giải quyết:

if (!isset($GLOBALS['current_screen']) && !is_customize_preview()) {
    // AJAX calls from frontend, excludes customize preview screen.
}

0

Tôi biết điều này đã cũ, nhưng trong trường hợp nó giúp bất kỳ ai khác vấp phải điều này ...

những gì tôi thường làm là đặt một số loại cờ trong biểu mẫu lối vào của tôi để biểu thị rằng yêu cầu đến là ajax.

<input type="hidden" id="my_ajax_flag" name="my_ajax_flag" value="false" />

Ban đầu, cái này được đặt thành "false", sau đó tôi chuyển thành "true" trong khi bắt đầu xử lý ajax.

$('#my_ajax_flag').val('true'); // example using jQuery

sau đó ở phía quản trị viên của mã của tôi, tôi kiểm tra tham số đó và sau đó bao gồm các móc ajax của tôi hoặc thực hiện công cụ quản trị không phải là ajax thông thường của tôi. Ví dụ:

if ( isset( $_REQUEST['my_ajax_flag'] ) && $_REQUEST['my_ajax_flag'] == 'true' ) {
    add_action('wp_ajax_my_ajax_function', 'my_ajax_function');     
    add_action('wp_ajax_no_priv_my_ajax_function', 'my_ajax_function');
} else {
    // regular non-ajax stuff
}

tùy thuộc vào những gì bạn cần làm, có nhiều biến thể của ý tưởng này, nhưng nó cho phép bạn giữ mã quản trị thường xuyên của mình không can thiệp hoặc bắn trong khi thực hiện các yêu cầu ajax.

một đề xuất khác có thể hữu ích là đặt thuộc tính "noheader" của WordPress trong các biểu mẫu của bạn.

<input type="hidden" name="noheader" value="true" />

khi thực hiện xử lý phụ trợ mà cuối cùng dẫn đến chuyển hướng (được khuyến nghị để tránh việc gửi biểu mẫu kép đáng sợ), trong các trường hợp rìa hiếm khi bạn cần truy cập vào các móc wp thường xảy ra sau khi "tiêu đề đã được gửi".


3
Không cần thiết: Chỉ cần kiểm tra defined( 'DOING_AJAX' ) && DOING_AJAX.
fuxia

Hoặc nếu mã của bạn mở rộng WooC Commerce sử dụng chức năng của họ is_ajax(). Có, nó chỉ kiểm tra @toscho có điều kiện được đề cập, nhưng ngắn hơn một chút.
James Jones

Tùy thuộc vào phương thức của bên thứ 3 có thể thay đổi bất cứ lúc nào vì mục đích lưu một vài byte mã chỉ là thực tế xấu. Đừng lười biếng và làm điều này. Nếu có bất cứ điều gì, hãy xây dựng phương thức này vào khung cơ sở của riêng bạn nếu bạn khăng khăng lưu một vài byte.
Lai Web Dev

0

Tôi muốn bật / tắt đăng nhập ở mặt trước và quản trị viên bằng nút menu bảng điều khiển. Tôi chỉ cần thêm một lớp vào nút menu của mình và sau đó truy vấn trạng thái trang quản trị với jQuery

https://codex.wordpress.org/Class_Reference/WP_Admin_Bar/add_menu

Thêm một mục menu với trạng thái quản trị viên là một lớp

$wp_admin_bar -> add_menu(
  array(
        'title'     => '<span class="ab-icon"></span><span class="ab-label">' . __( 'Console Logging' , 'console-logging' ) . '</span>',
        'id'        => 'your-custom-id',
        'parent'    => false,
        'href'      => '',
        'meta'      => array('class' => 'is-admin-'.is_admin())//GET ACTUAL ADMIN OR NOT in php before page load
));

Lấy mục trình đơn bằng jQuery trong javascript và sử dụng nó:

 //'is-admin-1' when is_admin() is true
 //'is-admin-0' when is_admin() is false

var is_admin = $('#wp-admin-bar-your-custom-id').hasClass('is-admin-1');

if(is_admin){
    //You are actually on an admin page
}else{
    //You are on a front end page
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.