2013-11-01 1 views
0

У меня возникли трудности с этими проблемами, так как я не могу понять это. Я использую 2 контура WP_Query для пользовательских типов сообщений (слайдер и портфолио) на одной странице. Я также создал пользовательский мета-ящик для пользовательских типов сообщений.2 Петли WP_Query для пользовательских типов сообщений на той же странице

Так вот код для index.php, который Im, используя в качестве шаблона Home для отображения слайдера и портфельные пунктов:

<?php 
/* 

    Template Name: Home 

*/ 
?> 
<?php get_header(); ?> 

    <div id="header-container"> 
     <div id="header"> 

      <?php rm_slider(); ?> // This is where Im calling slider function to display the slider. 

     </div> 
    </div> 

    <div id="content"> 
     <div class="container"> 

      <?php $loop = new WP_Query(

       array(
        'post_type' => 'portfolio', 
        'posts_per_page' => -1 
       )); 
      ?> 

      <?php if ($loop->have_posts()) { ?> 

      <ul class="services"> 

       <?php while ($loop->have_posts()) : $loop->the_post(); ?> 

        <li> 
         <?php if (has_post_thumbnail()) : the_post_thumbnail(); ?> 

          <?php else: ?> 

           <p>No portfolio image</p> 

         <?php endif; ?> 

         <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3> 

         <p>Client: <?php echo get_post_meta($post->ID, '_project_client', true); ?></p> 
         <p>Client website: <?php echo get_post_meta($post->ID, '_project_client_url', true); ?></p> 
        </li> 

       <?php endwhile; } ?> 

       <?php wp_reset_query(); ?> 

    <?php get_footer(); ?> 

А вот код slider.php:

<?php 

// create slider markup 
function rm_slider() { 

    $slider_loop = new WP_Query(

     array(
      'post_type' => 'slider', 
      'posts_per_page' => -1 
     )); 

    if ($slider_loop->have_posts()) { ?> 

     <div id="slider"> 
      <div class="slider-container"> 

       <?php while ($slider_loop->have_posts()) : $slider_loop->the_post(); ?> 

         <div> 

          <?php if (has_post_thumbnail()) : the_post_thumbnail(); ?> 

          <?php else: ?> 

           <p>No slider image</p> 

          <?php endif; ?> 

           <div class="slide-info"> 
            <h2><?php the_title(); ?></h2> 
            <?php the_content(); ?> 
           </div> 

          <?php 

           $slide_url = get_post_meta($post->ID, '_slide_url', true); 

           if ($slide_url != '') { ?> 

            <a href="<?php echo $slide_url; ?>" class="more-info"><?php echo $slide_url; ?></a> 

           <?php } else { echo 'empty?'; ?> 

          <?php 

           } 

          ?> 

         </div> 

       <?php endwhile; ?> 

      </div><!-- .slider-container --> 
     </div><!-- #slider --> 

    <?php } 

    wp_reset_query(); 
} 

?> 

Я уверен, что фактический контент из пользовательских мета-полей есть, потому что, когда я использую только 1 цикл, он отображается отлично. Но при использовании обоих циклов он отображает только пользовательскую мета-запись только для раздела портфолио. Я борюсь с этой проблемой весь день, пожалуйста, помогите мне! Спасибо :)

+0

Tough один, я хотел бы добавить отладочные операторы внутри функции rm_slider(), чтобы выяснить, в каком что функция не работает, если она действительно вызвана. – phil

+0

Как мне это сделать? Im noob в PHP :) Также работает решение, предоставляемое @Joe. –

ответ

1

Странно, попробуйте это изменить:

$slide_url = get_post_meta($post->ID, '_slide_url', true); 
echo get_post_meta($post->ID, '_project_client', true); 

для этого:

$slide_url = get_post_meta(get_the_ID(), '_slide_url', true); 
echo get_post_meta(get_the_ID(), '_project_client', true); 

Вы также могли бы попытаться получить все после мета просто чтобы увидеть, если его все там.

$meta = get_post_meta(get_the_ID()); 
print_r($meta); // prints the meta array to the screen, check your data is there. 
+0

Спасибо @Joe Я забыл написать, что я попробовал распечатать get_post_custom и да, данные есть. Это то, что я получаю: Массив ([_edit_last] => Массив ([0] => 1) [_edit_lock] => Массив ([0] => 1383347235: 1) [_slide_url] => Массив ([0 ] => что-то.com)) Затем я пробую то, что вы предложили, и оно работает. Я знал, что есть другой способ получить ID, но я забыл и пытался что-то вроде $ post_ID, который не работал. Но это работает отлично. Не могли бы вы объяснить мне, если это возможно, как это работает и почему $ post-> ID не работает, но get_the_ID() работает? Спасибо :) –

+0

Я не уверен на этом на 100%. Я думаю, когда вы вызываете '$ loop-> the_post();' он заставляет определенные функции работать как 'the_title()' и 'the_ID()' Я обнаружил, что он также останавливает объект $ loop от работы, как это было бы без вызова 'the_post();'. Я думаю, причина, по которой '$ post-> ID' не работает, заключается в том, что она должна быть' $ loop-> ID' и '$ slider_loop-> ID' – Joe

+0

Я не очень понял, потому что я не очень хорош в PHP, но также chaning get_the_ID to $ loop-> ID работает. Не уверен, что это то, что вы имели в виду. Так что еще раз спасибо за помощь :) У меня есть еще одна вещь, не связанная с этим, я хочу, чтобы ползунок был доступен только в WP admin. Потому что теперь вы можете перейти на mysite.com/slider/slide-1, и он покажет контент. Настройка public -> false устранит эту проблему, но затем Slider исчезнет из меню администратора. Мне удалось показать его, используя show_ui, show_in_menu и т. Д., Но вот проблема при создании нового слайда в блоке slug, который показывает URL-адрес, исчезает. –

1

Насколько я знаю, после каждого WP_Query() вы должны использовать:

wp_reset_postdata(); 

НЕ wp_reset_query();. Попробуйте это.

wp_reset_query() восстанавливает $wp_query и данные глобального сообщения в исходный основной запрос. Эта функция должна вызываться после query_posts(), если вы должны использовать эту функцию. Как отмечено в приведенных ниже примерах, настоятельно рекомендуется использовать фильтр pre_get_posts для изменения параметров запроса до того, как запрос будет выполнен.

и

wp_reset_postdata() используется для восстановления глобальной переменной $post основного цикла запроса после запроса вторичного контура с использованием нового WP_Query. Он восстанавливает переменную $ post текущей записи в основном запросе.

И я предлагаю вам попробовать изменить возможное избыточное имя переменного как $loop к чему-то, как $portfoliowLoop и т.д.

+0

Я пробовал, что уже, но это не сработало. Теперь я изменил wp_reset_query на wp_reset_postdata, но все равно ничего. –

+0

Я считаю, что вам нужно всего лишь сделать wp_reset_query, если вы используете query_posts. Вы должны быть в безопасности, если каждый раз используете новый WP_Query(). Дальнейшее чтение: http://wordpress.stackexchange.com/questions/1753/when-should-you-use-wp-query-vs-query-posts-vs-get-posts – phil

Смежные вопросы