プラグインからページテンプレートリストにオプションを追加するにはどうすればよいですか?


10

プラグイン内からカスタムページテンプレートを作成する方法を探して、過去数時間を探していましたが、まだ運がありません。

私は特にやるしようとしていると、ページを編集する際に利用可能なページテンプレートのリストにオプションを追加し、あるいないようないくつかの他の方法を使用してif( is_page( 'page-slug' ) ) { /* etc */ }

これを行うために変更できるグローバル変数はありますか?

編集:

@ m0r7if3rがコメントで私に与えたリンクに基づいて、私は現在このコードを使用していますが、問題は、ページの表示時にこの関数を実行しますが、ページの編集時には実行しません(ドロップダウンリストにページテンプレートを入力するため)。 :

class JW_SiteGrader {

    private static $instance;

    private function __construct() {


        add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );

    }

    public static function getInstance() {

        // Return the class data in a Singleton fashion
        if (self::$instance == null)
            self::$instance = new JW_SiteGrader();
        return self::$instance;

    }

    public function sitegrader_template_redirect() {

        add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );

    }

    public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {

        if ( !is_array( $template_names ) )
            return '';

        $located = '';

        $this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );

        foreach ( $template_names as $template_name ) {

            if ( !$template_name )
                continue;

            if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {

                $located = STYLESHEETPATH . '/' . $template_name;
                break;

            } else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {

                $located = TEMPLATEPATH . '/' . $template_name;
                break;

            } else if ( file_exists( $this_plugin_dir .  $template_name ) ) {

                $located =  $this_plugin_dir . $template_name;
                break;

            }

        }

        if ( $load && '' != $located )
            load_template( $located, $require_once );

        return $located;
    }

    public function sitegrader_page_template( $template ) {

        $object = get_queried_object();

        if ( 'page' == $object->post_type ) {

            // New 
            $templates[] = "page-sitegrader.php";
            // Like in core
            $templates[] = "page-{$object->post_type}.php";
            $templates[] = "page.php";

            return locate_template( $templates );  

        }

        // return apply_filters('page_template', $template);
        return $template;
    }

}

編集2:

この機能は将来のアップデートでリリースされるようです。私はこれについてかなりの数のtracチケットを読み、議論がありましたが、実際の答えはありません(3.4を期待しています)。tracチケットのURLをここにリストします。

編集3:

上記のコードは機能しますが、この時点で私が抱えている唯一の問題は、新しいページを編集または追加するときに、ドロップダウンリストにテンプレートが追加されないことです。私はいくつかのことを試みていますが、質問はすぐに更新されます。


2
このようなことを試しましたか?
mor7ifer

@ m0r7if3r(それを試す場合は、それがどのように機能したかをメッセージに残してください-ありがとう!)
kaiser

@kaiser私が彼が推奨したコードを試してみましたが、欠けている唯一のリンクは、ドロップダウンリストにテンプレートを追加するためのメタボックスを取得することです(私の知る限り)。
Jared、

@Jared aの下部にある同様のQと関連するトラックチケットに対する私によるこの回答を見てください。コードを追加する)すべてのページに表示されない場合は、間違ったフックを使用してインスタンスを実行しています。どのフックを使用していますか?
カイザー2012

@kaiser私はpage_templateフックを使用しています。編集中の上記のコードは現在使用されているものです。template_redirectフックを使用してからpage_templateフィルターを追加する必要がありますか?
Jared

回答:


4

フィルター?誰でも?

ありません何のフィルタは、ヘルプにあり:page_template_dropdown($template);ドロップダウンを構築するために使用され、それが濾過可能ではありません。

テンプレート配列に潜入しますか?

ドロップダウンコンテンツを作成するために、コアメタボックスはを使用しget_page_templates()ます。内部から、関数は次のようになります。

$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];

しかしget_themes();、そこを見ると、テンプレートのリストを傍受する可能性がないように継ぎ目があります。さらに、themesディレクトリの外からテンプレートを取得できないという問題があります…

...テーマを偽造!

理論とその欠点…

を使用register_theme_directory()して、テンプレートを配置できるテーマディレクトリを追加できます。したがって、最も簡単な方法は、プラグインをテーマフォルダーとして登録することです。

// Register during init hook:
register_theme_directory( plugin_dir_path( __FILE__ ).'templates' );

注:これが機能するかどうかはわかりません

プラグインのアクティブ化中: 次にstyle.css.phptemplatesフォルダー内にファイルを配置する必要があります。これにより、ファイルに変数を追加できます。この変数は、親テーマになります。そして、親テーマは単に現在アクティブなテーマでなければなりません。次に、アクティブなテーマをプラグインに更新します。

欠点#2: »Appearance«UIについて…この「テーマ」は実際のテーマとして使用するためのものではないことに注意してください。残りの»このテーマのアクティブ化を避ける«の内容はあなたの想像力に任せます。とにかくそれはうまくいくはずです。

