ทำไมไม่ลงทะเบียนรหัสย่อถ้า is_admin แดชบอร์ด?


10

ฉันสังเกตเห็นว่าปลั๊กอินบางตัวเช่นContact-form-7 , Nextgen-galleryหรืออาจเป็นอื่น ๆ นั้นมีคุณสมบัติต่อต้านที่น่าสนใจที่ไม่ได้ลงทะเบียนรหัสย่อเมื่อis_admin()เป็นจริง

สิ่งที่เป็นปัญหาคือถ้าคุณต้องการสร้างเนื้อหาแบบไดนามิก (ซึ่งอาจมีรหัสย่อ) จาก ajax และใช้วิธี wp "ถูกต้อง" ในการทำมัน admin-ajax.php เป็นไปไม่ได้ที่จะไม่มี WP_ADMIN เป็นจริง ดูบรรทัดแรกของ admin-ajax.php:

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

ตอนนี้ดูเหมือนว่ามีส่วนขยาย PHP ที่จะช่วยให้คุณยกเลิกการตั้งค่าคงที่ที่กำหนด (แฮ็ค) หรืออาจมีวิธีที่จะยุ่งกับระบบ WP_Screen ที่ไม่มีเอกสารและ$GLOBALS['current_screen']เพื่อให้is_admin()ฟังก์ชั่นกลับเท็จ? วิธีแก้ปัญหาที่ใช้งานได้มากที่สุดดูเหมือนจะโพสต์ไปยังหน้าเว็บหรือรูทไซต์

มันเป็นเรื่องปกติสำหรับปลั๊กอินที่จะลงทะเบียนรหัสย่อของพวกเขาเมื่อis_admin()เป็นเท็จ? ถ้าเป็นเช่นนั้นฉันไม่สามารถหาเอกสารหรือเหตุผลอื่นใดนอกเหนือจากนั้นอาจเป็นการปรับให้เหมาะสมก่อนเวลาอันควร

คำตอบ:


6

ฉันได้สังเกตเห็นปัญหาเดียวกันกับ contact-form-7 สักครู่

