プラグイン開発の客観的なベストプラクティス?[閉まっている]


135

プラグイン開発の客観的なベストプラクティスを収集するためのコミュニティWikiの開始。この質問は、wp-hackersに関する@EAMannのコメントに触発されました。

アイデアは、最終的に何らかのコミュニティコラボレーションレビュープロセスでそれらを使用できるように、客観的なベストプラクティスがどのようなものになるかについてコラボレーションすることです。

更新:最初の数件の回答を見た後、回答ごとにアイデア/提案/ベストプラクティスが1つだけ必要であることが明らかになり、投稿する前に重複がないことを確認するためにリストを確認する必要があります。


コミュニティWikiがSE(およびその他)でSEを適切に機能させる方法を本当に理解していませんが、それはメタに関する質問かもしれません。それは答えで大部分がだまされます。
-hakre

@hakre:素晴らしい。物を見た後、「回答」ごとにアイデアを1つだけ追加する必要があるという説明に追加し、既存の回答を複数の回答に変更します。
MikeSchinkel

回答:


72

アクションとフィルターを使用する

人々がデータを追加または変更したいと思う場合:返す前にapply_filters()を提供します

PS少し残念なことに、あなたの質問の答えは、エンドユーザー専用に設計されたプラグインの割合です。つまり、独自のフックはありません。WordPressがほとんどのプラグインのように設計されていると想像してみてください?それは柔軟性に欠け、非常にニッチなソリューションです。

WordPressが他のプラグインが依存しているプラ​​グインを自動インストールする機能を持つ場合、状況は異なるでしょうか?クライアントは特定の方法と利用可能なプラグインを必要とするため、通常はゼロから必要な多くの機能を作成する必要がありますが、残りの10%は、90%で更新する柔軟性を許可しません。

StackPressサイトで良い答えが得られるように、WordPressコミュニティのリーダーたちが、ベストプラクティス(他の開発者へのフックの追加など)に従うことでプラグインが得られることを保証する方法を特定してほしいです。

別の質問から例を見てみましょう:

例:誰かが記事をリツイートしたときにプラグインで何かをしたい。人気のあるリツイートプラグインにフックを付けて起動できるカスタムフックがあれば、それは素晴らしいことです。存在しないので、プラグインを変更して含めることができますが、それは私のコピーでのみ機能し、再配布を試みたくありません。

関連する


55

ロード・スクリプト/ CSS wp_enqueue_scriptwp_enqueue_style

プラグインは、JS / CSSファイル、特にWPコアに含まれるjQueryおよびその他のJSファイルの重複バージョンをロード/ロードしようとしてはなりません。

プラグインは常にJSとCSSファイルをリンクするときに使用しwp_enqueue_script、タグwp_enqueue_styleを介して直接使用することはありません<script>

関連する


1
提案:(エンキューシステムの一部であるため)そこに依存関係を使用することについて小さなメモを付ける価値があるかもしれません。
t31os

正しいですが、スタイルとスクリプトを前に登録し、IDを介してこのスクリプトをキューに登録することをお勧めします。これは、他の開発者がスクリプトを変更したり、カスタムプラグインで使用したりするのに非常に適しています。また、順序の変更や夏のファイルの作成も簡単です。
-bueltge

2
さらに、必要に応じてページにスクリプトとスタイルをロードします。scribu.net/wordpress/optimal-script-loading.html
MR

49

国際化のサポート

開発者が独自のプラグインの翻訳に関心がない場合でも、すべての出力文字列を適切なテキストドメインにリンクして、関係者による国際化を可能にする必要があります。

initユーザーがアクションにフックできるように、アクション中に言語ファイルをロードすることが非常に重要であることに注意してください。

Codex:WordPress開発者向けI18nをご覧ください

また、この記事:WP言語ファイルを正しく読み込みます

WordPress 4.6以降

WP 4.6では、ロード順序とチェックされる場所が変更され、開発者とユーザーにとって非常に簡単になりました。

テキストドメイン「my-plugin」を持つプラグインを検討すると、WordPressはまず/wp-content/languages/plugins/my-plugin-en_US.moで翻訳ファイルを探します。

