2012-04-22 3 views
0

Я сделал короткий код внутри своего плагина, который отлично работает. Штрих-код должен принимать некоторые параметры и создавать настраиваемый цикл с выходом.wordpress query (shortcode) возвращает всегда первое сообщение

Одним из параметров, сколько сообщений выхода контура для ($ маркеров)

$args=array(
       'meta_key'=>'_mykey', 
       'post_status'=>'publish', 
       'post_type'=>'post', 
       'orderby'=>'date', 
       'order'=>'DESC', 
       'posts_per_page'=>$markers, 

); 

    $wp_query = new WP_Query(); 
      $wp_query->query($args); 

if ($wp_query->have_posts()) : while (($wp_query->have_posts())) : $wp_query->the_post(); 

// do the loop using get_the_id() and $post->id 

endwhile;endif; 
wp_reset_query();//END query 

На occations мне нужно будет иметь данные со всех постов ($markers = '-1'), а иногда только один ($markers = '1') или Muliple ($markers = 'x').

Все эти работы отлично работают на отдельных страницах/сообщениях, но моя проблема заключается в том, что когда эта функция находится в месте, где у меня есть более одного сообщения (! Is_single) и ($ markers = '1'), он всегда будет возвращать данные для Последнее сообщение, а не для правильного один .. (например, в WordPress тема по умолчанию, где бы display10 посты - все они будут те же данные)

это, очевидно, проблема $post->ID - но как могу ли я иметь правильный идентификатор сообщения при выполнении настраиваемого цикла OUTSIDE wp loop?

Я попытался ovverride проблемы

global $post; 
$thePostIDtmp = $post->ID; //get the ID before starting new query as temp id 
$wp_query = new WP_Query(); 
$wp_query->query($args); 
// Start Custom Loop 

if (!is_single()){ 
$post_id_t = $thePostIDtmp;} 
else { 
$post_id_t = $post->ID;} 

, а затем использовать $post_id_t - но это было не похоже на работу, Должен ли я не использовать get_the_id()? или я не должен использовать запрос (и использовать get_posts)?

Любые идеи/решения/мысли ??

ответ

1

Я бы использовал query_posts (http://codex.wordpress.org/Function_Reference/query_posts) вместо того, чтобы переопределять объект $ wp. Вы должны иметь возможность включать столько петель на странице, сколько хотите. Если у вас есть проблемы с этим, вы можете использовать: http://codex.wordpress.org/Function_Reference/wp_reset_query перед тем, как позвонить.

Я нахожу это: http://blog.cloudfour.com/wordpress-taking-the-hack-out-of-multiple-custom-loops/ отнимает немного боли.

+0

спасибо за ответ - я подозревал, что мне нужно будет использовать query_posts() или get_posts(), похоже, это не помогает в моем случае, я не уверен, почему. –

+0

вы пробовали эхом отослать сообщение id поэтому вы можете видеть, когда он изменится. Если вы повторите это в инструкции if, и когда вы установите переменную tmp, это может помочь вам увидеть, что происходит. – matpol

0

В WordPress есть два типа сообщений с запросом: те, которые меняют основной цикл, и те, которые этого не делают. Если вы хотите изменить основной цикл, как тот, который используется для отображения страниц с архивами категорий, используйте query_posts. Это позволит вам сделать именно это. Удалите, измените и добавьте параметры запроса по умолчанию, чтобы изменить результат типичной страницы. query_posts имеет некоторые drawbacks.

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

Чтобы сделать это, создайте новый объект WP_Query, который будет строить свой собственный цикл независимо от основного контура следующим образом:

// The Query 
$the_query = new WP_Query($args); 

// The Loop 
while ($the_query->have_posts()) : $the_query->the_post(); 
    echo '<li>'; 
    the_title(); 
    echo '</li>'; 
endwhile; 

// Reset Post Data 
wp_reset_postdata(); 

Тогда есть get_posts(), который похож на младший брат WP_Query. На мой взгляд, он имеет более простой интерфейс и возвращает массив с результатами, с которыми легче работать. Это выглядит следующим образом:

$myposts = get_posts($args); 
foreach($myposts as $post) : setup_postdata($post); 
    echo "<li>"; 
    the_title(); 
    echo "</li>"; 
endforeach; 

Внутри тегов шаблона Еогеасп как get_the_id() будет работать.

+0

Спасибо. Я рассмотрю предложенные вами методы. моя проблема заключается не в том, что запрос не работает - моя проблема в том, что он возвращает сообщение FIRST снова и снова. в основном - внутри «нормального» цикла wp, в содержимом - я выполняю свой короткий код, но если я установил «posts_per_page» => 1, он всегда будет возвращать первый (тот же) пост. get_the_id() работает, а также $ post-> ID - но они всегда возвращают значения для одного и того же сообщения ... в противном случае на других страницах нет проблемы (потому что цикл wordpress всегда равен только 1 ..). –

+0

«Моя проблема заключается не в том, что запрос не работает - моя проблема в том, что он возвращает сообщение FIRST снова и снова« хорошо для меня. Это звучит так, как будто ваш запрос не работает;) Просто держитесь подальше от основного запроса. Создайте новый объект WP_Query или используйте get_posts(), и у вас не будет проблем. –

+0

ну, к сожалению, мне нужно получить АФК сейчас, но я постараюсь как можно скорее. Мой запрос работает нормально во всех случаях, кроме описанного. Я попытаюсь объяснить, у меня есть 2 примера сообщений, у одного есть $ markers = -1 и другие маркеры = 1. если я использую get_posts - первый дает мне точные данные (для post_meta), а второй отлично работает, если я перехожу на новый пост-объект - первый работает отлично, а второй дает первый маркер первый пост как метаданные. Я знаю, что это немного запутанно, я попытаюсь опубликовать пример, как только вернусь. –