web-dev-qa-db-ja.com

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

私は最近プラグインとテーマの開発を始めました、そして私は両方の上でいくつかの機能を使う必要があることを知りました。

この記事で述べたように、宣言される前に関数/クラスが存在するかどうかをチェックしようと思うことがあります。 関数が存在するかどうかをチェックする時期

しかし、それは悪い習慣と考えられています。 1つのテーマ/プラグインをインストールしなくても競合を防ぎ、テーマとプラグインを独立して動作させるためのベストプラクティスは何ですか?

8
Jeg Bagus

アクションとフィルタ

imho最良の方法はアクションを使ってプラグイン関数をテーマにすることです。

例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に保存してさらに処理することができます。

結論

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

12
kaiser