组织书页结构的最佳方式

时间:2013-09-07 作者:somebody

我想知道在不涉及分类法的情况下组织书籍页面内容的最佳方式是什么。例如,我有一本数学书,里面有一堆我想列出的问题。我有一个自定义的帖子类型qa 其中可以包括分类法<book-name>, 我希望URL为:<domain>/qa/<book-name>/<page-number>/<problem-number>. 因此,创建这样的结构不是什么大事,除了<page-number> - 将会有很多页面,我认为创建这么多分类法是不切实际的。那么,什么是最佳的实现呢?如果有任何建议,我将不胜感激。

1 个回复
SO网友:gmazzap

我不知道这是否是最佳的,这是一个建议。

为了我,我创造了qa post类型ashierachical.

然后在书中的每一页我都创造了一个孩子qa post使用menu_order 处理页码的字段。

这个孩子有一个三级问题孩子。

挂钩介绍pre_get_posts 对于qa 存档,您可以设置post_parent 设置为0,因此在存档视图中,您只能获得书籍,而不是页面和问题的大列表。

最后一件事是创建一个重写规则,将url转换为一些查询变量。

E、 g。

<domain>/qa/<book-name>/<page-number>/<problem-number> 应在中重写

 <domain>/index.php?name=<book-name>&post_type=qa&number=<page-number>&problem=<problem-number>
该url将以一个非常简单的查询结束,其中post id = <problem-number>.

示例代码:

function my_book_rules() {
  add_rewrite_rule( \'qa/([^/]+)/([0-9]+)/([0-9]+)$\', \'index.php?&post_type=qa&name=$matches[1]&number=$matches[2]&problem=$matches[3]\', \'top\' );
  add_rewrite_rule( \'qa/([^/]+)/([0-9]+)$\', \'index.php?&post_type=qa&name=$matches[1]&number=$matches[2]\', \'top\');
}
add_action(\'init\', \'my_book_rules\');

function my_book_query_vars($vars) {
  $vars[] = \'problem\';
  $vars[] = \'number\';   
  return $vars;
}

add_filter(\'query_vars\', \'my_book_query_vars\'); 

function my_book_query( $query ) {
  if ( is_admin() || ! is_main_query() ) return;
  if ( is_archive() && $query->get(\'post_type\') == \'qa\') {
     $query->set(\'post_parent\', 0);
  } elseif ( is_single() && get_post_type() == \'qa\') {
    $post = get_queried_object();
    if ( $post->post_parent == 0 && $query->get(\'number\') && ! $query->get(\'problem\') ) {
      // a page number is requested
      $query->set(\'name\', \'\');
      global $wpdb;
      $n = intval($query->get(\'number\'));
      $p = (int) $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_status = \'publish\' AND post_type = \'qa\' AND post_parent = $post->ID AND menu_order = $n");
      $query->set(\'p\', $n);
    } elseif( $query->get(\'problem\') ) {
      // a problem is required
      $query->set(\'name\', \'\');
      $n = intval($query->get(\'problem\'));
      $query->set(\'p\', $n);
    }
  }
}
add_action(\'pre_get_posts\', \'my_book_query\');
在单个视图样板中single-qa.php 您可以为书籍、页面或问题加载sub-tempalte,例如:

if ( $post->post_parent == 0 ) {
   get_template_part(\'book\', \'content\');
} else {
  $parent = get_post( $post->post_parent );
  if ( $parent->post_parent == 0 ) {
    get_template_part(\'page-number\', \'content\');
  } else {
    get_template_part(\'problem\', \'content\');
  }
}
另一个片段用于在问题模板中显示图书标题和页码(problem-content.php 根据前面的片段),

$thepage = get_post( $post->post_parent);
$pagenumber = $thepage->menu_order
$the_book = get_post( $thepage->post_parent )->post_title

echo "The problem " . get_the_title() . 
  " is in the book " . $the_book->post_title .
  " at the page number " . $pagenumber;
请注意,代码是proof of concept and untested.

结束

相关推荐