Есть ли в цикле Wordpress функция, подобная циклу Shopify?


Цикл Shopify позволяет вам чередовать вещи в цикле. Вот мой пример:

    <div class="{% cycle 'first', 'second', 'third' %}">
      {% include 'product-grid-item' %}
    </div>

Мой вопрос, есть ли что-нибудь подобное для Wordpress? Я бы хотел иметь возможность циклически изменять какие-либо настройки, такие как имена классов, по мере печати каждого элемента в моем цикле.

 1
Author: Olly F, 2012-05-23

4 answers

Короткий ответ, нет.

Но это довольно крутая функция!

Чтобы создать что-то подобное в WordPress, вам нужно будет написать какой-то итератор на PHP и заставить его выполнять логику за вас. Например:

$classes = array( 'first', 'second', 'third' );
$iteration = 0;
if ( have_posts() ) : while ( have_posts() ) : the_post();
    $iteration = $iteration >= count($classes) ? 0 : $iteration;
    $class = $classes[$iteration];
    ?>

    <div class="<?php echo $class; ?>">
        <!-- Whatever other stuff you need to do -->
    </div>

    <?php
    $iteration++;
endwhile; endif;
 0
Author: EAMann, 2012-05-23 22:07:05

В ядро ничего не встроено, но легко сделать что-то подобное самостоятельно. Вот пример, который даст классы сообщений после подсчета-1, после подсчета-2, после подсчета-3, после подсчета-1, ....2, ....3, ...1, и т.д.:

<?php
\\ start the counter at 1
$counter = 1;
\\ start the loop
while->have_posts() : the_post();
\\ figure out our count
$count = 'post-count-' . $counter % 3;
?>
<article <?php post_class( $count ); ?>>
    \\ some more stuff like the title and content
</article>
<?php
\\ advance the counter
$counter++;
\\ keep looping until the end
endwhile;
?>

Если вам нужны простые классы английского языка, вам понадобится оператор if или switch для установки $count. В этом примере также используется post_class, который дает вам некоторые другие полезные классы.

ДОБАВЛЕНИЕ: Я должен добавить, что если вам не нужна обширная поддержка браузера (:nth-дочерний() Селектор CSS действительно является правильным решением, если вам нужны классы исключительно для стилизации. jQuery также поддерживает этот селектор, и вы можете использовать его для добавления классов после загрузки страницы, если вам нужна поддержка браузера лучше, чем CSS.

 0
Author: mrwweb, 2012-05-23 22:28:37

Не совсем, но в WordPress есть body_class и post_class, которые по умолчанию предоставляют вам пользовательские селекторы, которые в дальнейшем можно настроить с любым именем или переменной по вашему выбору.

Http://codex.wordpress.org/Function_Reference/body_class
http://codex.wordpress.org/Function_Reference/post_class

Вы также можете использовать их в качестве фильтра, например;

add_filter('body_class','my_class_names');

function my_class_names($classes) {
    // Some conditional
    $classes[] = 'my-custom-class-name';
    // return the $classes array
    return $classes;
}

Пс. Извините, я неправильно понял вопрос, не понял, что вы этого хотели точно то же самое с точки зрения числовой классификации.

 0
Author: Wyck, 2012-05-23 22:44:50

Это один из моих любимых помощников в Rails (на который Shopify создала ссылку на своем языке шаблонов Liquid). Я написал функцию, похожую на эту, для WordPress, наслаждайтесь:

/**
 * Cycle/alternate unlimited values of a given array.
 * For instance, if you call this function five times with wp_cycle('three', 'two', 'one'),
 * you will in return get: three two one three two. This is useful for loops and allows you to
 * cycle classes.
 * For instance, foreach ($posts as $post) { echo '<div class="'.wp_cycle('odd','even').'">...</div>'; }
 * would alternate between <div class="odd">...</div> and <div class="even">...</div>. Neat, huh?
 * You can pass any data as args and as many as you want, e.g. wp_cycle(array('foo', 'bar'), false, 5, 'silly')
 *
 * @param mixed Accepts unlimited args
 * @return mixed
 * @author Matthew Boynes
 */
function wp_cycle() {
    global $wp_cycle_curr_index;
    $args = func_get_args();
    $fingerprint = substr( sha1( serialize( $args ) ), 0, 7 );
    if ( !is_array( $wp_cycle_curr_index) ) $wp_cycle_curr_index = array();
    if ( !isset( $wp_cycle_curr_index[ $fingerprint ] ) || !is_int( $wp_cycle_curr_index[ $fingerprint ] ) ) $wp_cycle_curr_index[ $fingerprint ] = -1;
    $wp_cycle_curr_index[ $fingerprint ] = ++$wp_cycle_curr_index[ $fingerprint ] % count( $args );
    return $args[ $wp_cycle_curr_index[ $fingerprint ] ];
}
 0
Author: Matthew Boynes, 2013-05-27 14:56:33