Как решить эту проблему, не смывая правила перезаписи для каждого запроса на отправку посетителей?

На самом деле у меня есть проблема, связанная с тем, что я предоставляю ссылку меню (предопределенную в теме) до последнего сообщения определенного типа сообщений. Я достигаю этого с помощью следующей функции …

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, ссылка все равно захватит сообщение, которое было последним, когда я реализовал эту ссылку через виджет. Есть ли способ обойти это без вызова flush_rewrite_rules ()? Я не хотел бы скрывать это, потому что codex говорит: http://codex.wordpress.org/Function_Reference/flush_rewrite_rules

Solutions Collecting From Web of "Как решить эту проблему, не смывая правила перезаписи для каждого запроса на отправку посетителей?"

О, комментарий по вашему вопросу дает понять. В случае, если вы хотели бы всегда возвращать новую последнюю запись, независимо от того, страница, с которой ссылка на меню получает или не обновляется, должна быть решена по-другому.

Сначала: создайте новую страницу, скажем: «Последнее сообщение» – отметьте его идентификатор.

И добавьте это в свои функции. 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_get_posts hook. Сюда:

 add_filter( 'query_vars', 'my_query_vars' ); function my_query_vars( $vars ) { $vars[] = 'latest_post'; return $vars; } 

Модифицированный обратный вызов hook_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' ); 

Чтобы создать линг, вы добавляете_query_arg:

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