web-dev-qa-db-fra.com

Ajout du hook 'vc_before_init' à l'intérieur d'un objet

Je travaille sur mon premier plugin basé sur OOP (MVC).

Tout fonctionne parfaitement, mettre en file d'attente les styles avant/arrière, les pages de menu d'administration, la création de codes courts, etc.

Je charge ma classe de plugin principale en utilisant le hook init.

Depuis le contrôleur, j'instancie la classe Custom_VC_Elements (avec le constructeur actif).

class Custom_VC_Elements {

public function __construct() {
    // Armon Product link shortcode
    add_shortcode( 'armon_product_link', array( $this, 'armon_product_link_shortcode' ) );
    // Armon Product link VC element
    add_action( 'vc_before_init', array( $this, 'armon_product_link_vc' ) ); 
}

// Add armon_product_link element to VC
public function armon_product_link_vc() {
    vc_map( 
        array(
        // All vc_map args here ...
        )
    );
}
} // Class

Le add_shortcode fonctionne sans aucun problème ... D'une manière ou d'une autre, le hook vc_before_init ne l'est pas.

Je pose la question ici et pas sur les forums de Visual Composer, car le hook vc_before_init fonctionne parfaitement à partir du fichier de plugin principal, donc en dehors de toutes les classes de plugins.

J'ai essayé ce qui suit:

  • Utilisez le nom de classe $Custom_VC_Elements au lieu de $this.
  • Créez une classe Custom_VC_Elements_init et créez une instance de cette classe comme suit:
    add_action ('vc_before_init', array (WPWDtools :: load_class ("Custom_VC_Elements_init", "class-custom-vc-elements-init.php", "modules complémentaires"), "armon_product_link_vc"));
  • Accrochez d'abord dans admin_init, puis dans vc_before_init.
  • Accrochez d'abord dans plugins_loaded, puis dans vc_before_init.

Je ne reçois aucune erreur php, wp_debug = true ... Donc le débogage n'est pas facile ..

Comme je l’ai dit, c’est mon premier plugin basé sur OOP, essayez donc d’expliquer votre réponse.

Merci beaucoup!

Cordialement, Bjorn

[MODIFIER]

Cela fonctionne maintenant quand je (depuis le fichier du plugin principal) require_once un fichier avec le hook vc_before_init. Donc, avant mon plugin 'init' hook qui instancie ma classe de plugin principale (abstraite). Fichier de plugin principal Snippet:

// Testing
require_once WPWDTOOLS_ABSPATH . 'add-ons/custom-vc-elements-init.php';
// Load WPWDtools class, which holds common functions and variables.
require_once WPWDTOOLS_ABSPATH . 'classes/class-wpwdtools.php';
// Start plugin.
add_action( 'init', array( 'WPWDtools', 'run' ) );

Je ne comprends toujours pas ce comportement ..? Quand je vérifie dans mon fichier de plugin principal si le hook vc_before_init est déjà activé, il retourne true... Mais mon correctif actuel (placer le hook en dehors de toute classe) fonctionne toujours ..? En bref, peu importe où et comment j'emballe vc_before_init dans une classe, cela échoue toujours.

1
Bjorn

J'ai trouvé la solution ... D'abord, je pensais que le problème avait quelque chose à voir avec l'enroulement du crochet dans une classe .. Mais après quelques tests supplémentaires (il faut parfois prendre du recul), il apparaît que le crochet vc_before_init a déjà tiré sur le hook init avec la priorité (par défaut) de 10 ...

Mon thème actuel (Salient) a créé un compositeur visuel personnalisé, fourni dans le package de thèmes. Après avoir vérifié les points d'ancrage du thème avec le plug-in 'Prioriser les points d'ancrage'. J'ai trouvé que le thème a les caractéristiques suivantes: add_action( 'init', 'add_nectar_to_vc', 5 );

J'utilise maintenant add_action( 'init', array( 'WPWDtools', 'run' ), 4 ); pour démarrer mon plugin, et maintenant tout fonctionne comme prévu.

Sans aller plus loin dans mon thème, je suppose que cela force le crochet vc_before_init à tirer plus tôt (sur 'init' avec priorité: 5).

Je tiens à remercier @phatskat & @gmazzap de m'aider. Vous m'avez dit que le crochet était probablement déjà tiré.

1
Bjorn

le crochet vc_before_init fonctionne parfaitement à partir du fichier de plugin principal, donc en dehors de toutes les classes de plugins.

Vous pouvez essayer d'y accrocher alors peut-être. Si vous pouvez instancier la classe dans le fichier principal selon vos besoins, puis y accrocher, tout devrait bien se passer:

$my_elements = new Custom_VC_Elements();
add_action( 'vc_before_init', array( $my_elements, 'armon_product_link_vc' ) );

Je ne sais pas si cela fonctionne bien avec vos cours, cependant. L'autre option consisterait à utiliser un point d'ancrage plus tard, car il semblerait que vc_before_init soit peut-être déjà passé. Pour tester cela, vous pouvez faire:

<?php

// Top of plugin file - NB that you should never use $GLOBALS
// in production, but this is purely for debugging
$GLOBALS['HAS_VC_BEFORE_INIT_RUN'] = false;

add_action( 'vc_before_init', 'test_my_vc_timing' );

function test_my_vc_timing() {
    $GLOBALS['HAS_VC_BEFORE_INIT_RUN'] = true;
}

// In your class
class Custom_VC_Elements {
    public function __construct() {
        // Snip...
        // DEBUGGING!
        var_dump($GLOBALS['HAS_VC_BEFORE_INIT_RUN']);
        die;
    } // Snip...
} // Class

Si vous pouvez connecter vc_before_init dans le constructeur de votre classe, le var_dump doit renvoyer false. Si c'est true, l'action a déjà été exécutée au moment où votre classe est instanciée.

0
phatskat