การใช้คลาสปลั๊กอินภายในเทมเพลต


9

ฉันกำลังเขียนปลั๊กอินเพื่อส่งคำเชิญไปให้เพื่อนที่เปิดแบบฟอร์มขึ้นเมื่อมีการคลิกลิงก์ ฉันสรุปฟังก์ชั่นทั้งหมดในชั้นเรียนโดยทำตามรหัสที่ระบุในปลั๊กอินรายงาน Broken Video โดย @toscho รหัสที่เกี่ยวข้องอยู่ด้านล่าง:

/*
Plugin Name: Send Invitation
Plugin URI: http://w3boutique.net
Description: Emails a the link of the current page to a friend
Author: Nandakumar Chandrasekhar
Version: 0.1
Author URI: http://w3boutique.net/about-nanda.html
License: GPL2
*/

// include() or require() any necessary files here

// Settings and/or Configuration Details go here
define('SEND_INVITATION_MIN_WORDPRESS_VERSION', '3.1.1');

define('SEND_INVITATION_PLUGIN_URL', plugins_url('', __FILE__));

add_action( 'init', array( 'SendInvitation', 'nc_sendinvitation_init' ) );

class SendInvitation {

    protected $nonce_name = 'nc_sendinvitation';
    protected $post_url = '';

    public static function nc_sendinvitation_init() {
        new self;
    }

    public function __construct() {
        add_action( 'init', array(&$this, 'nc_sendinvitation_head' ));
        add_action( 'init', array(&$this,  'nc_sendinvitation_check_wordpress_version' ));
       add_action( 'init', array(&$this, 'nc_sendinvitation_form_action' ));
       //$this->post_url = $this->nc_sendinvitation_get_post_url();
   }

   public function nc_sendinvitation_head() {
       wp_enqueue_script( 'jquery' );
       wp_enqueue_script( 'send_invitation_js',
        plugins_url( 'js/send-invitation.js', __FILE__ ),
        array( 'jquery' ) );

       wp_enqueue_style( 'send_invitation_css',
        plugins_url( 'css/send-invitation.css', __FILE__ ) );
   }

   public function nc_sendinvitation_check_wordpress_version() {
       global $wp_version;

       $exit_msg = 'Send Invitation requires version '
    . SEND_INVITATION_MIN_WORDPRESS_VERSION
    . 'or newer <a href="http://codex.wordpress.org/Upgrading_WordPress">Please
update!</a>';

       if ( version_compare( $wp_version, SEND_INVITATION_MIN_WORDPRESS_VERSION, '<') )
       {
            exit( $exit_msg );
       }
   }

   public function nc_sendinvitation_form_action() {

        $action = '';
        if ( $_SERVER['REQUEST_METHOD'] != 'POST' )
        {
             $action = $this->nc_sendinvitation_get_form();
        }
        else if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
            $action = $this->nc_sendinvitation_handle_submit();
        }
        return $action;
   }

   public function nc_sendinvitation_get_form() {
       // Start the output buffer, prevents content being output directly into
       // script, instead it is stored in a buffer which can then be flushed
       // to allow the include file to be stored in a variable
       // See http://www.codingforums.com/showthread.php?t=124537
       ob_start();
       include('send-invitation-form.php');
       $send_invitation_link = ob_get_clean();

       return $send_invitation_link;
   }

   public function nc_sendinvitation_handle_submit() {
         if ( isset( $_POST['form_type'] ) && ( $_POST['form_type'] == 'nc_sendinvitation' ) ) {
            $to = 'navanitachora@gamil.com';
            $subject = 'Invitation to SwanLotus';
            $message = 'Navanitachora invites you to take a look at this link';
            wp_mail($to, $subject, $message);
            $result = 'Email was sent successfully';
    }
    else {
        $result = $this->nc_sendinvitation_get_form();
    }
    return $result;
}

public function nc_sendinvitation_get_post_url() {
    global $post;
    $blog_id = get_option('page_for_posts');
    $post_id = '';
    if (is_home($blog_id)) {
        $post_id = $blog_id;
    } else {
        $post_id = $post->ID;
    }

    return get_permalink($post_id);
}
}
/* End of File */
?>

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

ขอบคุณมาก.

คำตอบ:


9

วิธีที่ดีที่สุดที่จะใช้ชั้นเรียนของคุณโดยไม่ทราบว่าวัตถุที่เป็นการกระทำ คุณลงทะเบียนการกระทำก่อนที่โหลดธีมไฟล์สำหรับงานนำเสนอ WordPress จะจัดการส่วนที่เหลือ

