Шорткод для вывода цикла записей
Я работал над этим шорткодом, но безрезультатно...
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');
Я не получаю никакого вывода
Буду благодарен за помощь
Заранее спасибо
ОБНОВЛЕНИЕ

В приведенном выше коде есть множество проблем. Во-первых, 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"]
. Таким образом, шорткод можно применять для различных запросов.
Дополнительные материалы, если вам интересно:

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

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

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

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

Я не очень силен в использовании шорткодов, так как почти не применяю их, но вот мой вклад.
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');
