在对象内添加挂接‘vc_Beresing_init’

时间:2015-09-28 作者:Bjorn

我正在开发我的第一个基于面向对象编程(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
Theadd_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.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 在课堂上,它总是失败的。。

2 个回复
最合适的回答,由SO网友:Bjorn 整理而成

我找到了解决方案。。。首先,我认为问题与在类中包装挂钩有关。。但经过更多的测试(有时你需要后退一步),它似乎是钩子vc_before_init 已向init 挂钩(默认)优先级为10。。。

我当前的主题(突出)制作了一个自定义的视觉作曲家,该作曲家在主题包中提供。。在使用“优先挂钩”插件检查主题挂钩之后。我发现这个主题有以下几个方面:add_action( \'init\', \'add_nectar_to_vc\', 5 );

我现在使用add_action( \'init\', array( \'WPWDtools\', \'run\' ), 4 ); 启动我的插件,现在一切正常。

没有深入探讨我的主题,我怀疑这会迫使vc_before_init 提前挂起点火(在“init”上,优先级:5)。

我要感谢@phatskat&@谢谢你帮我。你们这些家伙,赖特,告诉我鱼钩可能已经开火了。

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, 那么,在实例化类时,该操作已经运行。

相关推荐

Separate First Post Loop

我正在尝试使用<?php rewind_posts(); ?> 在我的主页模板上使用两个循环的功能。有人知道如何停止最新帖子后的第一个循环吗?这是我的代码:<?php if (have_posts()) : while (have_posts()) : the_post(); ?> <h1><a href=\"<?php the_permalink(); ?>\"><