見つからない場合は、プラグインが表示するように指示しているものを探します(コーデックスの場合は通常、pluignsの「language」フォルダーにあります):
/ wp-content / plugins / my-plugin / languages / my- plugin-en_US.mo

最後に、言語ファイルが見つからない場合、次のデフォルトの場所を確認します:
/wp-content/languages/my-plugin-en_US.mo

最初のチェックは4.6で追加され、ユーザーに彼らは、開発者が言語ファイルを追加した場所を知る必要があります以前のように、言語ファイルを追加するために定義された場所を与えた、今、ユーザーがちょうどプラグインのTEXTDOMAINを知っている必要があります: / WP-コンテンツ/ languages / plugins / TEXTDOMAIN-LOCAL.mo


以下は古い方法です(WP 4.6以降では関係ありません)

[...]
最後に、プラグインに同梱されている言語ファイルをロードする前に、WP_LANG_DIRからカスタムユーザー言語ファイルロードすることが重要であることを指摘したいと思います。同じドメインに複数のmoファイルが読み込まれると、最初に見つかった翻訳が使用されます。このようにして、プラグインによって提供される言語ファイルは、ユーザーが翻訳していない文字列のフォールバックとして機能します。

public function load_plugin_textdomain()
{
    $domain = 'my-plugin';
    // The "plugin_locale" filter is also used in load_plugin_textdomain()
    $locale = apply_filters( 'plugin_locale', get_locale(), $domain );

    load_textdomain( 
            $domain, 
            WP_LANG_DIR . '/my-plugin/' . $domain . '-' . $locale . '.mo' 
    );
    load_plugin_textdomain( 
            $domain, 
            FALSE, 
            dirname( plugin_basename(__FILE__) ) . '/languages/' 
    );
}

私にとって最も重要なもの。それを行うのは余計な仕事ではありませんが、英語を第一言語として話さない何百万人ものユーザーにとってプラグインをより便利にすることができるものの1つです。自分で単語を翻訳する必要はありませんが、すべてを翻訳する準備をしてください。
2ndkauboy

これは非常に価値がありますが、簡単に実行できます。同意するだけで、すべてのプラグイン作成者がこれを行う必要があります。
t31os

48

WP_DEBUGでプラグインがエラーを生成しないことを確認する

プラグインは常にWP_DEBUG有効にしてテストし、理想的には開発プロセス全体で有効にします。プラグインはWP_DEBUGonでエラーをスローしてはなりません。これには、非推奨の通知と未チェックのインデックスが含まれます。

デバッグをオンにするにはwp-config.phpWP_DEBUG定数がに設定されるようにファイルを編集しますtrue。詳細については、デバッグに関するコーデックスを参照してください。


回答ごとにベストプラクティスのみを持つことについての更新を参照してください。複数の回答に分割できますか?
MikeSchinkel

もちろん問題ありません。ごめんなさい
ジョンPブロッホ

ありがとう、そしてあなたの見落としではなかった、それは私のものだった。重複についての@hakreの質問と、この作業を行う方法に基づいて、回答ごとに1つのベストプラクティスを求めるように質問を修正しました。
MikeSchinkel

6
この回答に2回賛成票を投じることができれば、私はそうします。私が開発サイトで作業しているときにWP_DEBUGをオフにする必要がある場合、使用する必要があるプラグインが警告と通知をあちこちに吐き出すので、とてもイライラします。
イアン・ダン

42

WordPress Coreの既存の関数を最初に使用する

可能な場合:独自に作成する代わりに、WordPressコア含まれる既存の関数を使用します。WordPressコアに適切な既存の関数がない場合にのみ、カスタムPHP関数を開発してください。

1つの利点は、「非推奨のログ」を使用して、交換する必要がある機能を簡単に監視できることです。もう1つの利点は、ユーザーがCodexの関数ドキュメントを表示し、経験豊富なPHP開発者でなくてもプラグインの機能をよりよく理解できることです。

関連する


