以编程方式从其模板页面检索页面内容

时间:2014-01-07 作者:blaise

我正在构建一个菜单,并使用foundation前端框架以手风琴风格将其显示到前端。Wordpress管理员像往常一样从外观->菜单将菜单项(页面、帖子、自定义帖子、类别等)拖放到菜单中。我的代码循环遍历菜单中的每个菜单项,并显示它及其内容。例如,如果循环遇到about page 在菜单中,显示About 作为列表项标签(可单击)及其下的内容(隐藏)。网站访问者点击“关于”以手风琴的方式显示“关于”页面的内容。实现这一目标的最佳方法是什么?我指的是循环和内容检索。我尝试了以下代码。

About
  about page content (text/ starts as hidden)
Contact 
  contact page content (text/ starts as hidden)
Solutions 
  HEALTHCARE (label)
    Healthcare solution 1 (link)
    Healthcare solution 2 (link)
  PROFESSIONAL SERVICES (label)
    Prof service 1 (link)
    prof service 2 (link)
我编写了以下代码,部分成功:

<?php 
  $menu_name = \'primary\';

  if( ($locations = get_nav_menu_locations()) && isset($locations[$menu_name]) ) {
    $menu = wp_get_nav_menu_object( $locations[$menu_name] );
    $menu_items = wp_get_nav_menu_items($menu->term_id);
?>
<dl class="accordion" data-accordion>

  <?php foreach( (array) $menu_items as $key => $menu_item ) { ?>
    <?php if ($menu_item->object == \'page\'): ?>
      <?php
        $id = get_post_meta($menu_item->ID, \'_menu_item_object_id\', true); 
        $page = get_page($id);
        //$template_name = get_post_meta($id, \'_wp_page_template\', true);?>

      <dd>
       <a href="#panel<?php echo $menu_item->ID;?>"><?php echo $menu_item->title; ?></a>
        <div id="panel<?php echo $menu_item->ID;?>" class="content">
      <?php 
            if($page->post_title == \'Contact\'): /* DIRTY:PROBLEM IS HERE */ 
              get_template_part(\'contact\'); /* NOT GOOD, very had coded */
            else: echo apply_filters(\'the_content\', $page->post_content); endif; /* I LIKE THIS MORE */?>
   </div>
      </dd>
   <?php elseif($menu_item->object == \'solutions_category\'): /* CUSTOM POST TYPE */?>
   <?php /* REST OF THE CODE ... */ ?>
   <?php endif;?>
 <?php } ?>
</dl> <!-- .accordion -->   
这样可以很好地工作,但问题在于“联系人”页面,因为它只对其内容使用模板页面(页面文本编辑器为空)。如您所见,为了使用get\\u template\\u part,我正在显式检查post\\u title是否为Content。这绝对是不好的,也是不可取的。

无论内容来自模板、设置页面还是文本编辑器本身,是否有能够检索页面内容的通用解决方案?

提前谢谢。

1 个回复
SO网友:Chip Bennett

您可以通过使用get_page_template_slug() 在你的循环中。例如,可以对非默认页面模板执行以下操作:

if ( \'\' != get_page_template_slug( $page->ID ) ) {
    // This page uses a custom page template;
    // do something
}
或者,您可以专门查找您的联系人表单页面模板:

if ( \'template-contact-form.php\' == get_page_template_slug( $page->ID ) ) {
    // This page uses the contact form custom page template;
    // do something
}
您将遇到的问题是“做点什么”部分,因为您已将联系人表单硬编码到模板中。

要执行您想要执行的操作,您可能需要将联系人表单代码转换为短代码或小部件,以便您可以在自定义循环中解析/输出它,例如:

if ( \'template-contact-form.php\' == get_page_template_slug( $page->ID ) ) {
    // This page uses the contact form custom page template;
    // parse the shortcode
    echo do_shortcode( \'[contact-form]\' );
}
。。。或:

if ( \'template-contact-form.php\' == get_page_template_slug( $page->ID ) ) {
    // This page uses the contact form custom page template;
    // output the widget
    the_widget( \'my-contact-form\' );
}
(注:简写代码do_shortcode()the_widget(); 有关正确使用方法,请参阅法典。)

结束

相关推荐

Menus like a CMS

以下是一些内容的结构示例:Parent A -- Child A -- Child B Parent B -- Child C -- Child D Parent A 应链接到的内容Child A 和Parent B 应链接到的内容Child C. 除此之外,我不确定这是否应该完全由wordpress中的“菜单”来管理,或者它是否应该是Parent A 包含子页面的页面。唯一的问题是Parent A 不是真正的内容,只是链接到Child A.如果你需要一个真