ページ属性メタボックスとページテンプレートを投稿編集ページに追加しますか?


14

モデレーターの注意:タイトルはもともと「ページ属性」や「ページ属性>テンプレート」セレクターをPOSTSエディターに追加する方法です)

WPは現在、ページへの「テンプレート」の割り当てのみを許可しています(つまり、post_type=='page')。この機能を投稿にも拡張したい(たとえば、post_type=='post'

「ページ属性」メタボックス、より具体的には、テンプレートエディターを投稿エディターに追加するにはどうすればよいですか?

私はこれがfunctions.php私のテーマのために私が置くコードであると仮定しています。

更新:選択ボックスhtmlを既存のカスタムメタオプションボックスに追加するだけで、ハードコーディングされたテンプレートプルダウンメニューを投稿エディターに追加できました。ここに私が使用しているコードがあります...

add_meta_box('categorydiv2', __('Post Options'), 'post_categories_meta_box_modified', 'post', 'side', 'high');

そして、オプションとテンプレート選択ボックスを書き出す機能があります...

//adds the custom categories box
function post_categories_meta_box_modified() {
    global $post;
    if( get_post_meta($post->ID, '_noindex', true) ) $noindexChecked = " checked='checked'";
    if( get_post_meta($post->ID, '_nofollow', true) ) $nofollowChecked = " checked='checked'";
?>
<div id="categories-all" class="ui-tabs-panel">
    <ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
        <li id='noIndex' class="popular-category"><label class="selectit"><input value="noIndex" type="checkbox" name="chk_noIndex" id="chk_noIndex"<?php echo $noindexChecked ?> /> noindex</label></li> 
        <li id='noFollow' class="popular-category"><label class="selectit"><input value="noFollow" type="checkbox" name="chk_noFollow" id="chk_noFollow"<?php echo $nofollowChecked ?> /> nofollow</label></li>
    </ul>

    <p><strong>Template</strong></p> 
    <label class="screen-reader-text" for="page_template">Post Template</label><select name="page_template" id="page_template"> 
    <option value='default'>Default Template</option> 
    <option value='template-wide.php' >No Sidebar</option>
    <option value='template-salespage.php' >Salespage</option>
    </select>
</div>
<?php
}

最後に、選択した値を保存時にキャプチャするコード...

function save_post_categories_meta($post_id) {
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
    $noIndex = $_POST['chk_noIndex'];
    $noFollow = $_POST['chk_noFollow'];
    update_post_meta( $post_id, '_noindex', $noIndex );
    update_post_meta( $post_id, '_nofollow', $noFollow );
    return $post_id;
}

残っているのは、(1)選択したテンプレートをキャプチャして、この投稿の投稿メタに追加し、(2)選択したテンプレートを使用するようにindex.phpとsingle.phpを変更することだけだと思います。


@Scott B:あなたがそれに取り組んでいるのを見る前に、私は私の答え全体を書きました、そしてあなたはノーフォローとインデックスオプションなしであなたの元の質問とはやや異なる方向に持っていったようです。うまくいけば、私がしたことはまだあなたにとって価値がある。そうでなければ、多分それは他の人を助けるでしょう。
MikeSchinkel

はい、あなたは質問に答えました。ディレクトリを解析する必要がなく、特定のテンプレートの値をハードコーディングできることに気付いた後、少し違った方法を取りました。WPが投稿に正しい割り当てられたテンプレートを実際に使用できるようにするために、コードの一部を借りる必要があります。
スコットB

回答:


12

悪いニュースの持ち主であることが嫌いですが、WordPressはページテンプレート機能を「ページ」投稿タイプに少なくともv3.0でハードコーディングします(将来のバージョンでは変更される可能性がありますが、変更する特定のイニシアチブはありません)まだです。これは、コアをハッキングせずに何かを回避する方法を見つけるのに苦労している非常にまれな時間の1つです。)