ここでの最大の問題の1つは、適切な既存の関数が存在することを学習することです。役に立つのは、コードや機能のニーズを投稿して、コミュニティがどの機能を最適に使用するかをコメントできるようにするための場所です。StackExchangeをこれに使用できますか?
MikeSchinkel

うん それはかなり難しいだろうし、ある種の無限のタスクだと思う。コーデックスは既に存在しているので、この方法でコーデックスを拡張するのが最善だと思います。
カイザー

コーデックスを拡張し、そこから関連する証券取引所スレッドにリンクするだけで十分だと思います。
カイザー

4
それに関する問題は、多くのコアが実際に再利用のために構造的に設計されていないことです。downsize()のような関数がpost-type = 'attachmentのハードコードされたチェックを含む関数を呼び出すため、画像操作/メタデータ関数の半分をコピーしてわずかに修正し、独自の添付ファイルのように振る舞うpost-typeを作成する必要がありました'。別の例である柔軟性のないwp_count_posts()のようなものがたくさんあります。コアWPを実際に再利用するには、完全なリファクタリングが必要です。
-wyrfel

これに完全に同意します。私の一番好きな例:wp-login.php。そのため、「可能なら」が答えの良い出発点でした
...-kaiser

35

アンインストールすると、プラグインのデータがすべて削除されます

プラグインは、WordPressインストールから削除されると、作成したすべてのファイル、フォルダー、データベースエントリ、およびテーブルと、作成したオプション値を削除する必要があります

プラグインは設定をエクスポート/インポートするオプションを提供するため、削除する前に設定をWordPressの外部に保存できます。

関連する


4
これはデフォルトの動作である必要がありますが、ビデオゲームをアンインストールするときに、保存したゲームとダウンロードした素材を削除するかどうかを尋ねるなど、データを保持するようにユーザーに求める必要があります。ユーザーは、テスト目的でのみプラグインを非アクティブ化している可能性があり、再アクティブ化するときにオプションの設定に戻りたくない場合があります。
EAMann

1
私はプラグインが完全に削除されたときだけを話しているのであり、無効化されたときではありません。
トラビスノースカット

2
私はそれを理解しています...しかし時々リポジトリでまだホストされていないバックアップまたはベータ版からプラグインを手動で再追加できるようにプラグインを削除します
...-EAMann

4
@EAMann:そのため、およびプラグインを別のサーバーに移行するために、プラグインは設定をエクスポートおよびインポートするメカニズムを提供する必要があります。
hakre

2
私はいくつかのプラグインが設定に「アンインストール」ボタンを提供し、大きな赤い警告がすべてのデータを削除することを見てきました。これは非アクティブ化とは別であり、それを処理するための素晴らしい方法だと思います。誰もがプラグインを削除するために「削除」ボタンを使用するわけではありません。
ガブリエルク

34

入力データによるSQLインジェクションの防止

プラグインがなければならない (例えば介して直接的または間接的に取得されたすべてのユーザー入力サニタイズ$_POSTまたは$_GET MySQLデータベースを照会するために、入力値を使用する前に)を。

参照:SQLステートメントのフォーマット


5
また、データベースから出くるデータをサニタイズする必要があります。基本的に、ハードコーディングされていないデータを信頼しないでください。codex.wordpress.org/Data_Validationも参考になります。
イアン・ダン

31

すべてのグローバルネームスペースアイテムのプレフィックス

プラグインは、すべてのグローバル名前空間項目(定数、関数、クラス、変数、カスタム分類法、投稿タイプ、ウィジェットなど)に適切にプレフィックスを付ける必要があります。たとえば、という関数を作成しないでくださいinit()。代わりに、のような名前を付けてくださいjpb_init()

一般的には、名前の前に3文字または4文字のプレフィックスを使用するか、PHP Namespace Featureを使用する必要があります。比較:PHPクラス定数の1文字のプレフィックス?

関連する


31

クラスとオブジェクト指向のPHP5コードを使用する

