Şablonun içinde bir eklenti sınıfı kullanma


9

Bir bağlantı tıklandığında bir formu açan bir arkadaşınıza davet göndermek için bir eklenti yazıyorum. @Toscho tarafından Report Broken Video eklentisinde verilen kodu izleyerek sınıftaki tüm işlevleri kapsülledim. İlgili kod aşağıdadır:

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

Formu görüntüleyebilmem için şablonumda bu sınıfı nasıl kullanacağım konusunda kayboluyorum. Ben sınıf somutlaştırmak gerektiğini biliyorum ama nerede benim kod koymak ve nasıl benim şablonda kullanabilirsiniz böylece nesneye erişmek için emin değilim. OOP bilgim var ama daha önce bu bağlamda kullanmadım ve biraz adım adım talimat gerektiriyor.

Çok teşekkürler.

Yanıtlar:


9

Sınıfınızı nesneyi bilmeden kullanmanın en iyi yolu bir eylemdir . Sunum için tema dosyaları yüklenmeden önce eylemi kaydedersiniz, WordPress gerisini halleder.

Basit kod:

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

Artık do_action( 'plugin_action_demo', 50 );temanızda veya başka bir eklentide bir yeri arayabilir ve artık sınıfın iç işleyişini önemsemeniz gerekmez.

Eklentiyi devre dışı bırakırsanız hala güvende olursunuz: WordPress bilinmeyen eylemleri görmezden gelir ve do_action()zarar vermez. Ayrıca, diğer eklentiler eylemi kaldırabilir veya değiştirebilir, böylece bir tane ile güzel bir mini API oluşturursunuz add_action().

Ayrıca bir singleton da oluşturabilirsiniz:

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

Şimdi print_foo()şunlara erişilebilir:

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

Singleton desenini önermiyorum. Bazı ciddi dezavantajları var .


1
Sadece meraktan, amacı nedir plugin_action_demoiçinde add_action()? do_action( 'print_foo', 50 );Eylemin plugin_action_demobu adın alakasız olduğunu nasıl bilebilir ?
Jared

Tamam, biraz kafam karıştı. :) Temizlediğiniz için teşekkürler.
Jared

Kayıt için: declare()php 5.3+ :) gerektirir
kaiser

Teşekkürler çalışır sadece bazı doğrulama eklemek zorunda ve ben yapılması gerekir. Teşekkürler @toscho, bana çok şey öğrettin. :-)
navanitachora

@tosco Cevabınızı WordPress eklentileri için singletonlarla ilgili makaleler ararken buldunuz. Sen farkında mısın olan sizin tavsiye edilen yanıtında bir Singleton kullanarak, sadece bu prensibi uygulamıyor? Bir temanın aradığını düşünün new Plugin_Action_Demo?? Kullanan herkes istediğini değil, do_action('plugin_action_demo')iki (2) çağrıyı tetikler Plugin_Action_Demo->print_foo(). Tek tektonların üzerindeki hata, uygun kullanım durumları olduğunu göz ardı eder. Bir FYI olarak hem @ericmann hem de ben şimdi WordPress eklentisi ad alanı için tekilleri savunmak için blog yazıyoruz, o eamann.com'da ve ben hardcorewp.com'da.
MikeSchinkel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.