Tại sao không đăng ký shortcodes nếu bảng điều khiển is_admin?


10

Tôi đã nhận thấy rằng một số plugin như Contact-form-7 , Nextgen-gallery , có thể là các plugin khác, có một tính năng chống thú vị là không đăng ký mã ngắn khi chúng is_admin()là đúng.

Vấn đề là, nếu bạn muốn tạo một số nội dung động (có thể có shortcode) từ ajax và sử dụng cách làm wp "chính xác", admin-ajax.php, không thể không có WP_ADMIN là đúng. Xem những dòng đầu tiên của admin-ajax.php:

define( 'DOING_AJAX', true );
if ( ! defined( 'WP_ADMIN' ) ) {
    define( 'WP_ADMIN', true );
}

Bây giờ, có vẻ như có các phần mở rộng PHP sẽ cho phép bạn bỏ đặt một hằng số xác định (hacky) hoặc có thể có một cách để gây rối với hệ thống WP_Screen không có giấy tờ và $GLOBALS['current_screen']làm cho is_admin()hàm trả về sai ?? Cách giải quyết có thể sử dụng nhất dường như được đăng lên trang hoặc root trang.

Có phải thông thường các plugin đăng ký mã ngắn khi is_admin()sai? Nếu vậy, tôi không thể tìm thấy bất kỳ tài liệu hay lý do nào khác ngoài việc nó có thể là một sự tối ưu hóa sớm.

Câu trả lời:


6

Tôi đã quan sát vấn đề tương tự với contact-form-7 một lúc trước.

Nhưng lưu ý rằng việc đăng ký mã ngắn dựa trên is_admindoing_it_wrong ( xem câu trả lời của gmazzap )

Có hai lý do có vẻ hợp pháp ngay từ cái nhìn đầu tiên (và tại sao chúng sai):

  1. (Không có khả năng) Tác giả plugin đã cố gắng tối ưu hóa tập lệnh để chỉ đăng ký mã ngắn khi cần thiết. Trong trường hợp này, tác giả đã không xem xét rằng shortcode có thể được sử dụng trong các yêu cầu Ajax.

    Sai vì : Tối ưu hóa này không cung cấp bất kỳ hiệu suất tăng. Nó chỉ đơn giản là thêm một giá trị vào mảng "shortcodes" toàn cầu.

  2. (Đây là một khả năng nhiều hơn) Tác giả plugin đã cố tình vô hiệu hóa hỗ trợ cho shortcode trong các yêu cầu Ajax. Với Contact-Form-7, đây có thể là trường hợp vì các biểu mẫu có thể được đặt thành "Gửi qua Ajax". Tuy nhiên, tính năng này yêu cầu biểu mẫu để tải các tệp javascript bổ sung không được tải khi shortcode được phân tích cú pháp thông qua Ajax và javascript được thêm thông qua enqueue_scripts().

    Tác giả đã quyết định vô hiệu hóa hỗ trợ Ajax để ngăn các báo cáo lỗi như "Không sử dụng cái này: Biểu mẫu được hiển thị nhưng nhấp vào nút Gửi không hoạt động. Hoàn toàn lãng phí thời gian!"

    Vì vậy, người dùng sẽ thấy một hình thức làm việc được đảm bảo hoặc không có hình thức nào cả.

    Sai vì : Kiểm tra is_adminlà thực hành xấu ở đây. Các conditon nên kiểm tra nếu hằng số DOING_AJAXđược xác định và đúng.

Mặc dù hầu hết các plugin không sử dụng loại điều kiện này, một số ít có hạn chế đó có thể có do các vấn đề trong quá khứ.

Khi một shortcode chỉ đơn giản là thực hiện một số đầu ra trên trang, không có lý do gì để thêm bất kỳ điều kiện quản trị nào. Tuy nhiên, khi shortcode cũng thực hiện các tệp js hoặc css thì nên hạn chế sử dụng đối với các yêu cầu không phải của quản trị viên / không phải ajax.