欠点#2:このトリックは子テーマをうまく回避します。親テーマを1つ持つことができます。これ以上何もない。


ですから、非アクティブなテーマからカスタムページテンプレートを使用する実際の方法はないと思いますよね?テーマディレクトリを登録することもできますが、そのテーマがアクティブでないとテンプレートを使用できません。
Jared

1
あんまり。それは本来あるべきものではないので、コアの欠如です。上記のipstenuへのリンクを試しましたか?私はすでにそのルートに行ってみましたが、別の解決策で、行き詰まりました。最善の策は、チケットを追跡し、どこにいてもプッシュしてリンクすることです。:/
カイザー

2

潜在的な回避策の提案として、WordPressファイルシステムを使用して、プラグインから現在のアクティブなテーマディレクトリにページテンプレートファイルを書き込むことを検討しましたか?このプロセスをどの程度制御したいかに応じて、プラグインでアクティベーション時にファイルを書き込み、アンインストール時に削除することができます。あるいは、フォームを使用してプラグインUIから動的にページテンプレートファイルを作成し、ポスト編集画面のドロップダウンボックスに表示されるページテンプレート名などの特定の値を渡すこともできます。理論的には、ボタンをクリックするだけでプラグインUIからページテンプレートを削除し、さまざまな目的で複数のテンプレートを同様に追加することもできます。Ottoのブログには、ファイルシステムの使用に関する優れた記事があります。リンクはありませんが、検索できます。

次のコアリリースでフックを使用して、意図していたことをリリースしてくれることを願っています。


1
以前はまったく同じように機能する方法がありましたが、ユーザーがテーマを切り替えたときにテンプレートファイルが削除されず、アクティブなテーマをコピーして別のサイトに配置した場合、多くの問題が発生しました。 、それらは機能しないカスタムテンプレートファイルをアップロードする危険性があります。これにはいくつかの回避策があることはわかっていますが、これを自動的に実行したいのです。提案のための+1。
Jared

1
こんにちはJaredさん、同じ問題についても心配していました。この代替方法をさらに拡張すると考えられる唯一の解決策は、アクティブ化時にプラグインに現在のテーマの名前を取得させることです。ユーザーがテーマを非アクティブ化/切り替えた場合、そのテーマからテンプレートファイルを削除し、新しくアクティブ化したものに書き換えることができます。テーマ。彼がテーマをチェックするための独自のアクティベーション/非アクティベーションフックを作成したこのリンクを見てください。少し余分なコードがあれば、これは実行可能だと思います。
アダム

もちろん、それでうまくいくと思います。私はそれをやってみて、私の質問に結果を投稿します。リンクをありがとう、それは役立ちます!
Jared、

1

私はソースを閲覧しましたが、これを行う方法はなかなかありません。私が提案するハックは、テーマのオーバーライド/ 2番目のテーマのドロップダウンを含む2番目のメタボックスを追加することです。次に、このフィルターにフックします。

# wp-includes/theme.php line 751 in 3.3.1:
return apply_filters( "{$type}_template", locate_template( $templates ) );

オーバーライドされている場合、テーマファイルを返します。もちろん、必要な投稿である場合にのみ、add_filterを使用します。

派手になりたい場合は、元のボックスをスクラップして再作成できます(もちろん、コアコードを変更せずに、フィルターを使用して)。

また、その機能を要求するトラックチケットを追加することをお勧めします(その機能がまだ存在しない場合)。


1
tracにこれを提案することで同意します。
helgatheviking 2012

すでにトラック
Jared

1
単一投稿タイプのテンプレートに関する別のQについてこれを調査しました。回答の最後にTracチケットがあります。3.4を期待しましょう。
カイザー2012

1

これは、デフォルトのページテンプレートメタボックスを削除してから、独自のメタボックスを追加することで過去に達成しました。新しいメタボックスに組み込みのget_page_templatesを使用させ、プログラムで必要なその他のメタボックスを追加しました。保存すると、WordPressと同じようにページテンプレートを更新できます。


完全なコードを見せていただけませんか?現在それは大まかな概念です。ありがとう。
カイザー


-2

DuckDuckGo でワードプレスページテンプレートを追加して検索した結果、「WordPressカスタムページテンプレートチュートリアル」というタイトルのwpmu.orgページに答えが表示されました。

基本的に、テーマディレクトリwp-content / themes / your-theme内で、既存のページテンプレートを選択した新しいphpファイル名にコピーします。ファイルの上部にあるコメントの魔法の「テンプレート名:」プロパティ値を変更するように注意して、新しいファイルを編集します。

それで終わりです。これは、質問の日付を変更した機能である可能性があります。私はtwenty_elevenテーマでWP 3.5を使用しています。

テーマを拡張するためのより明確な方法がある可能性もあります。このような編集は、テーマの更新によって上書きされる可能性があります。Mea Culpa。


テーマではなくプラグインからテンプレートをドロップダウンリストに追加するソリューションが必要です。:(
ジャレド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.