web-dev-qa-db-ja.com

カスタムページテンプレートとしてプラグインファイルを登録するWordPressプラグインはありますか?

私はカスタムページテンプレートをwp-adminで利用可能にするプラグインを作成する必要があります。それはかなり典型的なプロセスのように思えるので、誰かがすでにこれに取り組んできたのだろうか?

9
jnthnclrk

Rarst氏が答えたように、コアファイルを編集したり、ページ属性のmetaboxを削除したりすることなく、実際にそれを行うことができ、少し変更を加えて同じコードを使用して作成できます。以下のコードは/admin/include/meta-boxes.phpのコードで、私はあなたの追加のページテンプレートオプションがどこに行くかを示すためにコメントを追加しました:

function page_attributes_meta_box($post) {
    $post_type_object = get_post_type_object($post->post_type);
    if ( $post_type_object->hierarchical ) {
        $pages = wp_dropdown_pages(array('post_type' => $post->post_type, 'exclude_tree' => $post->ID, 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
        ?>
        <p><strong><?php _e('Parent') ?></strong></p>
        <label class="screen-reader-text" for="parent_id"><?php _e('Parent') ?></label>
        <?php echo $pages; ?>
        <?php
        } // end empty pages check
    } // end hierarchical check.
    if ( 'page' == $post->post_type && 0 != count( get_page_templates() ) ) {
        $template = !empty($post->page_template) ? $post->page_template : false;
        ?>
        <p><strong><?php _e('Template') ?></strong></p>
        <label class="screen-reader-text" for="page_template"><?php _e('Page Template') ?></label><select name="page_template" id="page_template">
        <option value='default'><?php _e('Default Template'); ?></option>
        <?php page_template_dropdown($template); ?>

        // add your page templates as options

        </select>
        <?php
    } ?>
    <p><strong><?php _e('Order') ?></strong></p>
    <p><label class="screen-reader-text" for="menu_order"><?php _e('Order') ?></label><input name="menu_order" type="text" size="4" id="menu_order" value="<?php echo esc_attr($post->menu_order) ?>" /></p>
    <p><?php if ( 'page' == $post->post_type ) _e( 'Need help? Use the Help tab in the upper right of your screen.' ); ?></p>
    <?php
}

これがあなたのケースの修正であるかどうかわからないが、私はプラグインの組み込みテーマでポストタイプを表示する必要があるときに私はより小さなケースを持っていました、そして私はadd_filter('the_content', 'my-function');を使用しました。

もう1つのオプションは、プラグインに現在のテーマディレクトリにテンプレートファイルを作成させることです。

function create_plugins_theme_file(){
    $file_name = TEMPLATEPATH . '/' . $tamplate_name . '.php';
    $handle = fopen($file_name, 'w') or wp_die('Cannot open file for editing');
    $file_contents = <<<OUT
<?php
/*
Template Name: $tamplate_name
*/
?>

//you theme file here

OUT;

   fwrite($handle, $file_contents);
   fclose($handle);
 }

ファイルが存在するかどうかを最初に確認した後にこれを実行できます。

if(!file_exists( $file_name)){create_plugins_theme_file();}

これが役立つことを願っています。

7
Bainternet

私はあなたが何を達成しようとしているのか、少なくともあなたがプラグインにそれをさせたいと思う理由を私が理解しているのか完全にはわからない。

さまざまなページテンプレートを作成するための通常の手順は次のとおりです。

  1. ACTIVEテーマディレクトリに新しいpage-templateを作成します(page.phpのコピーを作成します)。

  2. ファイルの中でテンプレートの名前を変更します。

    / *テンプレート名:全角ページ* /

  3. あなたが達成しようとしているものにページのコードを変更してください。

  4. これで新しいページを作成して、使用する「テンプレート」を選択できます。

alt text

...

それがあなたが達成しようとしていることであることを願っていますか?

公式文書はこちら: http://codex.wordpress.org/Pages#Creating_Your_Own_Page_Templates

2
Lars Koudal

これを達成するのはかなり難しいようです。 get_page_templates()関数は、親と子のルートディレクトリにないものはすべて積極的に破棄します。また、グローバル変数に格納したり、生成されたテンプレートのリストをフィルタリングすることもできません。

私はページ属性のメタボックスをフォークしてこれを完全に置き換える必要があると思います。それでもそれが可能になるかどうかわからない。

これは理にかなっているように思えることに同意しますが、WordPressのコードは名前付きテンプレートをテーマのディレクトリからのみ取得したいという点で非常に正確です。

2
Rarst

これがregister_theme_directory()が導入された理由のひとつではないでしょうか。

http://core.trac.wordpress.org/ticket/10467

当時はBuddyPressに関連した問題で、あちこちで余分なテンプレートを投げたくなりました。

ただし、ページテンプレートとして正しく表示されていないと思います。

http://core.trac.wordpress.org/ticket/15803

1