私が思いついた解決策は、基本的にWordPressコアから関連するコードをコピーし、必要に応じて修正することです。手順は次のとおりです(行番号はv3.0.1からです)。

  1. page_attributes_meta_box()関数を535行目からコピーし、それ/wp-admin/includes/meta-boxes.phpに合わせて変更します。

  2. add_meta_boxes#1で作成されたメタボックスを追加するフックをコーディングします。

  3. get_page_templates()行166から関数コピーし、それ/wp-admin/includes/theme.php に合わせて変更します。

  4. page_template_dropdown()行2550から関数コピーし、それ/wp-admin/includes/template.phpに合わせて変更します。

  5. テーマに投稿テンプレート追加します。

  6. save_post保存時に投稿テンプレートファイル名を保存できるようにフックコーディングします。

  7. single_templateフックコーディングして、関連する投稿の投稿テンプレートの読み込みを有効にします。

それで今!


1. page_attributes_meta_box()関数をコピーします

最初のステップとして、page_attributes_meta_box()535行目から関数をコピーする必要があり/wp-admin/includes/meta-boxes.php、名前を変更することにしましたpost_template_meta_box()。ページテンプレートのみを要求したので、親の投稿を指定するためのコードと、コードをより簡単にする順序を指定するためのコードを省略しました。またpage_template、意図しない結合によって引き起こされる可能性のある非互換性を回避するために、オブジェクトプロパティを再利用するのではなく、これにpostmetaを使用することを選択しました。コードは次のとおりです。

function post_template_meta_box($post) {
  if ( 'post' == $post->post_type && 0 != count( get_post_templates() ) ) {
    $template = get_post_meta($post->ID,'_post_template',true);
    ?>
<label class="screen-reader-text" for="post_template"><?php _e('Post Template') ?></label><select name="post_template" id="post_template">
<option value='default'><?php _e('Default Template'); ?></option>
<?php post_template_dropdown($template); ?>
</select>
<?php
  } ?>
<?php
}

2. add_meta_boxesフックをコーディングする

次の手順では、add_meta_boxesフックを使用してメタボックスを追加します。

add_action('add_meta_boxes','add_post_template_metabox');
function add_post_template_metabox() {
    add_meta_box('postparentdiv', __('Post Template'), 'post_template_meta_box', 'post', 'side', 'core');
}

3. get_page_templates()関数をコピーします

私は、ページテンプレートと投稿テンプレートを区別することだけが理にかなっており、したがっての行166にget_post_templates()基づく機能の必要性があると想定しました。ただし、マーカーを使用する代わりに、この関数が使用するページテンプレートでは、代わりに使用できるマーカーを使用します。get_page_templates()/wp-admin/includes/theme.phpTemplate Name:Post Template:

私も検査を除外しましたfunctions.php (それget_page_templates()なしでどのように正しく動作したかはわかりませんが、何でも!)そして残っている唯一のことは、将来のメンテナンスの読みやすさのために単語pageへの参照を変更することpostです:

function get_post_templates() {
  $themes = get_themes();
  $theme = get_current_theme();
  $templates = $themes[$theme]['Template Files'];
  $post_templates = array();

  if ( is_array( $templates ) ) {
    $base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );

    foreach ( $templates as $template ) {
      $basename = str_replace($base, '', $template);
      if ($basename != 'functions.php') {
        // don't allow template files in subdirectories
        if ( false !== strpos($basename, '/') )
          continue;

        $template_data = implode( '', file( $template ));

        $name = '';
        if ( preg_match( '|Post Template:(.*)$|mi', $template_data, $name ) )
          $name = _cleanup_header_comment($name[1]);

        if ( !empty( $name ) ) {
          $post_templates[trim( $name )] = $basename;
        }
      }
    }
  }

  return $post_templates;
}

4. page_template_dropdown()関数をコピーします

同様にpage_template_dropdown()、2550行目からコピーし/wp-admin/includes/template.phpて作成しpost_template_dropdown()get_post_templates()代わりにcall に変更します:

function post_template_dropdown( $default = '' ) {
  $templates = get_post_templates();
  ksort( $templates );
  foreach (array_keys( $templates ) as $template )
    : if ( $default == $templates[$template] )
      $selected = " selected='selected'";
    else
      $selected = '';
  echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
  endforeach;
}

5.投稿テンプレートを追加する

