Menggunakan kelas plugin di dalam templat

9

Saya menulis plugin untuk mengirim undangan ke teman yang membuka formulir ketika tautan diklik. Saya merangkum semua fungsi di kelas dengan mengikuti kode yang diberikan dalam plugin Report Broken Video oleh @toscho. Kode yang relevan di bawah ini:

/*
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 = '[email protected]';
            $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 */
?>

Saya bingung bagaimana cara menggunakan kelas ini di templat saya sehingga saya bisa menampilkan formulir. Saya tahu bahwa saya perlu membuat instance kelas tetapi saya tidak yakin di mana harus meletakkan kode dan cara mengakses objek sehingga saya dapat menggunakannya dalam template saya. Saya memiliki pengetahuan tentang OOP tetapi belum menggunakannya dalam konteks ini sebelumnya dan memerlukan sedikit instruksi langkah demi langkah.

Terimakasih banyak.

navanitachora
sumber

Jawaban:

9

Cara terbaik untuk menggunakan kelas Anda tanpa mengetahui objeknya adalah tindakan . Anda mendaftarkan tindakan sebelum file tema untuk presentasi dimuat, WordPress akan menangani sisanya.

Kode sampel:

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

Sekarang Anda dapat memanggil do_action( 'plugin_action_demo', 50 );di suatu tempat di tema Anda atau di plugin lain, dan Anda tidak perlu peduli dengan pekerjaan bagian dalam kelas lagi.

Jika Anda menonaktifkan plugin Anda masih aman: WordPress hanya mengabaikan tindakan yang tidak diketahui dan do_action()tidak akan membahayakan. Plus, plugin lain dapat menghapus atau mengganti tindakan, sehingga Anda telah membangun mini API yang bagus dengan satu add_action().

Anda juga bisa membangun 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 );
    }
}

Sekarang print_foo()dapat diakses per:

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

Saya tidak merekomendasikan pola Singleton. Ini memiliki beberapa kelemahan serius .

fuxia
sumber
1
Karena penasaran, apa tujuan dari plugin_action_demodi add_action()? Bagaimana do_action( 'print_foo', 50 );mengetahui bahwa tindakan itu plugin_action_demoatau apakah nama itu tidak relevan?
Jared
Ok, agak bingung. :) Terima kasih sudah menjelaskannya.
Jared
Sebagai catatan: declare()membutuhkan php 5.3+ :)
kaiser
Terima kasih yang berfungsi hanya perlu menambahkan beberapa validasi dan saya harus selesai. Terima kasih @toscho Anda telah mengajari saya banyak hal. :-)
navanitachora
@tosco Menemukan jawaban Anda mencari artikel tentang lajang untuk plugin WordPress. Anda sadar bahwa Anda sedang menggunakan Singleton dalam jawaban direkomendasikan Anda, Anda hanya tidak menegakkan itu? Bayangkan panggilan themer new Plugin_Action_Demo?? Siapa pun yang menggunakan do_action('plugin_action_demo')akan memicu dua (2) panggilan Plugin_Action_Demo->print_foo(), bukan apa yang Anda inginkan. Kehebohan tentang lajang mengabaikan ada kasus penggunaan yang tepat. Sebagai FYI baik @ericmann dan saya sedang ngeblog sekarang untuk mengadvokasi lajang untuk namespacing plugin WordPress, dia di eamann.com dan saya di hardcorewp.com.
MikeSchinkel