แต่โปรดทราบว่าการลงทะเบียนรหัสย่อที่อิงอยู่is_adminคือdoing_it_wrong ( ดูคำตอบของ gmazzap`s )

มีสองเหตุผลที่ดูเหมือนถูกต้องตามกฎหมายตั้งแต่แรกเห็น (และทำไมพวกเขาจะไม่ถูกต้อง):

  1. (ไม่น่าเป็นไปได้) ผู้สร้างปลั๊กอินพยายามปรับแต่งสคริปต์ให้ลงทะเบียนรหัสย่อเมื่อจำเป็นเท่านั้น ในกรณีนี้ผู้เขียนไม่ได้พิจารณาว่าอาจใช้รหัสย่อในคำขอ Ajax

    ผิดเพราะ : การเพิ่มประสิทธิภาพนี้ไม่ได้เพิ่มประสิทธิภาพใด ๆ มันเพียงเพิ่มมูลค่าให้กับอาร์เรย์ "รหัสย่อที่ลงทะเบียน" ทั่วโลก

  2. (นี่เป็นโอกาสที่มากกว่า) ผู้เขียนปลั๊กอินได้ปิดการใช้งานการสนับสนุนสำหรับรหัสย่อในคำขอ Ajax ด้วย Contact-Form-7 อาจเป็นกรณีนี้เนื่องจากแบบฟอร์มสามารถตั้งค่าเป็น "ส่งผ่าน Ajax" enqueue_scripts()อย่างไรก็ตามคุณลักษณะนี้ต้องใช้แบบฟอร์มที่จะโหลดไฟล์จาวาสคริปต์เพิ่มเติมที่ไม่ได้โหลดเมื่อรหัสจะแยกวิเคราะห์ผ่านทางอาแจ็กซ์และจาวาสคริปต์ที่เพิ่มผ่าน

    ผู้เขียนตัดสินใจที่จะปิดการใช้งานการสนับสนุน Ajax เพื่อป้องกันรายงานข้อผิดพลาดเช่น "อย่าใช้สิ่งนี้: แบบฟอร์มจะปรากฏขึ้น แต่การคลิกปุ่มส่งใช้งานไม่ได้

    ดังนั้นผู้ใช้จะเห็นแบบฟอร์มรับประกันการทำงานหรือไม่มีแบบฟอร์มเลย

    ผิดเพราะ : การตรวจสอบหาis_adminแนวทางปฏิบัติที่ไม่ดีที่นี่ Conditon ควรตรวจสอบว่าDOING_AJAXมีการกำหนดค่าคงที่และเป็นจริงหรือไม่

แม้ว่าปลั๊กอินส่วนใหญ่จะไม่ใช้เงื่อนไขเช่นนี้ แต่มีข้อ จำกัด บางประการที่อาจเป็นเพราะปัญหาในอดีต

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


2
การไม่ลงทะเบียนรหัสย่อมีผลกระทบเกือบเป็นศูนย์ต่อประสิทธิภาพ การลงทะเบียนเพียงแค่เพิ่มตัวแปรให้กับอาร์เรย์ สิ่งที่อาจช้าคือการใช้รหัสย่อไม่ใช่ลงทะเบียน ดังนั้นถ้ามันเป็น optimizazion การแสดงก็เป็นหนึ่งที่ล้มเหลว หากผู้เขียนปลั๊กอินต้องการปิดใช้งานรหัสอาแจ็กซ์, การตรวจสอบการis_adminเป็นdoing_it_wrongมีกำลังวิธีที่ดีกว่าใน WP เพื่อตรวจสอบสำหรับการร้องขออาแจ็กซ์ ท้ายที่สุดถ้าปลั๊กอินจัดคิว js / css ถ้าทำได้ดี (ใช้'wp_enqueue_scripts'การกระทำ) จะไม่มีผลกับหน้าผู้ดูแลระบบเพราะฮุคนั้นไม่ได้ถูกยิงในหน้าผู้ดูแลระบบ
gmazzap

@ gmazzap ขอบคุณสำหรับข้อเสนอแนะฉันเห็นด้วยทั้งหมด! ฉันได้อัปเดตคำตอบของฉันและเพิ่มข้อมูลของคุณเพื่อให้ชัดเจนยิ่งขึ้นว่าเงื่อนไขเป็นการปฏิบัติที่ไม่ดี
ฟิลิปป์

ฉันไม่คิดว่า # 2 น่าจะเป็นเพราะ enqueue_scripts ไม่ควรส่งผลกระทบต่อการthe_contentโทรและการโทร admin-ajax
NoBugs

3

ที่จริงแล้วไม่มีเหตุผลที่จะไม่ลงทะเบียนรหัสย่อในผู้ดูแลระบบ

หากผู้เขียนปลั๊กอินต้องการปิดใช้งานปลั๊กอิน Ajax พวกเขาควรทำ

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

แทนที่จะตรวจสอบว่าเป็นผู้ดูแล

โปรดทราบว่าในอนาคตมีความเป็นไปได้ที่Shortcakeจะถูกฝังอยู่ในคอร์เนื่องจากเป็น "Feature Plugin"

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

ที่กล่าวว่าคุณต้องเป็นไปได้:

  1. ติดต่อผู้เขียนปลั๊กอินและดูว่าพวกเขาสามารถแก้ไขพฤติกรรมนั้นได้หรือไม่
  2. พยายามหาทางแก้ไขด้วยตัวเอง

เกี่ยวกับ # 2 มีอยู่จริงไลบรารีที่สามารถบังคับis_adminให้เป็นจริง โดยพวกเขาแฮ็คและฉันจะไม่ใช้พวกเขาในการผลิต

ตัวอย่างคือการเย็บปะติดปะต่อกัน

ใช้มันคุณสามารถแทนที่ฟังก์ชั่นที่กำหนดเองของ PHP

ในปลั๊กอิน MUคุณสามารถทำได้ (ไม่ได้ทดสอบอย่างสมบูรณ์):

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

สิ่งนี้จะis_admin()คืนค่าเท็จในคำขออาแจ็กซ์

อย่างไรก็ตามตามที่กล่าวมามันค่อนข้างแฮ็คและจะมีผลกับปลั๊กอินอื่น ๆ (และแกน) พฤติกรรมที่คาดเดาไม่ได้

อีกสิ่งหนึ่งที่คุณสามารถทำได้คือการลงทะเบียนเครื่องมือจัดการรหัสย่อบนคำขอของผู้ดูแลระบบ

เช่นถ้ารหัสปลั๊กอินคือ:

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

จากนั้นคุณสามารถเขียนปลั๊กอินอื่นที่:

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

วิธีนี้จะเพิ่มรหัสย่อในทั้งสองกรณี

สิ่งนี้อาจหรืออาจไม่ทำงานคนเดียวทั้งนี้ขึ้นอยู่กับรหัสปลั๊กอินอื่น ๆ แต่ไม่มีคำตอบทั่วไปเกี่ยวกับเรื่องนี้


คุณสามารถadd_shortcode('shortcode', array('their-class', 'their-function') )หรือคล้ายกัน
NoBugs

@nobugs แน่นอน :)
gmazzap

หรือ "วิธีแก้ปัญหา" ที่ดีกว่าเพียงโพสต์ไปที่รูทของเว็บไซต์หรือไปที่หน้าเว็บ
NoBugs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.