web-dev-qa-db-fra.com

Passe $ this pour une fonction imbriquée dans une autre fonction publique de la même classe

Je construis un plugin en utilisant le plugin Boilerplate de WordPress de DevinVinson .

J'ajoute une fonction de shortcode publique pour laquelle j'aurai besoin de ressources (js et css), je veux mettre en file d'attente les scripts (qui vont dans le pied de page) uniquement lorsque cela est nécessaire, je dois donc mettre en file d'attente les scripts juste avant le retour du shortcode .

Grâce à réponse Fayaz , j’ai résolu le problème principal, mais j’en ai eu un petit: je ne peux pas passer $ this-> plugin_name à la fonction shortcode, variable J'ai besoin de nommer correctement les ressources dans la fonction wp_enqueue_script.

Comme Boilerplate ne fournit que des hooks add_action dans la fonction define_public_hooks, je l'ai utilisé et imbriqué dans le hook add_shortcode, comme ceci:

class My_Plugin {
   $plugin_public = new My_Plugin_Public( $this->get_plugin_name(), $this->get_version() );

   $this->loader->add_action( 'init', $plugin_public, 'my_plugin_ajax_register_shortcode' );

}

puis dans le fichier my-plugin-public.php:

class My_Plugin_Public {

  public function __construct( $plugin_name, $version ) {

        $this->plugin_name = $plugin_name;
        $this->version = $version;

    }

  public function my_plugin_ajax_register_shortcode(){


     function the_actual_shortcode($atts){

        $content = 'shortcode content';

        wp_enqueue_script( $this->plugin_name.'_google_maps_api' ); // we don't know what $this->plugin_name is!

        return $content;    
     }
     add_shortcode('my_shortcode', the_actual_shortcode);
 }

}

Comme vous pouvez l’imaginer, la fonction the_actual_shortcode ignore $this->plugin_name, comment puis-je la transmettre?

1
bluantinoo

Il y a plusieurs façons d'accomplir cela. Je vous montre une manière qui ne changera pas fondamentalement la façon dont vous le faites:

Premier dans la classe My_Plugin:

class My_Plugin {
    // ...
    private function define_public_hooks() {
        $plugin_public = new My_Plugin_Public( $this->get_plugin_name(), $this->get_version() );
        $this->loader->add_action( 'init', $plugin_public, 'init' );
        // ...
    }
    // ...
}

Ensuite, dans la classe My_Plugin_Public, créez une nouvelle méthode nommée init. Ici, vous ferez les choses que vous voudrez une fois que le hook d’action WordPress init sera déclenché. Donc, ajouter un shortcode ira dans cette méthode init:

class My_Plugin_Public {

    public function __construct( $plugin_name, $version ) {

        $this->plugin_name = $plugin_name;
        $this->version = $version;

    }

    public function init() {
        add_shortcode( 'my_shortcode', array( $this, 'my_plugin_ajax_register_shortcode' ) );
    }

    public function my_plugin_ajax_register_shortcode( $atts ) {
        $content = 'shortcode content';
        wp_enqueue_script( $this->plugin_name . '_google_maps_api' );
        return $content;
    }
}

Donc, au lieu de créer une fonction interne dans la méthode de classe my_plugin_ajax_register_shortcode, nous utilisons une autre méthode nommée init dans la classe. Nous pourrons maintenant accéder à $this->plugin_name à l’intérieur de la fonction de gestionnaire de shortcode, car elle entre maintenant dans le champ de notre classe My_Plugin_Public.

1
Fayaz