Попытка написать мой первый короткий код, который отображает все заголовки постов в определенной категории. Но это не отображение фактических результатов, просто короткий код. Вот что у меня есть в файле functions.php моей дочерней темы:

function posts_in_cat() {
echo '<ul>';
query_posts('cat=3'); while (have_posts()) : the_post();
echo ('<li><a href="' . the_permalink() . '">' . the_title() . '</a></li>');
endwhile;
wp_reset_query();
echo '</ul>';
}
add_shortcode( 'display_posts_in_cat', 'posts_in_cat' );

А потом я вызываю короткий код, например, [display_posts_in_cat].

Любая помощь будет принята с благодарностью, когда я пытаюсь узнать это.

РЕДАКТИРОВАТЬ: Я получил его для отображения, но сама ссылка отображается перед заголовком в тексте. Кроме того, он не отображает более 10 названий, и я хочу, чтобы он отображал их все. Любые идеи...?? Спасибо.

1
user3512522 5 Апр 2017 в 02:13

2 ответа

Лучший ответ

Прежде всего, избегайте использования query_posts() - это неэффективно. Посмотрите этот ТАКИЙ ответ для худых.

Кроме того, шорткоды не должны использовать операторы echo. Только шорткоды возвращают текст. Проще говоря, WordPress имеет встроенный PHP, который говорит: «Когда этот конкретный шорткод введен в редактор, замените его текстом, возвращаемым из этой функции». Использование echo заставляет вас немедленно выводить эти операторы на экран, а не возвращаться в WordPress, чтобы он мог продолжить свой обычный процесс. Подробнее о WP Codex.

И, наконец, функции шорткода требуют $atts в качестве параметра.

Итак, со всем, что сказал, вот как я бы переписал вашу функцию:

<?php

function posts_in_cat( $atts ) {
    $atts = shortcode_atts( array(
        'cat' => '',
    ), $atts );

    if ( empty( $atts['cat'] ) ) {
        // If category provided, exit early
        return;
    }

    $args = array(
        'category' => $atts['cat'],
        // Disable pagination
        'posts_per_page' => -1
    );

    $posts_list = get_posts( $args );

    if ( empty( $posts_list) ) {
        // If no posts, exit early
        return;
    }

    $opening_tag = '<ul>';
    $closing_tag = '</ul>';
    $post_content = '';

    foreach ( $posts_list as $post_cat ) {
        $post_content .= '<li><a href="' . esc_url( get_permalink( $post_cat->ID ) )  . '">' . esc_html( get_the_title( $post_cat->ID ) ) . '</a></li>';
    }

    return $opening_tag . $post_content . $closing_tag;
}
add_shortcode( 'display_posts_in_cat', 'posts_in_cat' );

Я просто добавляю весь контент, который вы echo вводили в несколько переменных, а затем возвращаю их, конкатенированные, в конце. Кроме того, я добавил оператор if для досрочного выхода, если в категории нет сообщений. Таким образом, у вас не будет пустого элемента <ul>, загромождающего страницу.

Я также избежал выводов, которые вы можете прочитать о в Кодексе.

0
Community 13 Апр 2017 в 12:37

Пожалуйста, попробуйте это:

 function posts_in_cat() { ?>
<ul class="posts">
<?php query_posts('cat=3&showposts=50'); while (have_posts()) : the_post(); 
 ?>
    <li><a href='<?php the_permalink() ?>'><?php the_title(); ?></a></li>
<?php endwhile; ?>

<?php wp_reset_query(); ?>
  </ul>

  <?php

    }
    add_shortcode( 'display_posts_in_cat', 'posts_in_cat' );
0
Ajay Malhotra 5 Апр 2017 в 06:28