Sử dụng một lớp plugin bên trong một mẫu


9

Tôi đang viết một plugin để gửi lời mời đến một người bạn mở ra một biểu mẫu khi nhấp vào một liên kết. Tôi đã gói gọn tất cả các chức năng trong lớp bằng cách làm theo mã được đưa ra trong plugin Báo cáo Video bị hỏng bởi @toscho. Mã liên quan dưới đây:

/*
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 */
?>

Tôi không biết làm thế nào để sử dụng lớp này trong mẫu của mình để tôi có thể hiển thị biểu mẫu. Tôi biết rằng tôi cần khởi tạo lớp nhưng tôi không chắc chắn nên đặt mã ở đâu và làm thế nào để truy cập vào đối tượng để tôi có thể sử dụng nó trong mẫu của mình. Tôi có kiến ​​thức về OOP nhưng chưa từng sử dụng nó trong bối cảnh này trước đây và yêu cầu một chút hướng dẫn từng bước.

Cảm ơn nhiều.

Câu trả lời:


9

Cách tốt nhất để sử dụng lớp của bạn mà không biết đối tượng là một hành động . Bạn đăng ký hành động trước khi các tệp chủ đề để trình bày được tải, WordPress sẽ xử lý phần còn lại.

Mã mẫu:

<?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 );
    }
}

Bây giờ bạn có thể gọi do_action( 'plugin_action_demo', 50 );một nơi nào đó trong chủ đề của bạn hoặc trong một plugin khác và bạn không phải quan tâm đến hoạt động bên trong của lớp nữa.

Nếu bạn tắt plugin, bạn vẫn an toàn: WordPress chỉ cần bỏ qua các hành động không xác định và do_action()sẽ không có hại. Ngoài ra, các plugin khác có thể xóa hoặc thay thế hành động, vì vậy bạn đã xây dựng một API nhỏ đẹp bằng một add_action().

Bạn cũng có thể xây dựng một singleton:

<?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 );
    }
}

Bây giờ print_foo()có thể truy cập mỗi:

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

Tôi không đề xuất mẫu Singleton. Nó có một số nhược điểm nghiêm trọng .


1
Ra khỏi tò mò, mục đích của là những gì plugin_action_demotrong add_action()? Làm thế nào để do_action( 'print_foo', 50 );biết rằng hành động đó là plugin_action_demohoặc tên đó không liên quan?
Jared

Ok, có một chút bối rối. :) Cám ơn giải thích rõ ràng.
Jared

Đối với bản ghi: declare()yêu cầu php 5.3+ :)
kaiser

Cảm ơn rằng công việc chỉ cần thêm một số xác nhận và tôi nên được thực hiện. Cảm ơn @toscho bạn đã dạy tôi rất nhiều. :-)
navanitachora

@tosco Tìm thấy câu trả lời của bạn đang tìm kiếm các bài viết về singletons cho các plugin WordPress. Bạn có nhận ra rằng bạn đang sử dụng Singleton trong câu trả lời được đề xuất của bạn, bạn chỉ không thực thi nó? Hãy tưởng tượng một cuộc gọi theo chủ đề new Plugin_Action_Demo?? Bất cứ ai sử dụng do_action('plugin_action_demo')sẽ kích hoạt hai (2) cuộc gọi đến Plugin_Action_Demo->print_foo(), không phải những gì bạn muốn. Các furor trên singletons bỏ qua có trường hợp sử dụng thích hợp. Là một FYI cả @ericmann và tôi hiện đang viết blog để ủng hộ các singletons cho việc đặt tên cho plugin WordPress, anh ấy ở eamann.com và tôi tại Hardwp.com.
MikeSchinkel
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.