2
Không đăng ký shortcode có tác động gần bằng không trong hiệu suất. Đăng ký chỉ cần thêm một biến vào một mảng. Những gì có thể chậm là thực hiện shortcode, không đăng ký nó. Vì vậy, nếu đó là một tối ưu hóa hiệu suất, thì đó là một thất bại. Nếu tác giả plugin muốn vô hiệu hóa shortcode cho ajax, việc kiểm tra is_admindoing_it_wrong có nhiều cách tốt hơn trong WP để kiểm tra các yêu cầu ajax. Cuối cùng, nếu plugin enqueues js / css, nếu nó hoạt động tốt (sử dụng 'wp_enqueue_scripts'hành động) thì nó sẽ không ảnh hưởng đến các trang quản trị vì hook đó không được kích hoạt trong các trang quản trị.
gmazzap

@gmazzap Cảm ơn phản hồi, tôi hoàn toàn đồng ý! Tôi đã cập nhật câu trả lời của mình và thêm thông tin đầu vào của bạn để làm rõ hơn rằng điều kiện này là một thực tiễn tồi.
Philipp

Tôi không nghĩ # 2 có khả năng, vì enqueue_scripts không ảnh hưởng đến the_contentcác cuộc gọi và cuộc gọi admin-ajax.
NoBugs

3

Trên thực tế, không có lý do để không đăng ký shortcodes trên admin.

Nếu các tác giả plugin muốn vô hiệu hóa mẫu plugin Ajax thì họ nên làm

if (defined('DOING_AJAX') && DOING_AJAX)

thay vì kiểm tra là admin.

Lưu ý rằng trong tương lai, có thể Shortdding sẽ được nhúng vào lõi vì đây là "Plugin tính năng".

Nếu nó sẽ xảy ra, shortcode không được xác định trong quản trị viên sẽ không hoạt động với nó. Điều này cung cấp cho bạn một xác nhận khác rằng không có lý do gì để không đăng ký mã ngắn trên quản trị viên: ngay cả các nhà phát triển cốt lõi cũng đang làm việc trên những thứ yêu cầu mã ngắn có sẵn trên quản trị viên.

Điều đó nói rằng, bạn phải có khả năng:

  1. liên hệ với tác giả plugin và xem họ có thể khắc phục hành vi đó không
  2. cố gắng tự tìm giải pháp

Về # 2, thực sự tồn tại các thư viện có thể buộc is_adminphải là sự thật. Bởi họ là hackish, và tôi sẽ không bao giờ sử dụng chúng trong sản xuất.

Một ví dụ là chắp vá .

Sử dụng nó, bạn có thể ghi đè bất kỳ chức năng tùy chỉnh PHP.

Trong một plugin MU bạn có thể làm (hoàn toàn KHÔNG BẮT ĐẦU):

add_action('muplugins_loaded', function() {
  if ( defined('DOING_AJAX') && DOING_AJAX ) {
     require 'path/to/Patchwork.php';
     Patchwork\replace("is_admin", function() {
        return FALSE;
     });
  }
});

Điều này sẽ làm cho is_admin()trả về false trên các yêu cầu ajax.

Tuy nhiên, như đã nói, điều này khá hackish, và sẽ ảnh hưởng đến hành vi của các plugin (và cốt lõi) khác với những tác động không thể đoán trước.

Một điều khác bạn có thể làm là đăng ký trình xử lý shortcode plugin theo yêu cầu của quản trị viên.

Ví dụ: nếu mã plugin là:

if (! is_admin()) {
  add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}

sau đó bạn có thể viết một plugin khác:

if (is_admin()) {
  add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}

Bằng cách này, shortcode sẽ được thêm vào trong cả hai trường hợp.

Điều này có thể hoặc không thể hoạt động một mình tùy thuộc vào mã plugin khác, nhưng không có câu trả lời chung cho việc này.


Bạn cũng có thể add_shortcode('shortcode', array('their-class', 'their-function') )hoặc tương tự.
NoBugs

@nobugs tất nhiên :)
gmazzap

Hoặc một "cách giải quyết" tốt hơn, chỉ cần đăng lên thư mục gốc của trang hoặc lên trang, điều trớ trêu thay là những gì NextGen làm.
NoBugs
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.