クリーンでオブジェクト指向のPHP5コードを記述しない理由はありません。PHP4のサポートは、次のリリース(WP 3.1)後に廃止されます。もちろん、すべての関数名の前にendlessly_long_function_names_with_lots_of_underscoresを付けることもできますが、単純なクラスを記述してその中にすべてをバンドルする方がはるかに簡単です。また、クラスを別のファイルに入れ、それに応じて名前を付けて、簡単に拡張および保守できるようにします。

// in functions.php
require 'inc/class-my-cool-plugin.php';
new MyCoolPlugin();

// in inc/class-my-cool-plugin.php
class MyCoolPlugin {
    function __construct() {
        // add filter hooks, wp_enqueue_script, etc.

        // To assign a method from your class to a WP 
        // function do something like this
        add_action('admin_menu', array($this, "admin"));
    }

    public function admin() {
        // public methods, for use outside of the class
        // Note that methods used in other WP functions 
        // (such as add_action) should be public
    }

    private function somethingelse() {
        // methods you only use inside this class
    }
}

新しいMyCoolPlugin()を使用しないでください。フック経由でWPにフックする方が良いと思います:plugins_loaded
bueltge

それについてはわかりません。codexによると、plugins_loadedは最初にロードされるものの1つであるため、このような構成を実行するか、アクションとして追加してもほとんど違いはないと思います。
ハスキー

5
それは、すべての人にとってより良いものにするベストプラクティスの1つにすぎません。
アーレンベイラー

1
plugins_loadedにフックを追加することで改善が見られない限り、改善は行われず、メモリ使用量の増加、アクションの実行による速度の低下がある場合はベストプラクティスではありません。単に追加されるアクションの代わりに。また、OOの使用はベストプラクティスと見なすべきではありません。
バキー

4
@IanDunn:PHP4のサポートが必要であるが、4年以上前の2008年以降、PHP4のサポートが廃止された場合。まだPHP4固有のチェックを使用する理由はありません。
ハスキー



21

プラグインのアンインストール時のデータ損失を発表

アンインストール時にはプラグインが必要があり 、データだ削除されることをユーザーに促し、ユーザーがそうする前にデータを削除して大丈夫ですとプラグインが確認受け取るべきでユーザーデータを保持するオプションができ、アンインストール時に。(@EAMannからのこのアイデア。)

関連する


3
Wordpress自体は、管理者に警告メッセージを表示します(これは、少なくとも現在はトランクで発生しています)。
ハクレ

WordPressによって表示される警告メッセージは別として、プラグインがユーザーにプロンプ​​トを表示することはできません。アンインストール時には既に無効になっているためです。ただし、チケット#20578を参照してください。
JD

19

プラグインのフォルダー名を変更してみましょう

/ plugins / pluginname / {various}

フォルダに使用される「プラグイン名」は常に変更可能である必要があります。

これは通常、定数を定義し、プラグイン全体で一貫して使用することで処理されます。

言うまでもなく、多くの人気プラグインは罪人です。

関連する:

  • plugins_url() プラグインに含まれるリソースへの簡単なリンク。

プラグインのフォルダーの名前を変更すると、自動更新が中断されるため、それが最善であるかどうかはわかりません。
mtekk

とにかく変更を行った後、プラグインを再度有効にする必要があります(名前を変更するとプラグインが非アクティブになる可能性があります)。その時点で、WPはプラグインに関連する適切なDBエントリを再作成または更新します更新を中断します)。
t31os

定数を使用する代わりにplugin_basename(__FILE__)、プラグインのローカル名を把握するために使用します。これは、同じプラグインのコピー(テスト、他の場所では複数のアカウント、ただしプラグインごとに1つのみ)を持つ場合にも役立ちます。
ラファエル

19

WordPressを使用(組み込み)エラー処理

return;何らかのユーザー入力が間違っていただけではいけません。彼らにいくつかの情報を提供することは間違っていました。

function some_example_fn( $args = array() ) 
{
    // If value was not set, build an error message
    if ( ! isset( $args['some_value'] ) )
        $error = new WP_Error( 'some_value', sprintf( __( 'You have forgotten to specify the %1$s for your function. %2$s Error triggered inside %3$s on line %4$s.', TEXTDOMAIN ), '$args[\'some_value\']', "\n", __FILE__, __LINE__ ) );

    // die & print error message & code - for admins only!
    if ( isset( $error ) && is_wp_error( $error ) && current_user_can( 'manage_options' ) ) 
        wp_die( $error->get_error_code(), 'Theme Error: Missing Argument' );

    // Elseif no error was triggered continue...
}

すべてに対して1つのエラー(オブジェクト)

ブートストラップ中にテーマまたはプラグインのグローバルエラーオブジェクトを設定できます。

function bootstrap_the_theme()
{
    global $prefix_error, $prefix_theme_name;
    // Take the theme name as error ID:
    $theme_data = wp_get_theme();
    $prefix_theme_name = $theme_data->Name;
    $prefix_error = new WP_Error( $theme_data->Name );

    include // whatever, etc...
}
add_action( 'after_setup_theme', 'bootstrap_the_theme' );

後で、オンデマンドで無制限のエラーを追加できます。

function some_theme_fn( $args )
{
    global $prefix_error, $prefix_theme_name;
    $theme_data = wp_get_theme();
    if ( ! $args['whatever'] && current_user_can( 'manage_options' ) ) // some required value not set
        $prefix_error->add( $prefix_theme_name, sprintf( 'The function %1$s needs the argument %2$s set.', __FUNCTION__, '$args[\'whatever\']' ) );

    // continue function...
}

その後、テーマの最後でそれらすべてを取得できます。このようにして、ページのレンダリングを中断せずに、開発用のすべてのエラーを出力できます

function dump_theme_errors()
{
    global $prefix_error, $prefix_theme_name;

    // Not an admin? OR: No error(s)?
    if ( ! current_user_can( 'manage_options' ) ! is_wp_error( $prefix_error ) )
        return;

    $theme_errors = $prefix_error->get_error_messages( $prefix_theme_name );
    echo '<h3>Theme Errors</h3>';
    foreach ( $theme_errors as $error )
        echo "{$error}\n";
}
add_action( 'shutdown', 'dump_theme_errors' );

詳細については、このQを参照しください。関連のチケットはの「共同作業」修正するWP_Errorwp_die()、そこからリンクされていると、別のチケットが続きます。コメント、批評家などに感謝します。


プロパティにのみアクセスし、インスタンスをオブジェクトとして渡さない場合に、WP_Errorオブジェクトをインスタンス化するのはなぜですか?
-ProfK

@ProfK短くなるように作り直し、タイトル/コンテンツwp_die();が間違っていました(逆転)。Q)完全に理解できません。あなたはWP_Errorクラスのインスタンスを設定するときに次のような機能を介して、そのデータへのフルアクセスを持ってget_error_code();get_error_message();get_error_data();および複数のバージョンがあります。また、テーマまたはプラグインのブートストラップで一度だけインスタンス化し、$error->add();他のエラーを埋めるために使用し、最終的にフッターに出力し$error->get_error_messages();てすべてをキャッチすることもできます。
kaiser

@ProfK このQの今後の更新を投稿します。私は現在、wpエラークラスの動作を検査しており、パブリックテーマエラーAPI(ドラフトは既に完了しています)に関するチケットを書きたいと思っています。Qの下部に、互いに近づいWP_Errorたりwp_die()近づいたりする別のチケットへのリンクがあります(すでにパッチがあります)。コメント、提案、批評家などは大歓迎です。
カイザー

18

グローバル名前空間に追加される名前を最小限に抑える

プラグイン 、グローバル名前空間に追加する名前の数を最小限に抑えることで、影響を可能な限り減らす必要があります

これは、プラグインの関数をクラスにカプセル化するか、PHP名前空間機能を使用して実行できます。すべてに接頭辞を付けることも役立ちますが、それほど柔軟ではありません。

関数とクラスの次に、プラグイングローバル変数を導入しないでください。通常、クラスを使用するとクラスが廃止され、プラグインのメンテナンスが簡単になります。

関連する


「グローバル変数を導入しないでくださいを独自の答えに移動してください。それは私が議論したいのですが、この問題とは別に、実際に1によって関連(両方とも私が反対するかもしれないと思うので、特殊なケースであると私は他の人の意見から学びたいので。)される
MikeSchinkel

17

PhpDocを使用してコメントする

ベストプラクティスはPhpDocスタイルに近いものです。「Eclipse」のようなIDEを使用しない場合は、PhpDocマニュアルをご覧ください

これがどのように機能するかを正確に知る必要はありません。とにかくプロの開発者はコードを読むことができ、これを要約として必要とします。趣味のコーダーとユーザーは、同じ知識レベルで説明する方法を高く評価するかもしれません。


17

add_optionの前に設定APIを使用します

add_option関数を介してDBにオプションを追加する代わりに、すべてを処理するSettings APIを使用して、オプションを配列として保存する必要があります。

add_optionの前にテーマ変更APIを使用します

変更APIは非常にシンプル構造とオプションを追加して検索することができます安全な方法です。すべてがデータベースにシリアル化された値として保存されます。簡単、安全、シンプル。


1
さらに、使用しないupdate_optionと、決してadd_optionそれが存在しない場合、更新機能は、オプションを作成します。.. :)
t31os

3
使用しないとは言いませんadd_optionadd_optionオプションが既に設定されている場合、それが変更されない場合の良いユースケースがあります。そのため、アクティベーションでそれを使用して、おそらく既存のユーザー設定を保持します。
-ProfK

1
別のユースケースadd_optionは、自動ロードを明示的に無効にする場合です。update_optionオートロードを強制的にtrueに設定するため、オートロードを無効にするadd_optionには、最初にオプションを作成するときに使用します。
デイブロムジー

16

プラグインユーザーのプライバシーを保護する

(以前:匿名API通信)

プラグインが外部システムまたはAPI(Webサービスなど)と通信する場合、匿名で行うか、プラグインのユーザーに関連するデータが制御されていない第三者に漏洩しないようにする匿名オプションをユーザーに提供する必要があります。


15

WordPress.orgのホストプラグイン

プラグインをホストするには、WordPress.org提供されているSVNリポジトリを使用します。これにより、ユーザーエクスペリエンスの更新が容易になり、SVNを使用したことがない場合は、それを正当化するコンテキストで使用することで、実際に理解することができます。


15

アクセス許可を使用してアクセス制御を提供する

多くの場合、ユーザーは、特に複数の複雑な操作を行うプラグインを使用して、プラグインによって作成された領域に誰もがアクセスすることを望まない場合があります。

少なくとも、プラグインを使用できるさまざまな種類の手順すべてに対して適切な機能チェックを行ってください。


12

プラグイン設定のインポート/エクスポート

これは、プラグインの間で、共通ではありませんが、あなたのプラグインが(一部)の設定を持っている場合、それがなければならない 設定とユーザーの入力などのデータのインポート/エクスポートを提供します

インポート/エクスポートにより、プラグインの使いやすさが向上します。

このようなインポートおよびエクスポート機能(および元に戻すメカニズム)を備えたサンプルプラグインは、Breadcrumb NavXT(Wordpressプラグイン)です(完全な公開:そこに私が書いた小さなコードがあり、ほとんどはmtekkによって行われています)。

関連する


12

コードを整理する

実行される順序で書かれていないコードを読むことは常に困難です。最初にinclude / require、define、wp_enqueue_style&_scriptなど、次にプラグイン/テーマに必要な機能、最後にビルダー(管理画面、テーマに統合するものなど)。

cssやjsのようなものを独自のフォルダーに分けてみてください。また、配列フラットナーなどのヘルパーのみの関数を使用してこれを実行してください。「メイン」ファイルをできる限りクリーンで読みやすいものに保つことは、1年で更新を試みてコードを長期間見なかった場合に、ユーザー、開発者、およびユーザーを支援する方法です。

頻繁に繰り返す構造にすることも良いので、常に通り抜けることができます。さまざまなプロジェクトで既知の構造で開発することで、時間をかけて改善できるようになり、クライアントが別の開発者に切り替えても、「彼は混乱を残した」とは決して聞きません。これはあなたの評判を構築し、長期的な目標でなければなりません。


