ฟังก์ชัน is_plugin_active ไม่มีอยู่


17

ฉันใช้ WordPress 3.0.5 และทดสอบด้วย 3.1rc4 ในไฟล์ PHP หลักของปลั๊กอินของฉันเมื่อฉันพยายามที่จะเรียก is_plugin_active Call to undefined function is_plugin_active()ฉันได้รับ ฉันสามารถเรียก add_action และ add_filter ฉันควรตรวจสอบ / เปลี่ยนแปลงเพื่อแก้ไขปัญหานี้อย่างไร

สิ่งนี้เกิดขึ้นภายในผู้ดูแลระบบในหน้าปลั๊กอิน ที่ด้านบนของไฟล์ปลั๊กอินหลักของฉันฉันมีif (function_exists('is_plugin_active')) {ซึ่งจะส่งกลับเท็จเสมอ

ฉันยังไม่เห็นฟังก์ชั่นจากไฟล์ปลั๊กอินหลักของฉันในปลั๊กอินอื่น ๆ (หากมีประโยชน์)


ฉันไม่แน่ใจจากคำอธิบายของคุณ - หากนี่เป็นปัญหากับปลั๊กอินที่เปิดใช้งานหรือหากคุณพยายามทำอะไรบางอย่างในการเปิดใช้งานหรือภายใต้เงื่อนไขเฉพาะอื่น ๆ ?
Rarst

ฉันพบว่าfunction_exists('is_plugin_active')เป็นเท็จเมื่อมีการเรียกจากไฟล์ปลั๊กอินหลักหากด้านนอกของวิธีการ แต่เป็นจริงเมื่อเรียกว่าภายในของวิธีการที่เรียกว่าสำหรับการactivated_pluginกระทำ
Carl

คุณเห็นข้อผิดพลาดที่หน้าใด หน้าของปลั๊กอิน (wp-admin / plugins.php)? นี่เป็นก่อนหรือหลังจากที่คุณเปิดใช้งานปลั๊กอินที่เป็นปัญหาหรือไม่ Rarst มีจุดดี คุณรู้หรือไม่ว่าสิ่งที่คุณกำลังเรียกฟังก์ชั่นด้วยใน wordpress?
Jonnybojangles

ฉันเห็นข้อผิดพลาดใน wp-admin / plugins.php หลังจากฉันเปิดใช้งานปลั๊กอิน ฉันได้ตรวจสอบวิธีการบางอย่างที่เกี่ยวกับการกระทำและใช้งานได้ที่นี่ ดูเหมือนว่ามันมีบางอย่างที่เกี่ยวข้องกับการรวมคำสั่ง
Carl

มีการโหลดปลั๊กอินตามลำดับตัวอักษรดังนั้นอาจเป็นเพราะปลั๊กอินของคุณไม่ได้รับการประมวลผลเร็วพอ ลองเปลี่ยนชื่อปลั๊กอินของคุณเพื่อเริ่มต้นด้วยตัวอักษร a (เช่น a_myplugin-name) เพื่อให้โหลดได้เร็วขึ้น ตัวเลือกที่ดีที่สุดคือการเรียก function_exists ของคุณบล็อกจากภายในฟังก์ชั่นที่ทำงานหลังจากโหลดปลั๊กอิน คุณสามารถดูลำดับการรันอย่างคร่าวๆได้บน WP codex: codex.wordpress.org/Plugin_API/Action_Reference
Phill Healey

คำตอบ:


29

นั่นเป็นเพราะไฟล์ที่ is_plugin_active () ถูกกำหนดไว้ - wp-admin/includes/plugin.php- ถูกโหลดใน admin เท่านั้นหลังจากที่ปลั๊กอินของคุณถูกโหลดแล้ว

ดังนั้นคุณสามารถเรียกใช้ได้หลังจาก 'admin_init' ถูกไล่ออก:

function check_some_other_plugin() {
  if ( is_plugin_active('some-plugin.php') ) {
    ...
  }
}
add_action( 'admin_init', 'check_some_other_plugin' );

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

1
ดูคำตอบที่อัปเดต
scribu

10

คุณสามารถเรียก is_plugin_active () ในเทมเพลตและจากหน้าผู้ใช้ด้วยซึ่งจะเป็นประโยชน์สำหรับปลั๊กอินที่เกี่ยวข้อง (เช่นต้องการปลั๊กอิน 'xyz' เพื่อใช้งานปลั๊กอินใหม่ของฉัน) คุณต้องรวมไฟล์ plugin.php ด้วยตนเองตามที่ระบุไว้ในเอกสาร is_plugin_active () บน Codex

นี่คือตัวอย่างการใช้งานที่ฉันใช้ในชุดเสริมเพิ่มเติมของฉันเพื่อให้แน่ใจว่าปลั๊กอินฐานฟรีเปิดใช้งานก่อนที่จะเรียกใช้วัตถุ Add-on มันต้องการตะขอและตัวกรองบางอย่างเพื่อให้สามารถใช้งานได้ในปลั๊กอินฐานไม่เช่นนั้นจะมีปัญหา

include_once(ABSPATH.'wp-admin/includes/plugin.php');
if (!function_exists('is_plugin_active') || !is_plugin_active('store-locator-le/store-locator-le.php')) { 
   return;
}

นอกจากนี้หากคุณมีปัญหาเกี่ยวกับ is_plugin_active () จากภายในการเข้าสู่ระบบของผู้ดูแลระบบที่ใช้งานอาจเป็นเพราะคุณกำลังทดสอบก่อนที่ admin_init จะยิง admin_menu ยิงก่อน admin_init และทำการทดสอบใน admin_menu มี "กัด" ฉันมาก่อน ชื่อ "admin_init" ซึ่งดูเหมือนว่าจะต่อต้านฉันง่ายเนื่องจาก admin_menu ทำงานแล้ว ฉันคิดว่า init เป็น "สิ่งแรกที่ต้องรัน" ... บางที admin_kinda_init () น่าจะดีกว่า :)


