Добавление крючка "vc перед инициализацией" внутри объекта
Я работаю над своим первым плагином на основе ООП (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
add_shortcode
работает без каких-либо проблем... Каким-то образом vc_before_init
крючок не является.
Я задаю вопрос здесь, а не на форумы визуального композитора, потому что 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
... Так что отладка этого не легко..
Как я уже сказал, это мой первый плагин на основе ООП, поэтому, пожалуйста, попробуйте объяснить свой ответ.
Большое спасибо!
С уважением, Бьорн
[РЕДАКТИРОВАТЬ]
Теперь это работает, когда я (из основного файла плагина) 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
в класс, он всегда терпит неудачу..
2 answers
Я нашел решение...
Сначала я подумал, что проблема как-то связана с тем, чтобы обернуть крючок внутри класса.. Но после некоторого дополнительного тестирования (иногда вам нужно сделать шаг назад), похоже, что крючок vc_before_init
уже сработал на крючке init
с приоритетом (по умолчанию) 10...
Моя текущая тема (Заметная) создала пользовательский визуальный композитор, который предоставляется в пакете темы.. После проверки крючков темы с помощью плагина "Расставить приоритеты". Я обнаружил, что тема имеет следующий:
add_action( 'init', 'add_nectar_to_vc', 5 );
Теперь я использую add_action( 'init', array( 'WPWDtools', 'run' ), 4 );
для запуска своего плагина, и теперь все работает так, как ожидалось.
Не углубляясь в мою тему дальше, я подозреваю, что это заставляет крючок vc_before_init
срабатывать рано (при "инициализации" с приоритетом:5).
Я хочу поблагодарить @phatskat и @gmazzap за помощь мне. Вы, ребята, где Райт, говорите мне, что крючок, вероятно, уже сработал.
Крючок Vc_before_init отлично работает из основного файла плагина, поэтому вне всех классов плагинов.
Тогда, возможно, вы можете попробовать подключить его там. Если вы можете создать экземпляр класса в главном файле по мере необходимости, а затем подключиться к нему, все должно быть в порядке:
$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
, то действие уже выполнено к моменту создания экземпляра вашего класса.