如何在不刷新访问者触发的每个POST查询的重写规则的情况下解决此问题?

时间:2013-02-07 作者:Circuit Circus

实际上,我有一个问题,我提供了一个菜单链接(在主题中预定义)到特定自定义帖子类型的最新帖子。我通过以下函数实现这一点…

function get_latest_magazine_issue_url() {
    global $wpdb;
    $query = "SELECT ID FROM {$wpdb->prefix}posts WHERE post_type=\'magazine_issue\' AND post_status=\'publish\' ORDER BY post_date DESC LIMIT 1;";
    $result = $wpdb->get_results($query);
    if(is_object($result[0])) { return get_permalink($result[0]->ID); } 
    else { return \'\'; };
}
…很好,直到这一点-但我认识到,当我在添加新的cpt帖子后单击该链接时,该链接仍会获取我通过widget实现此链接时的最新帖子。没有flush\\u rewrite\\u rules()调用,有没有办法解决这个问题?我不想那样冲水,因为抄本上说:http://codex.wordpress.org/Function_Reference/flush_rewrite_rules

1 个回复
最合适的回答,由SO网友:david.binda 整理而成

哦,对你问题的评论很清楚。如果你想总是返回一篇最新的帖子,无论带有菜单链接的页面是否刷新,都必须用另一种方式解决。

首先:创建新页面,比如说:“最新帖子”-注意它的ID。

然后将其添加到函数中。php:

function binda_redirect_to_latest( $query ) {
    $page_id = 234; //ID of your page with Latest post
    if ( $query->is_page( $page_id ) && $query->is_main_query() ) {          
        $args = array( \'numberposts\' => 1, \'orderby\' => \'post_date\', \'order\' => \'DESC\', \'post_type\' => \'magazine_issue\', \'post_status\' => \'publish\' ); 
        $latest_post = get_posts( $args ); 
        foreach( $latest_post as $p ){
            $query->set( \'p\', $p->ID );
            $query->set( \'page_id\', \'\' );   
        }     
    }
    return $query;
}
add_action( \'pre_get_posts\', \'binda_redirect_to_rand\' );

如果不想创建额外的页面,可以注册一个新的查询变量和chceck,因为它存在于pre\\u get\\u posts挂钩中。这样做:

add_filter( \'query_vars\', \'my_query_vars\' );
function my_query_vars( $vars ) {
    $vars[] = \'latest_post\';
    return $vars;
}
修改的pre\\u get\\u posts挂钩回调:

function binda_redirect_to_latest( $query ) {    
    if ( $query->is_home() && isset($query->query_vars[\'latest_post\']) && $query->query_vars[\'latest_post\'] == 1 && $query->is_main_query() ) {          
        $args = array( \'numberposts\' => 1, \'orderby\' => \'post_date\', \'order\' => \'DESC\', \'post_type\' => \'magazine_issue\', \'post_status\' => \'publish\' ); 
        $latest_post = get_posts( $args ); 
        foreach( $latest_post as $p ){
            $query->set( \'p\', $p->ID );  
        }     
    }
    return $query;
}
add_action( \'pre_get_posts\', \'binda_redirect_to_rand\' );
要创建ling,请添加\\u query\\u arg:

echo add_query_arg( \'latest_post\', 1, get_bloginfo(\'url\') );

结束