การเพิ่มinclude_once(ABSPATH.'wp-admin/includes/plugin.php');ไม่ได้เคล็ดลับสำหรับฉัน ขอบคุณ!
เดฟ

8

วิธีแก้ปัญหาที่รวดเร็วและสกปรกคือการทำซ้ำฟังก์ชันด้วยตนเอง:

if ( ! function_exists( 'is_plugin_active' ) ) {
    function is_plugin_active( $plugin ) {
        return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
    }
}

มันค่อนข้างสั้นดังนั้นจึงไม่ควรยากเกินกว่าที่จะนำไปใช้ในโค้ดของคุณเองเพื่อแก้ปัญหา


4

ง่ายและสะดวก นำมาจากWP

if ( ! function_exists( 'is_plugin_active' ) )
     require_once( ABSPATH . '/wp-admin/includes/plugin.php' );

และจากนั้นกรณีใด ๆ ของ

 if ( is_plugin_active( 'feed-them-social/feed-them.php' ) ) {

   }

รับฟังก์ชั่นการตรวจสอบ ดังนั้นไม่มีข้อผิดพลาด


1
หากคุณใช้requireonceคุณอาจไม่จำเป็นต้องตรวจสอบฟังก์ชั่น ... ?
Phill Healey

คุณทำเช่นนั้นเพื่อให้แน่ใจว่ามีการกำหนดปลั๊กอินก่อนที่จะพยายามใช้มิฉะนั้นคุณอาจพบปัญหาในบรรทัด
Spencer Labadie

3

ฉันชอบคำตอบของ Tom Auger ด้วยวิธีการกำหนดฟังก์ชั่น is_plugin_active ของคุณเองแทนที่จะรวม plugin.php อย่างไรก็ตามการใช้ชื่อฟังก์ชั่นเดียวกันทำให้พื้นที่ผู้ดูแลระบบของฉันเสีย ใช้ชื่อฟังก์ชั่นที่แตกต่างกันแก้ไขมัน:

function is_plugin_active_byme( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}

ฉันเห็นด้วย. ในขณะที่คุณสามารถตรวจสอบความขัดแย้งในการประกาศฟังก์ชั่นของคุณ WP ไม่ได้และด้วยเหตุนี้ WP ของคุณจะทำให้เกิดข้อผิดพลาด
Chris Sprague

1

คุณกำลังใช้งานis_plugin_activeภายในผู้ดูแลระบบหรือส่วนหน้าใช่ไหม ฉันค่อนข้างมั่นใจว่าis_plugin_activeเป็นเพียงฟังก์ชั่นผู้ดูแลระบบที่พบใน wp-admin / include / plugin.php

นอกจากนี้ไฟล์ปลั๊กอินหลักของคุณใช้ประโยชน์จากWordpress File Headerหรือไม่? มีการรวมปลั๊กอินของคุณหลังจากโหลดไฟล์ plugin.php ข้างต้นหรือไม่


สิ่งนี้เกิดขึ้นภายในผู้ดูแลระบบในหน้าปลั๊กอิน ปลั๊กอินมีส่วนหัวไฟล์ WP ที่แนะนำ ฉันจะตรวจสอบว่ามีการรวมปลั๊กอินหลังจาก plugin.php ได้อย่างไร?
Carl

1

ในการดีบักปลั๊กอินที่ใช้งานอยู่ให้ทำดังนี้

var_dump(get_option(...));

วิธีตรวจสอบปลั๊กอินเฉพาะ:

in_array(get_option(...));

การกระทำที่เรียกว่า " active_plugins" IIRC


0

วิธีแก้ปัญหาเหล่านี้ไม่เหมาะกับฉัน แต่สิ่งนี้ทำ:

include_once('wp-admin/includes/plugin.php');

ฉันพบโซลูชันนี้ที่codebangers.com

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