私は最初のOOP(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
フックはメインプラグインファイルから完全に機能するので、すべてのプラグインクラスの外部で、Visual Composerフォーラムではなくここで質問しています。
私は以下を試しました:
$Custom_VC_Elements
の代わりにクラス名$this
を使用してください。Custom_VC_Elements_init
を作成し、そのクラスのインスタンスを以下のように作成します。add_action( 'vc_before_init'、array(WPWDtools :: load_class( "Custom_VC_Elements_init"、 "クラス - カスタム - vc要素 - init.php"、 'アドオン')、 '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
をラップするかは問題ではありません。
vc_before_initフックはメインのプラグインファイルから完全に機能するので、すべてのプラグインクラスの外で動作します。
多分それをそこに引っ掛けてみることができます。必要に応じてメインファイル内でクラスをインスタンス化し、それにフックすることができれば、問題ありません。
$my_elements = new Custom_VC_Elements();
add_action( 'vc_before_init', array( $my_elements, 'armon_product_link_vc' ) );
ただし、これがあなたのクラスでうまく機能するかどうかはわかりません。もう1つの選択肢は、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
であれば、アクションはあなたのクラスがインスタンス化される時までに既に実行されています。