Utilizzo di una classe di plugin all'interno di un modello


9

Sto scrivendo un plugin per inviare un invito a un amico che apre un modulo quando si fa clic su un collegamento. Ho incapsulato tutte le funzioni in classe seguendo il codice fornito nel plug-in Report Broken Video di @toscho. Il codice pertinente è di seguito:

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

Sono in perdita su come utilizzare questa classe nel mio modello in modo da poter visualizzare il modulo. So che devo creare un'istanza della classe ma non sono sicuro di dove inserire il codice e come accedere all'oggetto in modo da poterlo utilizzare nel mio modello. Conosco OOP ma non l'ho mai usato prima in questo contesto e ho bisogno di istruzioni passo per passo.

Grazie molto.

Risposte:


9

Il modo migliore per usare la tua classe senza conoscere l'oggetto è un'azione . Registra l'azione prima che vengano caricati i file dei temi per la presentazione, WordPress gestirà il resto.

Codice di esempio:

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

Ora puoi chiamare do_action( 'plugin_action_demo', 50 );da qualche parte nel tuo tema o in un altro plugin e non devi più preoccuparti del funzionamento interno della classe.

Se disattivi il plug-in sei ancora sicuro: WordPress ignora solo azioni sconosciute e do_action()non farà alcun danno. Inoltre, altri plugin sono in grado di rimuovere o sostituire l'azione, quindi hai creato una bella mini API con una add_action().

Puoi anche creare un 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 );
    }
}

Ora print_foo()è accessibile per:

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

Non consiglio il modello Singleton. Ha alcuni gravi inconvenienti .


1
Per curiosità, qual è lo scopo di plugin_action_demoin add_action()? Come fa a do_action( 'print_foo', 50 );sapere che l'azione è plugin_action_demoo è quel nome irrilevante?
Jared

Ok, ero un po 'confuso. :) Grazie per averlo chiarito.
Jared

Per la cronaca: declare()richiede php 5.3+ :)
kaiser

Grazie che funziona devo solo aggiungere un po 'di convalida e dovrei farlo. Grazie @toscho mi hai insegnato molto. :-)
navanitachora

@tosco Trovato la tua risposta alla ricerca di articoli sui singoli per i plugin di WordPress. Ti rendi conto che stai usando un Singleton nella tua risposta raccomandata, non lo stai semplicemente applicando? Immagina una chiamata a tema new Plugin_Action_Demo?? Chiunque utilizzi do_action('plugin_action_demo')attiverà due (2) chiamate Plugin_Action_Demo->print_foo(), non quello che vuoi. Il furore per i singoli non tiene conto dei casi d'uso appropriati. Come FYI, sia io che @ericmann stiamo scrivendo blog per sostenere i singoli per lo spazio dei nomi dei plugin di WordPress, lui su eamann.com e io su hardcorewp.com.
MikeSchinkel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.