如何在_POST_NAVICATION NEXT PRIV链接中通过元键值排除帖子?

时间:2020-08-01 作者:Kalle H. Väravas

Context: 我们创建了一个插件,允许在web、移动应用程序或两者中发布帖子。这是通过元密钥完成的。当仅在移动应用程序模式下显示时,则其对web隐藏。The plugin code, that filters with meta.

Problem: 虽然它是隐藏的搜索,一般职位和直接。但它仍然可以在帖子内容下的下一个prev导航中看到。我们需要基于元密钥以某种方式过滤帖子导航。

我可以看到get_the_post_navigation() 函数位于主题中,我可以看到<?php if( get_theme_mod( \'post_navigation\', false ) === false ) the_post_navigation(); ?> 位于。

可以get_the_post_navigationpost_navigation 使用meta值进行过滤,或者唯一的选择是不完全使用post\\u导航,并创建一个自定义函数来显示next和prev。类似this answer.

这个content-single.php 是的启动器the_post_navigation() 因此:

<?php if( get_theme_mod( \'post_navigation\', false ) === false ) the_post_navigation(); ?>
the_post_navigation() 位于内部wp-includes/link-template.php:

function the_post_navigation( $args = array() ) {
    echo get_the_post_navigation( $args );
}
以及get_the_post_navigation() 在链接模板内部:

function get_the_post_navigation( $args = array() ) {
    // Make sure the nav element has an aria-label attribute: fallback to the screen reader text.
    if ( ! empty( $args[\'screen_reader_text\'] ) && empty( $args[\'aria_label\'] ) ) {
        $args[\'aria_label\'] = $args[\'screen_reader_text\'];
    }

    $args = wp_parse_args(
        $args,
        array(
            \'prev_text\'          => \'%title\',
            \'next_text\'          => \'%title\',
            \'in_same_term\'       => false,
            \'excluded_terms\'     => \'\',
            \'taxonomy\'           => \'category\',
            \'screen_reader_text\' => __( \'Post navigation\' ),
            \'aria_label\'         => __( \'Posts\' ),
        )
    );

    $navigation = \'\';

    $previous = get_previous_post_link(
        \'<div class="nav-previous">%link</div>\',
        $args[\'prev_text\'],
        $args[\'in_same_term\'],
        $args[\'excluded_terms\'],
        $args[\'taxonomy\']
    );

    $next = get_next_post_link(
        \'<div class="nav-next">%link</div>\',
        $args[\'next_text\'],
        $args[\'in_same_term\'],
        $args[\'excluded_terms\'],
        $args[\'taxonomy\']
    );

    // Only add markup if there\'s somewhere to navigate to.
    if ( $previous || $next ) {
        $navigation = _navigation_markup( $previous . $next, \'post-navigation\', $args[\'screen_reader_text\'], $args[\'aria_label\'] );
    }

    return $navigation;
}

1 个回复
SO网友:mozboz

在您的代码中,在您决定何时应用元查询条件的条件下:

if($query->is_main_query()) {
因此,如果里面的条件有时起作用,而其他条件则不起作用,这意味着条件在起作用时是真实的,而在不起作用时不是真实的。

这个问题的解决方案取决于站点上运行的所有代码,但首先我建议将这一行更改为下面的代码,以验证这一理论。在您的开发环境中执行此操作,如果必须的话,可以暂时在生产环境中执行此操作

if(true) {
这意味着这些元条件将应用于每个查询。很明显,您不希望这样,但如果其他分页页面开始按您所希望的方式工作,这将证实这就是问题所在。

如果是问题,你只需要找到另一个更适合你需要的条件is_main_query. 例如is_home 可能就是你要找的

如果这不是问题所在,那么在其他分页的页面上会发生一些更复杂的事情,这会干扰您的查询,或者使用忽略这些参数的不同方法。

相关推荐

Odd spacing in Navigation Bar

我正在重新设计my website, 我很难找到是什么导致导航项目之间的间距(我假设是边距)。我一直在钻研chrome开发工具,但我在任何地方都找不到导致它的原因。请注意,当您在项目之间悬停时,项目之间会有一个明显的白色条带。