Каков лучший метод для создания Ваших собственных циклов Wordpress?

Вы можете:

1) перебрать массив, построить карту частот из чисел

2) взять и отсортировать ключ карты частот в порядке возрастания

[116 ] 3) построить новый массив из информации в карте частот

const arr = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20];

const obj = arr.reduce((acc, c) => {
  return acc[c] = (acc[c] || 0) + 1, acc;
}, {});

// {"1":4,"2":3,"4":1,"5":1,"10":1,"20":2,"391":1,"392":1,"591":1}

const keys = Object.keys(obj).sort((a, b) => a - b).map(Number);

// [1,2,4,5,10,20,391,392,591]

const out = keys.map((key) => {
  return obj[key] > 1 ? Array(obj[key]).fill(key) : key;
});

// [[1,1,1,1],[2,2,2],4,5,10,[20,20],391,392,591]

console.log(JSON.stringify(out));

8
задан meleyal 20 February 2009 в 16:09
поделиться

3 ответа

Я использовал и WP_Query и get_posts. На одном из моих шаблонов боковой панели я использую следующий цикл для показывания сообщений от конкретной категории при помощи пользовательских полей с ключом 'category_to_load', который содержит краткий заголовок категории или название категории. Реальная разница прибывает в реализацию любого метода.

get_posts метод похож так в некоторых моих шаблонах:

<?php    
    global $post;
    $blog_posts = get_posts( $q_string );
    foreach( $blog_posts as $post ) : 
    setup_postdata( $post );
?>
    <div class="blog_post">
        <div class="title">
            <h2>
                <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
            </h2>
            <span class="date"><?php the_time( 'F j, Y' ); ?> by <?php the_author(); ?></span>
        </div>
        <?php the_excerpt(); ?>
    </div>
    <?php endforeach; 
?> 

Где WP_Query реализация похожа на это:

$blog_posts = new WP_Query( 'showposts=15' );

while ( $blog_posts->have_posts() ) : $blog_posts->the_post(); ?>

    <div <?php post_class() ?> id="post-<?php the_ID(); ?>" class="blog_post">
        <div class="title">
            <h2>
                <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a>
            </h2>
            <span class="date"><?php the_time( 'F jS, Y' ) ?> <!-- by <?php the_author() ?> --></span>
        </div>
        <div class="entry">
            <?php the_content(); ?>
        </div>
        <p class="postmetadata"><?php the_tags( 'Tags: ', ', ', '<br />' ); ?> Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
    </div>

<?php endwhile; ?>

Основное различие - то, что Вы не должны сбрасывать глобальную переменную $post, и Вы также не должны настраивать данные сообщения путем вызова setup_postdata ($post) на каждом объекте сообщения при использовании WP_query. Можно также использовать прекрасный have_posts () функция на функции WP_Query, которая не является доступным использованием get_posts ().

Вы не должны использовать query_posts () функция, если Вы действительно не значите для того, потому что это изменяет основной цикл для страницы. См. документы. Таким образом, если Вы создаете специальную страницу для отображения блога на, затем звонить query_posts может испортить цикл страницы, таким образом, необходимо использовать WP_Query.

Это - просто мои два цента. Мое окончательное предложение, Вашим предпочтительным вариантом должен быть WP_Query.

- Chris

6
ответ дан 5 December 2019 в 17:41
поделиться

Из документов WP для get_posts:

get_posts () может также взять параметры, что query_posts () может, так как обе функции теперь используют тот же код запроса базы данных внутренне.

Единственная разница между двумя функциями - то, что get_posts возвращает массив с записями сообщения, в то время как query_posts хранит записи в объекте запроса для извлечения шаблонными функциями (has_posts, the_post, и т.д.).

Они оба используют объект WP_Query выполнить запрос.

Создание второго цикла охвачено в документах Wordpress. Существуют некоторые ссылки там для других примеров нескольких циклов. Вы заметите, что все делают это по-другому, но они все кажутся довольными своими результатами.

3
ответ дан 5 December 2019 в 17:41
поделиться

WP использует для основного цикла объект с именем $wp_query. Обычно мы не видим этот объект, потому что он скрыт за have_posts() и the_post(), которые являются обёртками только для $wp_query->have_posts() и $wp_query->the_post()

Если вы хотите модифицировать основной цикл, то используйте query_posts() перед циклом.

Если необходимо изменить цикл, то можно повторно использовать объект $wp_query, используя query_posts() перед новым циклом. При необходимости это можно сделать много раз.

Если по каким-либо причинам вам необходимо оставить объект $wp_query около THEN, то вы должны использовать WP_Query. И конечно, поскольку have_posts() и the_post() являются обертками для объекта $wp_query, их нельзя использовать с объектом WP_Query. Вам лучше использовать $your_query_obj->have_posts(), т.е.

$sidebar= WP_Query('category_name= sidebar');

while( $sidebar->have_posts() ): $sidebar->the_post();
  the_title();
  the_content();
endwhile;

Хороший случай, когда WP_Query может быть лучше, чем query_posts() - это левая боковая панель. Так как цикл кода боковой панели, вероятно, будет расположен поверх основной, то вызов query_posts() изменит объект $wp_query, а также изменит основной цикл. В этом случае для использования request_posts() в коде боковой панели также необходимо использовать query_posts() перед основным циклом, чтобы запросить соответствующее содержимое для этого цикла.

Таким образом, использование WP_Query для этого случая сохранит $wp_query и, следовательно, основной цикл нетронутым.

Но опять же, для обычного случая query_posts() красивый способ запросить ваше содержимое:

query_posts('category_name=blog');

while( have_posts() ): the_post();
  the_title();
  the_content();
endwhile;
1
ответ дан 5 December 2019 в 17:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: