web-dev-qa-db-ja.com

テーマを「プラグイン対応」にするにはどうすればよいですか?

自分のイベントフックを公開し、誰でも簡単に自分のテーマに新しい機能を追加するためのプラグインを作成できるように、テーマをどのように修正できますか?

4
Volomike

あまりにも大きなプロジェクトをいくつか手がけても、関係者全員のことさえ知らなかったので、私は1つの結論に達しました。

それを単純にして、すばらしい文書を書いてください。

読みやすく、学び、拡張するのであれば、コードは単純です。

車輪を再発明しないでください:可能な限り特定のフックを使用し、予測可能なスキームで新しいものを追加してください。

非常に基本的な例:

if ( ! is_singular() && is_active_sidebar( 't5-archive-sidebar' ) )
{
    do_action( 'sidebar_before' );
    print '<ul id="sidebar">';
    dynamic_sidebar( 't5-archive-sidebar' );
    print '</ul>';
    do_action( 'sidebar_after' );
}

id属性を見ることで誰でもフックを予測することができます。なぜならそれらは常に同じ名前だからです。 <div id="header"><div id="content">のフックの命名方法はすでにわかっています。あなたが読むべき興味深い Tracチケット があり、 Theme Hook Alliance @Ottoが彼の答えにはお勧めです。

あなたのフックのためのすべてのコールバックを一箇所に登録してください:functions.phpの始まり。すべてがフックに縛られているのであれば、あなたはfunction_exists()を必要としません。プラグインや子テーマはあなたの関数の登録を解除して代わりにそれ自身を使うことができるからです。

例:

add_action( 'content_before',       't5_frontpage_widget' );
add_action( 'footer_before',        't5_loop_navigation' );
add_action( 'header_before',        't5_skiplink', 1, 0 );
add_filter( 'the_title',            't5_fill_empty_title', 20, 1 );
add_action( 'wp_loaded',            't5_post_format_support' );
add_action( 'wp_loaded',            't5_load_theme_language' );
add_action( 'wp_loaded',            't5_setup_custom_background' );
add_action( 'wp_loaded',            't5_setup_custom_header' );
add_action( 'wp_loaded',            't5_setup_sidebars' );
add_filter( 'wp_title',             't5_wp_title_filter', 20, 2 );

可能な限り遅くして追加のファイルを含め、それらのファイルを置き換えやすくし、クラスごとに1つのファイルを使用します。

すべての関数とクラスにPHPDocを使い、それぞれが呼ばれるフックを追加してください。

例:

/**
 * Handles posts without a title. Uses the first 35 caharacters instead.
 *
 * @wp-hook the_title 20
 * @param  string $title
 * @return string
 */
function t5_fill_empty_title( $title )
{
}

@wp-hook the_title 20は、その関数がいつ呼び出されるのか、そしてそれを削除する方法を正確に読者に伝えます。複雑なコードについては、DocBlockで使用例を示してください。

プラグインコードを書きにくくするようなコードは避けてください。

  • ビューファイル(テンプレート)にファイルを含めたり、関数を宣言したり、グローバル変数を作成したりしないでください。子供のテーマ作者はそれらを再び作り直さなければならないでしょう - 時間の無駄。
  • functions.phpが呼び出されたときにコードを実行するだけではいけません。プラグインにコードを無効にする機会を与えるためにフックにすべてをバインドします。
  • 優先順位0を絶対に使用しないでください。
  • あなたのテーマの中で決してrequirerequire_onceincludeそしてinclude_onceを使わないでください。代わりに locate_template() を使用してください。場合によっては、プラグインが独自のディレクトリを子テーマの追加のテーマディレクトリとして登録することがあります。 locate_template()はそのようなプラグインが完全なファイルを置き換えることを可能にします。
  • 匿名オブジェクト を作成しないでください。
  • カスタム投稿タイプ、カスタム分類法、ショートコード、または連絡先フォームをテーマに配置しないでください。それは普通のプラグインの領域です。

大事なことを言い忘れましたが、バージョン管理(Git、Mercurial)を使用し、アトミックコミットを作成し、各コミットメッセージで説明してくださいなぜでこの変更を行ったのですか。

3
fuxia

標準化されたフックを使うようにしてください。テーマフックアライアンスからそれらをチェックアウト: https://github.com/zamoose/themehookalliance

1
Otto

テーマを "プラグイン対応"にする方法

しかし、あなたがあなたのテーマの中で利用すべきいくつかのことがあります。私はあなたがすべきすべてのことをこのように詳細にリストすることはできません。しかし、なぜあなたがそれらを使うべきなのかを簡単に説明した短いリストを提供することができます。


