ฟังก์ชั่นเครื่องมือที่กำหนดเองในปลั๊กอินไม่ทำงาน?


15

ฉันเอารหัสออกจากหนึ่งในชุดรูปแบบของฉันที่ฉันสร้างขึ้นและเป็นรายการของทั้ง 50 รัฐในรายการที่ไม่มีการเรียงลำดับที่บรรจุในวิดเจ็ตที่คุณสามารถลากและวางบนแถบข้างได้

ปัญหาคือเมื่อฉันลองใช้รหัสนี้ในไฟล์ PLUGIN ฉันได้รับข้อผิดพลาดต่อไปนี้:

Fatal error: Call to a member function register() on a non-object in C:\xampp\htdocs\wordpress\wp-includes\widgets.php on line 431

ทำไมมันถึงทำงานในธีม แต่ไม่ใช่ในปลั๊กอิน? ยังไงก็ตามธีมที่ใช้งานไม่ได้เป็นธีมที่ฉันเอารหัสออกมา

นี่คือรหัสของฉัน: http://pastebin.com/ZeRWW3yb

ขอบคุณ

คำตอบ:


15

ลองเปลี่ยน:

register_widget('States_Widget');

ด้วย:

add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
    register_widget('States_Widget');
}

ดีใจที่ฉันช่วยได้
Bainternet

2
One-liner: add_action ('widgets_init', create_function ('', 'return register_widget ("States_Widget");'));
Zachary Schuessler

3
หนึ่ง liners เหล่านั้นมีข้อเสียอย่างรุนแรงว่าหากผู้ใช้ต้องการที่จะออก remove_action พวกเขาไม่สามารถเพราะไม่มีฟังก์ชั่นติดยาเสพติดที่สามารถลบออกได้
Elliot

1

ให้เราสมมติว่าคุณต้องเริ่มต้นวิดเจ็ตภายในวิธีการเรียนโดยส่งชื่อวิดเจ็ตเป็นอาร์กิวเมนต์ ในการทำสิ่งนี้ให้สำเร็จคุณต้องทำสิ่งนี้:

class WidgetMonster {
    /**
     * Register widget via PHP lambda function as an argument to the add_action function
     * @var $widget_name string | WP_Widget.
     */
    public static function register_widget_helper( $widget_name ) {
        add_action('widgets_init',
            function() use ( &$widget_name ) {
                return register_widget( $widget_name );
            }
        );
    }
}

โปรดทราบว่าเราต้องส่ง$widget_nameชื่อตัวแปรไปยังฟังก์ชันแลมบ์ดาของเราเพื่อใช้งาน use (&$widget_name)ส่วนที่ทำเช่นนี้คือ ตามที่ระบุไว้แล้ว hooks เริ่มต้นเช่นนี้ไม่สามารถลบremove_actionได้

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