我不知道这是否是最佳的,这是一个建议。
为了我,我创造了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.