创建公式以根据字段长度添加类

时间:2016-04-27 15:00:27

标签: php wordpress twitter-bootstrap advanced-custom-fields

我需要了解如何创建一个公式,根据显示的div数确定要添加到div元素的类。

目前我正在使用ACF创建一个转发器字段,该字段将有一个子字段链接到基于管理员选择的页面。这些字段将基于while循环显示在它们自己的div中。我正在使用诸如col-sm-12col-sm-6col-sm-4之类的Bootstrap类。

while( have_rows( 'project_repeater' ) ): the_row();

    $post_object = get_sub_field( 'project_type' );

    $count = count( get_field('project_repeater') ); // Output 4

    $mod = $count % 3; // Output 1

    if( $post_object ):

        $post = $post_object;
        setup_postdata( $post );

        $classname = '';

        if( $mod == 1 ) {

            if( $count == 1 ) {
                $classname .= 'col-sm-12';
            } elseif( $count == 4 ) {
                $classname .= 'col-sm-6';
            } else { // $count == 7
                $classname .= 'col-sm-4';
            }

        } elseif( $mod == 2 ) {

            if( $count == 2 ) {
                $classname .= 'col-sm-6';
            } elseif( $count == 5 ) {
                // $classname .= 'col-sm-12';
            } else { // $count == 8
                // $classname .= 'col-sm-4';
            }

        } else { // $mod == 0
            $classname .= 'col-sm-4';
        }

        ?>
        <div class="project-cat <?php echo $classname; ?>">
            <a href="<?php the_permalink( $post ); ?>">
                <h5><?php the_title(); ?></h5>
                <p><?php the_excerpt(); ?></p>
            </a>
        </div>
        <?php

        wp_reset_postdata();
    endif;

endwhile;

现在$count == 5,我需要它将前3个div设置为col-sm-4,然后将最后2个div设置为col-sm-6(这将按此顺序显示div彼此重叠:3,2)。

$count == 7时,它需要与$count == 5时相似,但前3个为col-sm-4,后4个为col-sm-6(3,2,2) )

$count == 8时,如果我将前6个作为col-sm-4,将后2作为col-sm-6(3,3,2),则会略有不同。

不是在if语句之后使用if语句,而是必须有更好的方法来创建一个公式,该公式将根据显示的div元素的数量来确定要使用的类。

2 个答案:

答案 0 :(得分:1)

这是更多的数学和逻辑问题,而不是编码问题。

为什么不1.获得元素数量。

除以3并将结果置于最低点。所以你可以知道你将拥有多少行col-xx-4。

假设您共有14个项目。比拳头12元素应该有col-md-4。 如果你绕14/3 = 4 剩下的是14 - (3 * 4)= 2所以如果剩下的是1而不是你可以使用col-md-12类,如果它是2而不是col-md-6。

所以在输出时你将class col-md-4分配给前12个元素(round 14/3 = 4)然后根据它们的数量为其余元素(14 - (3 * 4)= 2)分配合适的类(1或2)

你觉得它对你有用吗?

序列

设置一些变量

$ total =项目总数。您只需使用计数器运行循环即可。

$md4-limit = floor($total/3)*3;
$remaining = $total - $md4-limit;

然后当你运行循环时,使用$ i并为每个元素增加该值并在输出检查时

if ($i <= $md4-limit) {
$class = ' col-md-4 ';
} else {
 if($remaining == 1) { $class = ' col-md-12 '; }
 if($remaining == 2) { $class = ' col-md-6 '; }

}

然后将类调用到列html中,类应为:)

另一个选项是将行宽选项添加到ACF转发器字段,并在后端构建网格。

答案 1 :(得分:0)

感谢你,尼克,你帮我解决了很多问题,我确实发现了我做错了什么以及为什么它没有像你说的那样展示。我没有正确定义$i。但这里是代码,一切正常!再次感谢你尼克!

$count = count( get_field('project_repeater') );

$limit = floor( $count / 3 ) * 3;

$remaining = $count - $limit;

$i = 0;

while( have_rows( 'project_repeater' ) ): the_row();

    $post_object = get_sub_field( 'project_type' );

    if( $i < $limit ) {
        $classname = 'col-sm-4';
    } else {
        if( $remaining == 1 ) {
            $classname = 'col-sm-12';
        }
        if( $remaining == 2 ) {
            $classname = 'col-sm-6';
        }
    }

    if( $post_object ):

        $post = $post_object;
        setup_postdata( $post );

        ?>
        <div class="project-cat <?php echo $classname; ?>">
            <a href="<?php the_permalink( $post ); ?>">
                <h5><?php the_title(); ?></h5>
                <p><?php the_excerpt(); ?></p>
            </a>
        </div>
        <?php

        wp_reset_postdata();
    endif;

    $i++;

endwhile;