WordPressのコア機能

  1. add_theme_support(); - テーマサポートを追加することで、プラグイン開発者は特定のテーマ機能が存在するかどうかをチェックし、それぞれに追加機能を注入することができます。
  2. register_sidebar(); または register_sidebars(); - 動的に作成されたサイドバーを持つことで、プラグイン開発者は既存のものを隠したり、コンテンツを追加したり、サイドバーを完全に削除したりできます。
  3. register_nav_menu(); または register_nav_menus(); - メニュー項目の追加、新しいメニュー項目の追加、CSSスタイルの変更など、プラグインによるナビゲーション構造の高度な操作を許可します。権限設定の追加ナビゲーション全体、または具体的には特定のナビゲーションメニュー項目へ。
  4. wp_register_sidebar_widget(); および wp_set_sidebars_widgets(); - ウィジェットは、箇条書き2の動的サイドバーとうまく調和します。これもまた、あなたのテーマに非常に高い柔軟性を与えます。開発者がカスタムウィジェットを追加し、それらを動的サイドバーに挿入して、さらなる機能やコンテンツの出力を可能にします。
  5. get_header();get_footer();get_sidebar(); または get_template_part(); - WordPressの組み込み関数を使用してテーマのセクションを取得すると、プラグイン開発者は次のことができます。テーマに追加コードを挿入したり、テーマからコードを削除したり、テーマの効果を変更したりすることで、テーマの出力を操作します。このリストの後に、フックを使用します。
  6. wp_head();wp_footer();wp_title(); および body_class(); - これらの関数はプラグイン開発者にとって優れています。これにより、プラグイン開発者は新しいスクリプトやスタイルをエンキューしたり、テーマのヘッダーとフッターから既存のスクリプトやスタイルをデキューすることができます。 wp_title();を使うことで、プラグイン開発者はあなたのテーマのtitleタグ出力を操作することができます。 SEOプラグインに最適です。 body_class();は本当にかなりの量で使用できます。私は本当にあなたがあなたのすべてのテーマでこれのためのサポートを築くことを強く勧めます。

特定の機能がよくわからず、どこかに存在する必要があることがわかっている場合は、 Query Postsにアクセスして、より良いWordPressコードリファレンス を試してください。


WordPressフック(アクションとフィルタ)

次に検討すべきことは、 WordPress Hooks 、または...アクションとフィルタが政治的に正しいことです。

デフォルトでは、このセクションの上の番号付きリストに掲載されている機能を使用している場合、WordPressはすでにテーマで発生した多くのイベントをサポートしています。

これらの「イベント」はフックと呼ばれ、プラグイン開発者がテーマ内の特定の領域からコードを追加、変更、削除することを可能にします。テーマ内で別のイベントがトリガーされたときに、特定のイベントを起動します。

"Plugin-Ready" WordPressテーマを作成しながら、あなたが考えるべき次の分野に私たちをもたらします。


あなた自身のWordPressフックを作成する

あなたのテーマの中であなた自身のWordPressアクションとWordPressフィルタを作成する方法を学ぶことは賢明でしょう。これにより、プラグイン開発者はあなたのWordPressテーマを高度に操作することができます。

WordPressアクションやWordPressフィルタの作成方法がわからない場合は、ここをクリックして do_action(); を使用したWordPressアクションの作成、および apply_filters(); を使用したWordPressフィルタの作成についての詳細。

WordPressコアが提供するデフォルトの関数をもっと使うだけで(この答えの冒頭の最初の番号付きリストにあるもののように、それ以外の場合は 完全な関数の索引は )、開発者が使用する必要があるフックは、すでにコアによって定義されています。

あなたのWordPressテーマの中で、あなた自身のWordPressフックを作成することに恥ずかしがらないでください。開発者が必要なことをするのに十分ではないよりも、開発者が利用して利用するための多くのフックを用意しておくほうが常によいです。

フック名を一意に参照することを忘れないでください。 (それらは既存のWordPress Coreフックや他のプラグイン開発者によって作成された既存のWordPressフックと衝突しないようにユニークでなければなりません。)

独自のフックを作成することで、WordPressプラグイン開発者は add_action(); および add_filter(); を使用してカスタム作成のWordPressフックにフックし、実際に変更を加えることなくWordPressテーマの出力または動作を設定できます。テーマのコアコード.

テーマの更新をリリースしたとき、これは素晴らしいです。なぜなら、あなたのテーマへの変更は永続的であり、テーマの更新によって上書きされたり失われたりすることはないからです。

@Otto s answer に従って、 Theme Hook Alliance で提供される標準化されたフックを試してみることができます。


0
Michael Ecklund