同一家长的下一篇和上一篇帖子

时间:2020-07-21 作者:ZackAkai

我正在为一个网络喜剧网站工作,我有一个为喜剧页面设置的自定义帖子类型。我在网站上有多个系列,并将每个漫画页面制作成一个家长的子帖子(每个系列有一个家长),以保持其组织性,并为URL提供一些结构。我现在要做的是在每个漫画页面上添加下一个和上一个按钮,以便读者可以轻松地在它们之间移动。我目前有两个独立但相关的问题。

1. 漫画页面使用相同的名称和URL格式,仅由其父页面分隔。例如,LCC系列的第一页如下所示:

http://localhost/wordpress/comics/lcc/v01-001/
而HTA系列的第一页是这样的:

http://localhost/wordpress/comics/hta/v01-001/
Wordpress允许在URL/slug级别执行此操作,但在尝试使用next和previous post函数时会产生问题。首先创建的父级(在本例中为LCC)的子级具有优先权,在LCC中来回移动时,这一点非常有效。然而,如果我从HTA转到一个页面,并尝试在其中前后移动,它会立即将我踢到带有适当段塞但在LCC中的页面(因此,例如,在HTA/v01-001上单击“下一步”应指向HTA/v01-002,而不是指向LCC/v01-002-单击“上一步”,然后指向LCC/v01-001)。

我找到了一些解决方案,可以取消下一个/上一个post函数,并通过增加post ID来实现,但这对我不起作用,因为我已将其设置为按菜单顺序分页,我已将其更改为按字母顺序(我希望这一切都独立于post ID号)。以下是我使用的代码:

/* === Reorder Comic Page Pagination Alphabetically === */
function filter_next_post_sort($sort) {
    global $post;
    if (get_post_type($post) == \'comic-page\') {
        $sort = "ORDER BY p.post_title ASC LIMIT 1";
    }
    else{
        $sort = "ORDER BY p.post_date ASC LIMIT 1";
    }
    return $sort;
}

function filter_next_post_where($where) {
    global $post, $wpdb;
    if (get_post_type($post) == \'comic-page\') {
        return $wpdb->prepare("WHERE p.post_title > \'%s\' AND p.post_type = \'". get_post_type($post)."\' AND p.post_status = \'publish\'",$post->post_title);
    }
    else{
        return $wpdb->prepare( "WHERE p.post_date > \'%s\' AND p.post_type = \'". get_post_type($post)."\' AND p.post_status = \'publish\'", $post->post_date);
    }
}

function filter_previous_post_sort($sort) {
    global $post;
    if (get_post_type($post) == \'comic-page\') {
        $sort = "ORDER BY p.post_title DESC LIMIT 1";
    }
    else{
        $sort = "ORDER BY p.post_date DESC LIMIT 1";
    }
    return $sort;
}

function filter_previous_post_where($where) {
    global $post, $wpdb;
    if (get_post_type($post) == \'comic-page\') {
        return $wpdb->prepare("WHERE p.post_title < \'%s\' AND p.post_type = \'". get_post_type($post)."\' AND p.post_status = \'publish\'",$post->post_title);
    }
    else{
        return $wpdb->prepare( "WHERE p.post_date < \'%s\' AND p.post_type = \'". get_post_type($post)."\' AND p.post_status = \'publish\'", $post->post_date);
    }
}

add_filter(\'get_next_post_sort\',   \'filter_next_post_sort\');
add_filter(\'get_next_post_where\',  \'filter_next_post_where\');
add_filter(\'get_previous_post_sort\',  \'filter_previous_post_sort\');
add_filter(\'get_previous_post_where\', \'filter_previous_post_where\');
和我的自定义邮政编码:

/* === Comic Page === */
function post_type_comic_page() {
    
    // Labels
    $labels = array(
        \'name\' => \'Comic Pages\',
        \'singular_name\' => \'Comic Page\',
        \'add_new\' => \'Add New Comic Page\',
        \'add_new_item\' => \'Add Comic Page\',
        \'all_items\' => \'All Comic Pages\',
        \'edit_item\' => \'Edit Comic Page\',
        \'not_found\' => \'No Comic Pages Found\',
        \'not_found_in_trash\' => \'No Comic Pages Found in Trash\',
    );
    
    // Arguments
    $args = array(
        \'labels\' => $labels,
        \'public\' => true,
        \'menu_icon\' => \'dashicons-book-alt\',
        \'hierarchical\' => true,
        \'exclude_from_search\' => false,
        \'has_archive\' => true,
        \'publicly_queryable\' => true,
        \'rewrite\' => array( \'slug\' => \'comics\', \'with_front\' => false ),
        \'supports\' => array(
            \'page-attributes\', \'title\', \'editor\', \'something-else\',
        ),
    );
    
    // Register Comic Pages Post Type
    register_post_type(\'comic-page\', $args);
}

add_action(\'init\', \'post_type_comic_page\');
2. 当我解决这个问题时,我需要能够将前向和后向导航限制为仅限于同一父项下的同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级同级。因此,在到达LCC的最后一页时,不应转到HTA的第一页,反之亦然。

对于所有这些,我的回退选项是只使用一系列分类法(我之前已经设置并使用过),但我正试图消除尽可能多的不必要代码和检查每个漫画页面所需的东西。我可以在没有分类法的情况下做任何我需要做的事情,所以如果有可能在孩子/父母关系上做到这一点,请帮助我!

1 个回复
SO网友:mozboz

因此,我无法为您提供完整的解决方案,但以下是我认为可能有帮助的部分:

获取父帖子ID:wp_get_post_parent_id() - https://developer.wordpress.org/reference/functions/wp_get_post_parent_id/

  • 获取具有特定父ID的所有帖子。下面是一个WP_查询参数,用于按父ID获取所有帖子

  •     $args = array(
            \'post_parent\' => $parentID,
            \'posts_per_page\' => -1,
            \'orderby\' => \'???\'   // you need to choose how your child posts should be ordered
        );
    
    因此,您可以使用上面的代码查找当前帖子的父ID,然后获取该帖子的所有子项,这些子项将是当前帖子的“兄弟”。

    使用上述代码查找下一个/上一个帖子ID。下面是我的建议,让代码阅读所有“兄弟”帖子,并找出下一个和上一个URL。这样做的目的是循环浏览该帖子的所有兄弟帖子,我们正在查找之前的帖子和之后的帖子,以便为之前和接下来的帖子提供帖子ID。如果当前帖子位于开头,则$prevPostID将为false, 因此,您可以使用它来不显示上一个帖子链接。如果当前帖子的结尾是,那么$nextPostID将是false, 因此,您可以阻止显示下一个帖子链接这假设您已经构建了$args 使用建议获取父帖子ID的所有子项,如上所述。

    $currentID = ?? // assume we have the current post ID here
    
    $wpq = new WP_Query( $args );
    if ( $wpg->have_posts() ) {
        $prevPostID = false;
        $nextPostID = false;
        $previousInLoop = false;
    
        while ( $wpq->have_posts() ) {
            if (get_the_ID() == $currentID) {
                $prevPostID = $previousInLoop;
            }
            if ($previousInLoop == $currentID) {
                $nextPostID = get_the_ID();
                break;
            }
            $previousInLoop = get_the_ID();
        }
    }
    
    这是关于如何使此代码工作的建议,并且是未经测试的代码。如果您使用它并有进一步的问题,很乐意提供帮助。

    注意,您也可以在循环过程中获取下一个/上一个标题和URL,而无需稍后再次查找,但我将把这留给您。