Intereting Posts

В настоящее время с помощью query_posts () в моей теме – вместо этого нужно использовать фильтр запросов

В настоящее время я использую этот код в своей теме, прежде чем показывать содержимое настраиваемого типа сообщений my_post_type:

$title = $post->post_title; query_posts( array ( 'post_type' => 'page', 'posts_per_page' => -1, 'my_taxonomy' => $title )); 

Это означает, что когда я перехожу к … / my_post_type / some_title, я вижу все страницы, которым присваивается «some_title» как my_taxonomy.

Теперь я хочу сделать то же самое в плагине вместо темы. Это означает (я думаю), что я должен использовать фильтр «запрос»? Я попытался сделать это:

 add_filter( 'request', 'alter_the_query' ); function alter_the_query( $request ) { $request['post_type'] = 'page'; $request['my_taxonomy'] = 'some_title'; // just hardcoded so far while testing $request['posts_per_page'] = -1; return $request; } 

Но он вообще не возвращает никаких страниц. Даже это не работает:

 add_filter( 'request', 'alter_the_query' ); function alter_the_query( $request ) { $request['post_type'] = 'page'; return $request; } 

Что я делаю неправильно, или как я могу достичь того же, что и мой, с моим вызовом query_posts ()?

Большое спасибо!

Solutions Collecting From Web of "В настоящее время с помощью query_posts () в моей теме – вместо этого нужно использовать фильтр запросов"

Код, который вы предоставили, фактически не распечатывает список страниц; он просто создает запрос для них. Предполагая, что у вас есть дополнительный код для их отображения, самый простой способ выполнить то, что вы хотите в плагине, – это создать этот список, а затем добавить их с the_content фильтра the_content . Я бы, вероятно, создал список страниц в одной функции, добавив эти страницы в the_content со второй функцией, добавленной в фильтр. Вот что должно помочь вам начать:

 function my_posts_list() { global $post; query_posts( array ( 'post_type' => 'page', 'posts_per_page' => -1, 'my_taxonomy' => $post->post_title )); // Build your HTML list of posts from the query. } function filter_the_content($content) { // Only filter the content if we're on a single 'my_post_type' page. if (is_singular('my_post_type')) { $postsList = my_posts_list(); $content = $postsList . $content; } return $content; } add_filter('the_content', 'filter_the_content'); 

Есть, конечно, много дополнительных вещей, которые вы могли бы сделать с этим, например, проверьте, нет ли списка сообщений не пустым.

WordPress обеспечивает отличный крюк, pre_get_posts для того, что я думаю, что вы пытаетесь сделать.

Вот как выглядит ваш код:

 add_action( 'pre_get_posts', 'alter_the_query' ); function alter_the_query() { if( is_main_query() && get_post_type() == 'my_post_type' ) { global $post; $title = $post->post_title; $query->set('post_type', 'page'); $query->set('posts_per_page', -1); $query->set('my_taxonomy', $title); } } 

Nacin и другие рекомендуют, чтобы pre_get_posts заменили использование query_posts() любом случае, поэтому, надеюсь, это query_posts() для вас и отправит вас в правильном направлении.