次のステップは、テスト用の投稿テンプレートを追加することです。Post Template:ステップ3で言及したマーカーを使用してsingle.php、テーマからコピーしsingle-test.php、次のコメントヘッダーを追加します(の代わりにロードしてsingle-test.phpいることがわかるように、必ず何かを変更してくださいsingle.php

/**
 * Post Template: My Test Template
 */

手順1から5を完了すると、「投稿テンプレート」メタボックスが投稿エディターページに表示されます。

WordPress 3.0に追加した場合の投稿テンプレートメタボックスの外観
(ソース:mikeschinkel.com

6. save_postフックをコーディングする

エディターが四角になったので、ユーザーが[発行]をクリックしたときに、ページテンプレートファイル名を実際にpostmetaに保存する必要があります。そのためのコードは次のとおりです。

add_action('save_post','save_post_template',10,2);
function save_post_template($post_id,$post) {
  if ($post->post_type=='post' && !empty($_POST['post_template']))
    update_post_meta($post->ID,'_post_template',$_POST['post_template']);
}

7. single_templateフックをコーディングする

最後に、実際にWordPressで新しい投稿テンプレートを使用できるようにする必要があります。それを行うには、single_template1つが割り当てられている投稿に必要なテンプレート名をフックして返します。

add_filter('single_template','get_post_template_for_template_loader');
function get_post_template_for_template_loader($template) {
  global $wp_query;
  $post = $wp_query->get_queried_object();
  if ($post) {
    $post_template = get_post_meta($post->ID,'_post_template',true);
    if (!empty($post_template) && $post_template!='default')
      $template = get_stylesheet_directory() . "/{$post_template}";
  }
  return $template;
}

そしてそれはそれについてです!

カスタム投稿タイプのみを考慮していないことに注意してください。私の意見では、カスタム投稿タイプに対処するには、異なる投稿タイプを区別する必要があり、それほど難しくはありませんが、ここではそれを試みませんでした。post_type=='post'


すごい!デフォルトのWordPress関数をコピーするのと同じ方法で、エディターでほぼ完全なコードを使用してスリープ状態になりました(完了しましたが、テストしなかったため投稿しませんでした)。:)
sorich87

@ sorich87-昔のことわざ「あなたは居眠りしてるよ!」 冗談はさておき、ONLY冗談。実際にそれを機能させる合理的な方法は1つしかないため、コードが同じになるのも不思議ではありません!
MikeSchinkel

マイク、あなたは驚き続けます。これを打ち出すのに時間を割いてくれてありがとう。
スコットB

@ sorich87-作業してくれてありがとう。この努力に本当に感謝しています。
スコットB

1
@Scott B:問題ない、助けてくれてうれしい。私は、多くの人々を潜在的に助けることができる合理的に一般的な質問を探し、質問をする人だけでなく、後に来るかもしれない人のためにそれらに答えようとします。
MikeSchinkel

0

Wordpressでは、プラグインを使用してメタをカテゴリに追加できます。

これを行うには、メタをカテゴリに追加するさまざまな拡張機能の1つを追加する必要があります(箱から出てくるページを模倣する)。SimpleTerm Metaはうまく機能します。

NB WordPress 3.xは、カテゴリを拡張するために必要です。

その後、次を使用できます。

  • add_term_meta
  • update_term_meta
  • get_term_meta

Functions.phpを使用して、必要なことを行うためのメソッドを追加します。

add_action('category_add_form_fields', 'category_metabox_add', 10, 1);

function category_metabox_add($tag) { ?>
    <div class="form-field">
        <label for="image-url"><?php _e('Image URL') ?></label>
        <input name="image-url" id="image-url" type="text" value="" size="40" aria-required="true" />
        <p class="description"><?php _e('This image will be the thumbnail shown on the category page.'); ?></p>
    </div>
<?php } 

add_action('created_category', 'save_category_metadata', 10, 1);

function save_category_metadata($term_id)
{
    if (isset($_POST['image-url'])) 
        update_term_meta( $term_id, 'image-url', $_POST['image-url']);                  
}

テーマの新しいフィールドを呼び出すのは簡単です:

<?php echo get_term_meta(get_query_var('cat'), 'image-url', true); ?>

詳細と例:http : //www.wphub.com/adding-metadata-taxonomy-terms/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.