Есть ли в цикле Wordpress функция, подобная циклу Shopify?
Цикл Shopify позволяет вам чередовать вещи в цикле. Вот мой пример:
<div class="{% cycle 'first', 'second', 'third' %}">
{% include 'product-grid-item' %}
</div>
Мой вопрос, есть ли что-нибудь подобное для Wordpress? Я бы хотел иметь возможность циклически изменять какие-либо настройки, такие как имена классов, по мере печати каждого элемента в моем цикле.
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;
В ядро ничего не встроено, но легко сделать что-то подобное самостоятельно. Вот пример, который даст классы сообщений после подсчета-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.
Не совсем, но в 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;
}
Пс. Извините, я неправильно понял вопрос, не понял, что вы этого хотели точно то же самое с точки зрения числовой классификации.
Это один из моих любимых помощников в 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 ] ];
}