これは、人々が議論するスタイルについてはあまりにも多すぎて、尊敬されるすべての人々が同意する客観的なベストプラクティスではないことを恐れています。客観的なベストプラクティスにのみ取り組むことは非常に重要です。そうすることで、人々は論争の的となるアイテムを持っているのではなく、リストを「祝福」することに同意するでしょう。
マイクシンケル

11

スタイルで死ぬ

適切な方法で死ぬ すべてのプラグイン(およびテーマ)機能はwp_die()、重要な場所で使用して、何が起こったのかをユーザーに少し情報を提供する必要があります。PHPエラーは迷惑でありwp_die、プラグイン(またはそれら)が何を間違えたかについて、素敵なスタイルのメッセージをユーザーに与えることができます。さらに、ユーザーがデバッグを無効にしている場合、プラグインは破損します。

を使用wp_die()すると、プラグイン/テーマがワードプレスのテストスイートと互換性があることにも役立ちます。

関連する:

11

ユーザーにヘルプ画面を提供する

質問に何度も答えるよりも、RTFM(ヘルプをクリック)を答えとして言う方がいいです。

/**
  * Add contextual help for this screen
  * 
  * @param $rtfm
  * @uses get_current_screen
  */ 
  function ContextualHelp( /*string*/ $rtfm) 
  { 
     $current_screen = get_current_screen();
     if ($current_screen->id == $this->_pageid) 
     {
        $rtfm .= '<h3>The WordPress Plugin - Screen A</h3>';
        $rtfm .= '<p>Here are some tips: donate to me ' .
     }
     return $rtfm; 
  }
add_action('contextual_help', array($this,'ContextualHelp'),1,1);

更新/注:(kaiserのコメントを参照):上記の例はクラスで使用されます


(特定の管理UI画面を説明する必要がある限り)全員のツールボックスにある必要があります。+1
kaiser

Btw:これは、クラスに存在すること、$ this-> _ page_idとのやり取り方法、およびfunctions.phpまたはクラスなしのプラグインファイルからアクションフックを追加する場合の方法に言及する必要があります。 。
カイザー


9

直接ではなく、常にフックを介して関数を含めます。

例:

  • フックなしの新しい経由でプラグインのクラスを含めるために使用しないでください

  • フックplugins_loadedを使用します

    // add the class to WP                                   
    function my_plugin_start() {                                                               
        new my_plugin();   
    }                                                        
    add_action( 'plugins_loaded', 'my_plugin_start' );

更新: 小規模なライブ例:Plugin-svn-trunk-page および擬似例

//avoid direct calls to this file where wp core files not present
if (!function_exists ('add_action')) {
        header('Status: 403 Forbidden');
        header('HTTP/1.1 403 Forbidden');
        exit();
}

if ( !class_exists( 'plugin_class' ) ) {
    class plugin_class {

        function __construct() {
        }

    } // end class

    function plugin_start() {

        new plugin_class();
    }

    add_action( 'plugins_loaded', 'plugin_start' );
} // end class_exists

また、アクションの参照のためのコーデックスを参照、インストールマルチサイト上mu_plugins_loaded経由で読み込むことができます:http://codex.wordpress.org/Plugin_API/Action_Referenceを :ここでまた、このフックでWPをinlcudeどのように、あなたが見ています。http:// adambrown。 info / p / wp_hooks / hook / plugins_loaded?version = 2.1&file = wp-settings.php 私はこれを非常に頻繁に使用しますが、それほど難しくなく早く、ハードな新しいclass()として優れています。


@bueltige ---これについてもう少し説明してもらえますか?
NetConstructor.com

3
小さなライブ例:[プラグイン-svnのトランクページ] svn.wp-plugins.org/filter-rewrite-rules/trunk/... と擬似例 //avoid direct calls to this file where wp core files not present if (!function_exists ('add_action')) { header('Status: 403 Forbidden'); header('HTTP/1.1 403 Forbidden'); exit(); } if ( !class_exists( 'plugin_class' ) ) { class plugin_class { function __construct() { } } // end class function plugin_start() { new plugin_class(); } add_action( 'plugins_loaded', 'plugin_start' ); } // end class_exists
bueltge

