是否将页面属性Metabox和页面模板添加到帖子编辑页面?

时间:2010-10-10 作者:Scott B

(Moderators note: 标题最初是“如何将“页面属性”和/或“页面属性>模板”选择器添加到帖子编辑器”)

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)修改索引。php和single。php,以便使用所选模板。

2 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

不想成为坏消息的传播者,但是WordPress hardcodes the Page Template functionality to the "page" post type, 至少在v3中。(这在未来的版本中可能会改变,但我还没有意识到要改变它的具体举措。因此,这是我为数不多的几次在不破解核心的情况下努力解决问题。)

我提出的解决方案基本上是从WordPress core复制相关代码,并根据需要进行修改。以下是步骤(行号来自v3.0.1):

  1. Copy the page_attributes_meta_box() function 来自第535行/wp-admin/includes/meta-boxes.php 并根据需要进行修改。

  2. Code an add_meta_boxes hook 添加在#1中创建的元数据库。

  3. Copy the get_page_templates() function 自第166行,共/wp-admin/includes/theme.php 并根据需要进行修改。

  4. Copy the page_template_dropdown() function 自第2550行,共/wp-admin/includes/template.php 并根据需要进行修改。

  5. Add a Post Template 你的主题。

  6. Code a save_post hook 启用保存后存储post模板文件名。

  7. Code a single_template hook 为相关帖子启用帖子模板加载。

    现在开始吧!

    1。复制page_attributes_meta_box() 功能作为我们的第一步,您需要复制page_attributes_meta_box() 来自第535行的函数/wp-admin/includes/meta-boxes.php 我选择了重命名它post_template_meta_box(). 因为您只需要页面模板,所以我省略了指定父帖子和指定顺序的代码,这使得代码更加简单。我还选择使用Posteta,而不是尝试重用page_template 对象属性,以避免意外耦合导致的潜在不兼容性。下面是代码:

    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。代码anadd_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() 功能我认为只有区分页面模板和帖子模板才有意义,因此需要get_post_templates() 功能基于get_page_templates() 自第166行,共/wp-admin/includes/theme.php. 但不是使用Template 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() 而是:

    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后,您可以在Post editor页面上看到您的“Post Templates”(发布模板):

    What a Post Templates Metabox looked like when added to WordPress 3.0
    (来源:mikeschinkel.com)

    6。代码asave_post 钩子(hook)

    现在编辑器已经就绪,您需要在用户单击“发布”时将页面模板文件名保存到Posteta。下面是代码:

    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。代码asingle_template 最后,你需要让WordPress使用你的新帖子模板。你是通过勾勾来实现的single_template 并为已分配了模板的帖子返回所需的模板名称:

    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;
    }
    
    就这样!

    NOTEdid not 考虑到Custom Post Types, 只有post_type==\'post\'. 在我看来,处理自定义帖子类型需要区分不同的帖子类型,虽然不太难,但我在这里并没有尝试。

SO网友:Jay

Wordpress允许您使用插件向类别添加元:

要做到这一点,您需要添加各种扩展中的一种,将meta添加到类别中(模拟页面从框中取出的内容),Simple Term Meta 工作做得很好。

N、 B.WordPress 3。扩展类别需要x。

之后,您可以使用:

添加\\u term\\u meta使用函数更新\\u term\\u meta。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/

结束

相关推荐

是否在URI请求参数表单中使用联合/交集查询_POSTS变量?

通常,在创建某种形式的查询时,我会对参数使用一个数组,如下所示: $postslistArgs = array( \'child_of\' => 320, \'parent\' => 320 ); $postslist = get_pages($postslistArgs);但是,在其他情况下,我还需要/想要使用URI样式的查询参数,如下所示:get_pages(\'child_of=