web-dev-qa-db-ja.com

オブジェクト内にフック 'vc_before_init'を追加する

私は最初の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_oncevc_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をラップするかは問題ではありません。

1
Bjorn

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_dumpfalseを返すはずです。もしそれがtrueであれば、アクションはあなたのクラスがインスタンス化される時までに既に実行されています。

0
phatskat