プラグインとテーマの共有機能


8

最近、プラグインとテーマの開発を始めましたが、両方でいくつかの機能を使用する必要があることに気付きました。

このポストで述べられているように宣言される前に関数/クラスが存在するかどうかを確認することを考えます:関数が存在するかどうかを確認するタイミング

しかし、それは悪い習慣だと考えられています。競合を防ぎ、テーマとプラグインを1つインストールせずにテーマとプラグインを個別に機能させるためのベストプラクティスは何ですか?

回答:


12

アクションとフィルター

私見最善の方法をテーマに、プラグイン機能をもたらすためにアクションを使用することです。

例1

これをテストするための小さなプラグインを次に示します。

<?php 
/** Plugin Name: (#68117) Print Hello! */
function wpse68117_print_hello()
{
    echo "Hello World!";
}
add_action( 'wpse68117_say', 'wpse68117_print_hello' );

テーマ内:

<?php
/** Template Name: Test »Print Hello!« Plugin */
get_header();
// Now we call the plugins hook
do_action( 'wpse68117_say' );

今何が起こっている/クールキッド

この方法では、関数、ファイル、クラス、メソッド、または(これを行わないでください!)グローバルの存在を確認する必要はありません$variable。WPインターングローバルは、これを既に使用しています。フック名が現在のフィルターであるかどうかを確認し、アタッチします。存在しない場合は、何も起こりません。

例#2

次のプラグインでは、1つの引数を取るコールバック関数をアタッチします。

<?php 
/** Plugin Name: (#68117) Print Thing! */
function wpse68117_print_thing_cb( $thing )
{
    return "Hello {$thing}!";
}
add_filter( 'wpse68117_say_thing', 'wpse68117_print_thing_cb' );

テーマ内:

<?php
/** Template Name: Test »Print Thing!« Plugin */
get_header();
// Now we call the plugins hook
echo apply_filter( 'wpse68117_say_thing', 'World' );

今回は、ユーザー/開発者に引数を追加する可能性を提供します。彼echo/printは出力を行うことも、さらに処理することもできます(見返りに配列を得た場合)。

例3

3番目のプラグインでは、2つの引数を取るコールバック関数をアタッチしています。

<?php 
/** Plugin Name: (#68117) Print Alot! */
function wpse68117_alot_cb( $thing, $belongs = 'is mine' )
{
    return "Hello! The {$thing} {$belongs}";
}
add_filter( 'wpse68117_grab_it', 'wpse68117_alot_cb' );

テーマ内:

<?php
/** Template Name: Test »Print Alot!« Plugin */
get_header();
// Now we call the plugins hook
$string_arr = implode(
     " "
    ,apply_filter( 'wpse68117_grab_it', 'World', 'is yours' )
);
foreach ( $string_arr as $part )
{
     // Highlight the $thing
     if ( strstr( 'World', $part ) 
     {
         echo "<mark>{$part} </mark>";
         continue;
     }
     echo "{$part} ";
}

このプラグインにより、2つの引数を挿入できるようになりました。に保存して、$variableさらに処理することができます。

結論

フィルターとアクションを使用すると、不必要なチェックを回避することでパフォーマンスが向上します(〜1k(?)フィルター検索の速度function_*/class_*/method_*/file_existsまたはグローバルの検索と比較してくださいin_array())。プラグインがこれを気にするので、変数を設定しないなどの不要な通知をすべて避けることもできます。


2
ベストプラクティストピックに関する優れた洞察!
アダム

1
カイザーに感謝します。あなたはこの問題について可能な限りのベストプラクティスを備えています。再度、感謝します!
Jeg Bagus

ところで、プラグインとテーマの間で共有される同じ機能には別の名前を付ける必要がありますか?
Jeg Bagus

変数に簡単なラッピングを事前に行い、それらの変数の内容を出力する関数を持っているとしましょう。テーマとプラグインにjlog関数を追加しますが、どのようにして競合を防ぐことができますか?
Bagus

1
@JegBagusあなたは非常に混乱している人です:)正確な関数を使用して質問を更新し、彼らが何をしていてどこで何かをしているのか説明してください。そして、ここでコメントを整理してください。ありがとう。
カイザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.