Добавление крючка "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 в класс, он всегда терпит неудачу..

Author: Bjorn, 2015-09-28

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 за помощь мне. Вы, ребята, где Райт, говорите мне, что крючок, вероятно, уже сработал.

 1
Author: Bjorn, 2015-09-30 01:10:29

Крючок 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, то действие уже выполнено к моменту создания экземпляра вашего класса.

 0
Author: phatskat, 2015-09-28 14:02:59