รหัสตัวอย่าง:

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: Plugin Action Demo
 */
add_action( 'init', array ( 'Plugin_Action_Demo', 'init' ) );

class Plugin_Action_Demo
{
    /**
     * Creates a new instance.
     *
     * @wp-hook init
     * @see    __construct()
     * @return void
     */
    public static function init()
    {
        new self;
    }

    /**
     * Register the action. May do more magic things.
     */
    public function __construct()
    {
        add_action( 'plugin_action_demo', array ( $this, 'print_foo' ), 10, 1 );
    }

    /**
     * Prints 'foo' multiple $times.
     *
     * Usage:
     *    <code>do_action( 'plugin_action_demo', 50 );</code>
     *
     * @wp-hook plugin_action_demo
     * @param int $times
     * @return void
     */
    public function print_foo( $times = 1 )
    {
        print str_repeat( ' foo ', (int) $times );
    }
}

ตอนนี้คุณสามารถโทรหาdo_action( 'plugin_action_demo', 50 );ที่ไหนสักแห่งในชุดรูปแบบของคุณหรือในปลั๊กอินอื่นและคุณไม่ต้องสนใจผลงานภายในของชั้นเรียนอีกต่อไป

หากคุณปิดใช้งานปลั๊กอินคุณยังคงปลอดภัย: WordPress เพียงละเว้นการกระทำที่ไม่รู้จักและdo_action()จะไม่ทำอันตราย พลัสปลั๊กอินอื่น ๆ สามารถที่จะถอดหรือเปลี่ยนการดำเนินการเพื่อให้คุณมีสร้าง API add_action()มินิดีกับหนึ่ง

คุณสามารถสร้างซิงเกิลตัน:

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: Plugin Singleton Demo
 */
class Plugin_Singleton_Demo
{
    protected static $instance = NULL;

    /**
     * Creates a new instance if there isn't one.
     *
     * @wp-hook init
     * @return object
     */
    public static function get_instance()
    {

        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    /**
     * Not accessible from the outside.
     */
    protected function __construct() {}

    /**
     * Prints 'foo' multiple $times.
     *
     * @param int $times
     * @return void
     */
    public function print_foo( $times = 1 )
    {
        echo str_repeat( ' foo ', (int) $times );
    }
}

ตอนนี้print_foo()สามารถเข้าถึงได้ต่อ:

Plugin_Singleton_Demo::get_instance()->print_foo();

ฉันไม่แนะนำรูปแบบซิงเกิล แต่ก็มีบางข้อบกพร่องร้ายแรง


1
จากความอยากรู้สิ่งที่เป็นจุดประสงค์ของการplugin_action_demoเข้าadd_action()? จะdo_action( 'print_foo', 50 );รู้ได้อย่างไรว่าการกระทำนั้นเป็นplugin_action_demoหรือชื่อนั้นไม่เกี่ยวข้อง?
Jared

ตกลงสับสนเล็กน้อย :) ขอบคุณสำหรับการล้างข้อมูล
Jared

สำหรับบันทึก: declare()ต้องใช้ php 5.3+ :)
kaiser

ขอบคุณที่ใช้งานได้เพียงต้องเพิ่มการตรวจสอบและฉันควรจะทำ ขอบคุณ @toscho คุณได้สอนฉันมากมาย :-)
navanitachora

@tosco พบคำตอบของคุณที่กำลังมองหาบทความเกี่ยวกับ singletons สำหรับปลั๊กอิน WordPress คุณรู้หรือไม่ว่าคุณกำลังใช้ซิงเกิลตันในคำตอบที่คุณแนะนำคุณไม่ได้บังคับใช้หรือไม่ ลองนึกภาพ themer โทรnew Plugin_Action_Demo?? ใครก็ตามที่ใช้do_action('plugin_action_demo')จะเรียกสอง (2) สายPlugin_Action_Demo->print_foo()ไม่ใช่สิ่งที่คุณต้องการ ความโกรธเกรี้ยวมากกว่าซิงเกิลตันจะมองข้ามว่ามีการใช้งานอย่างเหมาะสม ในฐานะที่เป็น FYI ทั้ง @ericmann และฉันกำลังบล็อกเพื่อสนับสนุน singletons สำหรับ WordPress plugin namespacing เขาที่ eamann.com และฉันที่ hardcorewp.com
MikeSchinkel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.