Шорткод для вывода цикла записей

25 нояб. 2011 г., 07:06:22
Просмотры: 18.7K
Голосов: 3

Я работал над этим шорткодом, но безрезультатно...

function loop_shortcode( $atts = '' ) {

'<div class="clear"></div>
<div class="childs grid_12"> 
 <?php
 $the_query = new  WP_Query( 
     array(
         "post_parent" => "8",
         "post_type" => "page",
         "posts_per_page" => 4,
         "sort_column"   => "menu_order"
     )
 ); ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
   <div id="service-hp">
       <?php the_post_thumbnail("home-thumb") ?>
       <h2 style="margin-bottom:5px"><?php the_title() ?></h2>
       <?php the_excerpt() ?>
       <a class="read-more" href="<?php the_permalink() ?>">узнать больше <img src="<?php bloginfo( "template_url" ); ?>/images/read-more.png"></a>
   </div> <!-- контейнер -->
<?php endwhile; ?>
<?php wp_reset_query() ?>
</div>';
 }

 function my_loop_shortcode( $atts ) {
     ob_start(); 
     loop_shortcode($atts);
     return ob_get_clean(); 
 }         

 add_shortcode('my_loop', 'my_loop_shortcode');      

Я не получаю никакого вывода

Буду благодарен за помощь

Заранее спасибо

ОБНОВЛЕНИЕ Проблема с выводом шорткода

3
Комментарии

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

Rutwick Gangurde Rutwick Gangurde
25 нояб. 2011 г. 07:17:20

Не понимаю, зачем минусовать мой вопрос... впрочем, такие люди всегда найдутся...

andresmijares andresmijares
25 нояб. 2011 г. 20:18:02

Я не ставил минус, чувак! Возможно, кто-то, кто не понял вопрос.

Rutwick Gangurde Rutwick Gangurde
26 нояб. 2011 г. 05:50:15
Все ответы на вопрос 2
4

В приведенном выше коде есть множество проблем. Во-первых, post_parent в аргументах запроса должен быть целым числом. Вы же присваиваете ему строку. Некоторые вызовы функций WordPress, такие как the_excerpt() и wp_reset_query(), пропускают завершающие точки с запятой. $atts — это ассоциативный массив атрибутов шорткода. Если вы хотите использовать атрибуты, их нужно извлечь в функции шорткода. Нет необходимости передавать их в функцию цикла, особенно учитывая, что вы их предварительно не извлекли. Кроме того, вы даже не пытаетесь их использовать.

Кроме того, я не вижу причин разделять это на две функции. Я бы также не включал прямую разметку в функции и использовал ob_get_clean, а просто echo или return нужный результат напрямую. Последние два варианта — это скорее личные предпочтения.

Тем не менее, вот код, который делает то, что вам нужно:

function andrew_loop_shortcode( $atts ) {
    extract( shortcode_atts( array(
        'parent' => 8,
        'type' => 'page',
        'perpage' => 4
    ), $atts ) );
    $output = '<div class="clear"></div><div class="childs grid_12">';
    $args = array(
        'post_parent' => $parent,
        'post_type' => $type,
        'posts_per_page' => $perpage,
        'sort_column'   => 'menu_order'
    );
    $andrew_query = new  WP_Query( $args );
    while ( $andrew_query->have_posts() ) : $andrew_query->the_post();
        $output .= '<div id="service-hp">'.
                   get_the_post_thumbnail('home-thumb').
                   '<h2 style="margin-bottom:5px">'.
                   get_the_title().
                   '</h2>'.
                   get_the_excerpt().
                   '<a class="read-more" href="'.
                   get_permalink().
                   '">узнать больше <img src="'.
                   get_bloginfo( 'template_url' ).
                   '/images/read-more.png" alt="Читать далее" title="Читать далее"></a></div><!--  ends here -->';
    endwhile;
    wp_reset_query();
    $output .= '</div>';
    return $output;
}
add_shortcode('andrewloop', 'andrew_loop_shortcode');

Строки 2–6 в приведенном выше коде не являются строго обязательными, но добавляют функциональность вашему шорткоду.

Если вы просто используете [andrewloop] на странице, он отобразит то, что вам нужно. Чтобы добиться только этого, можно статически задать аргументы запроса в функции шорткода. Однако благодаря строкам 2–6 эти значения теперь являются значениями по умолчанию для шорткода, но их можно изменять на лету без повторного изменения функции.

Теперь вы можете использовать, например, [andrewloop parent="6" perpage="3"]. Таким образом, шорткод можно применять для различных запросов.

Дополнительные материалы, если вам интересно:

25 нояб. 2011 г. 08:38:22
Комментарии

Привет, Johannes, я в основном использовал руководство для обучения, но похоже, оно не очень эффективно. Спасибо за ответ. Я попробовал, и вроде бы сработало, но выдает несколько ошибок, которые я не понимаю. Например, код ломается, потому что говорит, что get_the_permalink() не определена, а также странным образом выводит ссылку и вообще не учитывает теги H2. Как думаешь, что может вызывать эти ошибки?

andresmijares andresmijares
25 нояб. 2011 г. 20:35:03

Я понял, что в функции была ошибка — нужно использовать get_permalink, это исправило одну проблему. Но теперь главная сложность — отображение результатов: сначала функции, а потом все классы. Я прикреплю картинку к вопросу, чтобы ты увидел.

andresmijares andresmijares
25 нояб. 2011 г. 20:40:44

@andrewkthx Написал наспех, не проверив, извини. Отредактировал ответ, чтобы в будущем он был корректным (исправлено на get_permalink). Не совсем понимаю, в чем сейчас проблема — если тебя не устраивает разметка, просто измени цикл. Что касается внешнего вида — это вопрос стилей (т.е. CSS), и его нужно решать в таблицах стилей.

Johannes Pille Johannes Pille
25 нояб. 2011 г. 21:16:16

Еще раз спасибо, Johannes. Я имел в виду, что обрати внимание на странность - в коде указано '<h2 style="margin-bottom:5px">'. get_the_title() . '</h2>', но если посмотреть вывод в исходном коде, который я загрузил, видно что сначала выводится заголовок с результатом других функций, и только потом отображаются div'ы и теги. В остальном все работает отлично, это точно

andresmijares andresmijares
25 нояб. 2011 г. 21:43:36
0

Я не очень силен в использовании шорткодов, так как почти не применяю их, но вот мой вклад.

function loop_shortcode($atts, $content = null) {

    shortcode_atts(array(
        'post_parent' => 8,
            'post_type' => 'page',
            'posts_per_page' => 4,
            'sort_column' => 'menu_order'
    ), $atts);

    $the_query = new WP_Query();
    $the_query->query($atts);

    if ($the_query->have_posts()) : while ($the_query->have_posts()) :  
             $the_query->the_post(); ob_start(); ?>

    <div id="service-hp">
              <?php the_post_thumbnail('home-thumb') ?>
                     <h2 style="margin-bottom:5px"><?php the_title() ?></h2>
                                    <?php the_excerpt() ?>
       <a class="read-more" href="<?php the_permalink() ?>">узнать больше <img src="<?php bloginfo( "template_url" ); ?>/images/read-more.png" alt="Узнать больше" title="Узнать больше"></a>
        </div><!-- /#service-hp -->

 <?php endwhile; endif; wp_reset_query(); 
        $content = ob_get_contents(); ob_end_clean();

                       return $content;

 }

add_shortcode('myloop', 'loop_shortcode');
25 нояб. 2011 г. 08:21:47