Utiliser une classe de plugin dans un modèle


9

J'écris un plugin pour envoyer une invitation à un ami qui ouvre un formulaire lorsque l'on clique sur un lien. J'ai encapsulé toutes les fonctions de la classe en suivant le code donné dans le plugin Report Broken Video par @toscho. Le code correspondant est ci-dessous:

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

Je ne sais pas comment utiliser cette classe dans mon modèle afin de pouvoir afficher le formulaire. Je sais que j'ai besoin d'instancier la classe, mais je ne sais pas où mettre le code et comment accéder à l'objet afin de pouvoir l'utiliser dans mon modèle. Je connais la POO mais je ne l'ai pas utilisé dans ce contexte auparavant et j'ai besoin d'un peu d'instructions étape par étape.

Merci beaucoup.

Réponses:


9

La meilleure façon d'utiliser votre classe sans connaître l'objet est une action . Vous enregistrez l'action avant le chargement des fichiers de thème pour la présentation, WordPress s'occupera du reste.

Exemple de code:

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

Maintenant, vous pouvez appeler do_action( 'plugin_action_demo', 50 );quelque part dans votre thème ou dans un autre plugin, et vous n'avez plus à vous soucier du fonctionnement interne de la classe.

Si vous désactivez le plugin, vous êtes toujours en sécurité: WordPress ignore simplement les actions inconnues et do_action()ne fera aucun mal. De plus, d'autres plugins peuvent supprimer ou remplacer l'action, vous avez donc construit une belle mini API avec une add_action().

Vous pouvez également créer 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 );
    }
}

Maintenant print_foo()accessible par:

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

Je ne recommande pas le motif Singleton. Elle présente de sérieux inconvénients .


1
Par curiosité, quel est le but de plugin_action_demodans add_action()? Comment do_action( 'print_foo', 50 );sait que l'action est plugin_action_demoou est ce nom non pertinent?
Jared

Ok, c'était un peu confus. :) Merci d'avoir clarifié cela.
Jared

Pour mémoire: declare()nécessite php 5.3+ :)
kaiser

Merci, cela fonctionne, il suffit d'ajouter une validation et je devrais avoir terminé. Merci @toscho, vous m'avez beaucoup appris. :-)
navanitachora

@tosco Vous avez trouvé votre réponse à la recherche d'articles sur les singletons pour les plugins WordPress. Vous ne réalisez que vous êtes utilisez un Singleton dans votre réponse recommandée, vous êtes tout simplement pas l' imposer? Imaginez un appel de thème new Plugin_Action_Demo?? Toute personne utilisant do_action('plugin_action_demo')déclencherait deux (2) appels vers Plugin_Action_Demo->print_foo(), pas ce que vous voulez. La fureur sur les singletons ignore qu'il existe des cas d'utilisation appropriés. En tant que FYI, @ericmann et moi bloguons maintenant pour défendre les singletons pour l'espacement de noms des plugins WordPress, lui sur eamann.com et moi sur hardcorewp.com.
MikeSchinkel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.