我正在开发我的第一个基于面向对象编程(MVC)的插件。
一切都很完美,将前端/后端样式、管理菜单页面、短代码创建等排入队列。。。
我使用init
钩
我从控制器实例化这个类Custom_VC_Elements
(构造函数处于活动状态)。
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
The
add_shortcode
工作没有任何问题。。。不知怎么的
vc_before_init
钩子不是。
我在这里问这个问题,而不是在Visual Composer论坛上,因为vc_before_init
钩子在主插件文件中工作得很好,所以在所有插件类之外。
我尝试了以下方法:
使用类名$Custom_VC_Elements
而是关闭$this
.创建类Custom_VC_Elements_init
并创建该类的实例,如下所示:
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\' ) );
第一次钩入
admin_init
然后进入
vc_before_init
.第一次钩入
plugins_loaded
然后进入
vc_before_init
.我没有收到任何php错误,
wp_debug = true
... 所以调试这并不容易。。
就像我说的,这是我第一个基于OOP的插件,所以请尝试解释你的答案。
非常感谢!
你好,比约恩
[编辑]
现在,当我(从主插件文件中)打开require_once
包含vc_before_init
钩所以,在我的插件之前\'init\'
钩子,它实例化了我的主插件(抽象)类。代码段主插件文件:
// 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\' ) );
我还是不明白这种行为。。?当我检查主插件文件时
vc_before_init
钩子已被激发,它将返回
true
... 但我目前的“修复”(将挂钩设置在任何类之外)仍然有效。。?简而言之,无论我在哪里或如何包装
vc_before_init
在课堂上,它总是失败的。。
SO网友:phatskat
vc\\u before\\u init hook可以从主插件文件中完美地工作,因此在所有插件类之外。
也许你可以试着把它挂在那里。如果您可以根据需要在主文件中实例化该类,然后将其挂钩,那么您应该可以:
$my_elements = new Custom_VC_Elements();
add_action( \'vc_before_init\', array( $my_elements, \'armon_product_link_vc\' ) );
但是,不确定这是否适用于您的类。另一种选择是使用稍后发生的钩子,就像它听起来的那样
vc_before_init
可能已经发生了。要测试这一点,您可以执行以下操作:
<?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
如果你能
vc_before_init
在类构造函数中,然后
var_dump
应返回
false
. 如果是
true
, 那么,在实例化类时,该操作已经运行。