2
@ Netconstructor.co-私はスレッドを更新しました、コメントはコードのために
tいです-bueltge

8

GPL互換ライセンスのライセンスプラグイン

プラグインとテーマ、WordPress互換ライセンスの下でライセンスされる必要があります。これにより、WordPressを「プログラム」として再配布できます。推奨されるライセンスはGPLです。プラグインに含まれるすべてのコードライブラリが同じライセンスと互換性があることに注意してください。

(これは過去と現在の両方で問題と深刻な議論のポイントでした。)


とりあえずGPLとの互換性を残しておきましょう:core.trac.wordpress.org/ticket/14685
hakre

8

プラグインの説明には、プラグインの機能を正確に詳述する必要があります。注目の投稿プラグインは10個あります。それらはすべて注目の投稿を表示しますが、多くは異なる機能を持っています。説明を読むことで、プラグインを類似のプラグインと簡単に比較できるはずです。

プラグインが非常に基本的でない限り、プラグインがどれほどシンプルであるかを自慢することは避けてください。設定へのリンクなどの説明に役立つリンクを含める必要があります。


7

リモートデータソースとWebサービスの副作用を最小限に抑える

プラグイン 、(遅い)Webサービス応答を待機するフロントリクエストを行わないように、Webサービスおよび/またはXMLRPC / SOAP要求をキャッシュ/データプロバイダーレイヤーを使用してキャッシュ/シールドする必要があります。

これには、RSSフィードや他のページのダウンロードが含まれます。バックグラウンドでデータを要求するプラグインを設計します。

可能なステップの1つは(例としてping.fmに投稿する):バッファーテーブルを作成します。たとえば、ping_fm_buffer_post(date、time、message、submit_time、status)

  1. ping.fmに更新を送信するたびに、このテーブルに追加します。
  2. 次に、このデータを処理するプラグインを作成する必要があります。このプラグインはcrontabを介して実行され、まだ送信されていないすべての更新を確認します
  3. このテーブルがあるため、ping.fmに送信されたすべてのメッセージをリストし、各投稿のステータスを確認することもできます。ping.fm側に問題がある場合に備えて、再送信できます。

あなたがどこに向かっているのか、私にはよくわかりません。サポート資料へのリンクを提供できますか?
-MikeSchinkel

また、「Net Overhead」が何であるか正確にはわかりません。より良い用語はありませんか?より明確な場合は、より客観的なルールになります。そして、Preventが」不可能です。『』最小化する代わりに?
MikeSchinkel

あなたは(おそらく)正しい。不適切な表現と防止は決して不可能であり、より良い適合を最小限に抑えます。
ハクレ

7

プラグインをテストする

プラグイン開発環境にいくつかのテストツールを確実に用意する必要があります。

基づいて、この答えによって、イーサン・ザイフェルトのテストの質問に、これらは従うのは良いプラクティスは、次のとおりです。

  • ユニットテストでは、クラスが実行できる最小の動作をテストする必要があります。
  • 機能テストのレベルに達すると、Wordpressの依存関係を使用してコードをテストできます。
  • プラグインの機能に応じて、IDを使用してDOM内のデータの存在をテストするSeleniumベースのテストの使用を検討してください

テストは重要ですが、単体テストでは最大のものではなく最小のものをテストする必要があると言うのは賢明ではないようです。WordPress依存の問題をテストするのが困難な場合は、WordPressコアに飛び込むだけで、アイテムが機能しているかどうかを確認するために使用できる内部グローバル変数がたくさん見つかります。
バキー

1
しかし、最小のものを最初にカバーすることが基本であるため、答えが示すように、WordPressで機能テストに到達することができます。
フェルナンドブリアーノ

1
これはアプリケーションではなくプラグインです。JavaランタイムなしでJavaアプリケーションをテストできますか?はい、Javaをモックアップとして記述し、プラグインをテストします。モックアップにバグがある可能性があります。*)免責事項またはネイティブコードにコンパイルします。
エデルウォーター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.