Adicionando o gancho ‘vc_before_init’ dentro de um object

Estou trabalhando no meu primeiro plug-in baseado em OOP (MVC).

Tudo funciona perfeito, enqueue front / back-end styles, páginas do menu do administrador, criação de shortcodes, etc.

Carrego minha class principal de plugins usando o gancho de init .

Do controlador eu instancio a class Custom_VC_Elements (com o construtor ativo).

 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 

O add_shortcode está funcionando sem problemas … De alguma forma, o gancho vc_before_init não é.

Estou fazendo a pergunta aqui e não nos fóruns do Visual Composer, porque o vc_before_init hook funciona perfeitamente a partir do arquivo principal do plugin, portanto, fora de todas as classs de plugins.

Eu tentei o seguinte:

  • Use o nome da class $Custom_VC_Elements vez disso $this .
  • Crie uma class Custom_VC_Elements_init e crie uma instância daquela class assim:
      add_action ('vc_before_init', array (WPWDtools :: load_class ("Custom_VC_Elements_init", "class-custom-vc-elements-init.php", "add-ons"), 'armon_product_link_vc')); 
  • Primeiro admin_init no admin_init e depois no vc_before_init .
  • Primeiro plugins_loaded em plugins_loaded e depois em vc_before_init .

Eu não recebo nenhum erro de php, wp_debug = true … Então, depurando isso, não é fácil …

Como eu disse, este é o meu primeiro plug-in baseado em OOP, então tente explicar sua resposta.

Muito Obrigado!

Saudações, Bjorn

[EDITAR]

Agora ele funciona quando eu (do arquivo principal do plugin) require_once uma vez que um arquivo com o gancho vc_before_init . Então, antes do meu plugin 'init' hook que instancia minha class de plugin principal (abstrato). Arquivo de plugin principal do trecho:

 // 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 . 'classs/class-wpwdtools.php'; // Start plugin. add_action( 'init', array( 'WPWDtools', 'run' ) ); 

Ainda não entendo esse comportamento …? Quando eu verificar dentro do meu arquivo de plugin principal, se o gancho vc_before_init já tiver sido triggersdo, ele retorna true … Mas meu ‘reparo’ (configurando o gancho fora de qualquer class) ainda funciona …? Em suma, não importa onde ou como vc_before_init em uma class, isso sempre falha …

Solutions Collecting From Web of "Adicionando o gancho ‘vc_before_init’ dentro de um object"

vc_before_init hook funciona perfeitamente com o arquivo principal do plugin, portanto, fora de todas as classs de plugins.

Você pode tentar conectá-lo lá, então, talvez. Se você pode instanciar a class no arquivo principal, conforme necessário, e depois encaixá-lo, você deve estar bem:

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

Não tenho certeza se isso funciona bem com suas aulas, no entanto. A outra opção seria usar um gancho que aconteça mais tarde, como parece que vc_before_init já pode ter acontecido. Para testar isso, você poderia fazer:

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

Se você pode se conectar ao vc_before_init no seu construtor de classs, o var_dump deve retornar false . Se for true , a ação já foi executada pelo tempo em que sua class é instanciada.

Eu encontrei a solução … Primeiro pensei que o problema tinha algo a ver com o encaixe do gancho dentro de uma class … Mas depois de alguns testes mais (às vezes você precisa dar um passo para trás), parece que o gancho vc_before_init já disparou o gancho de init com a prioridade (padrão) de 10 …

O meu tema atual (Salient) criou um Visual Composer personalizado, que é fornecido no pacote de temas. Depois de verificar os ganchos do tema com o plugin ‘Priorizar os ganchos’. Descobri que o tema tem o seguinte: add_action( 'init', 'add_nectar_to_vc', 5 );

Agora uso add_action( 'init', array( 'WPWDtools', 'run' ), 4 ); para iniciar o meu plugin, e agora tudo funciona conforme o esperado.

Sem mais mergulhar no meu tema, eu suspeito que força o gancho vc_before_init a triggersr antecipadamente (no ‘init’ com prioridade: 5).

Quero agradecer @phatskat & @gmazzap por me ajudar. Vocês, onde wright, me dizem que o gancho provavelmente já disparou.