0

I am trying to get some help in PHP so I can add a class or ID to each individual item returned in a loop. I am using a piece of code (see below) to return taxonomies (locations). I have all my 32 locations returned perfectly and displayed on my site. However, I cannot individually style each location via css as there is no unique class associated with each of them.

Each block that is returned looks like this on the frontend

<div class="block">
<a href="http://example.com/location/new-york">
    <h2>
        <a href="http://example.com/location/new-york">
        Antrim
        <br>
        <span>(1 Farmer)</span>
        </a>
    </h2>

which repeats for all locations returns. As you can see there would be no way to actually style each individually which is what I require.

My code which returns the locations is as follows. I have tried googling and a few different ways to do it, but feel I am out of my league and thought I would ask the experts here for some help!

Thanks

<?php
global $woo_options;
$post_types_to_loop_through = array();
$posts_to_exclude = array();
$categories_panel_entries = $woo_options['woo_categories_panel_entries'];
$more_listings_setting = $woo_options['woo_more_listings_area'];
$wp_custom_post_types_args = array();
$wp_custom_post_types = get_post_types($wp_custom_post_types_args,'objects');
foreach ($wp_custom_post_types as $post_type_item) {
$cpt_test = get_option('woo_categories_panel_post_types_'.$post_type_item->name);
if ($cpt_test == 'true') {
    $cpt_nice_name = $post_type_item->labels->name;
    $cpt_has_archive = $post_type_item->has_archive;
    $post_types_to_loop_through[$post_type_item->name] = array('nice_name' => $cpt_nice_name, 'has_archive' => $cpt_has_archive);
}
}

$section_counter = 0;

foreach ($post_types_to_loop_through as $post_type_item => $post_type_item_nice_name) {
$taxonomies = array('location');
$block_counter = 0;
$args = array('orderby' => 'name', 'order' => 'ASC');
?>

<div id="location">

    <?php 
    // NEW AND IMPROVED QUERY
    $all_terms = get_terms( $taxonomies, $args );

    $block_counter = 0;
    foreach ( $all_terms as $all_term) {

        $tax_test = get_option('woo_categories_panel_taxonomies_'.$all_term->taxonomy);

        if ( ($tax_test == 'true') && ($block_counter < $categories_panel_entries) ) {

            $post_images = array();
            $posts_aray = array();

            $term_name = $all_term->name;
            $term_slug = $all_term->slug;
            $term_id = $all_term->term_id;
            $term_link = get_term_link( $all_term, $all_term->taxonomy );
            $counter_value = $all_term->count;
            ?>
            <div class="block">
                <a href="<?php echo $term_link; ?>">
                <?php
                    $block_counter++;



                    if ( $post_id > 0 ) {

                        // If a featured image is available, use it in priority over the "image" field.
                        if ( function_exists( 'has_post_thumbnail' ) && current_theme_supports( 'post-thumbnails' ) ) {

                            if ( has_post_thumbnail( $post_id ) ) {

                                $_id = 0;
                                $_id = get_post_thumbnail_id( $post_id );

                                if ( intval( $_id ) ) {

                                    $_image = array();
                                    $_image = wp_get_attachment_image_src( $_id, 'full' );

                                    // $_image should have 3 indexes: url, width and height.
                                    if ( count( $_image ) ) {

                                        $_image_url = $_image[0];

                                        woo_image('src=' . $_image_url . '&key=image&width=139&height=81&link=img');

                                    } // End IF Statement

                                } // End IF Statement

                            } else {

                                woo_image('id='.$post_id.'&key=image&width=139&height=81&link=img');

                            } // End IF Statement

                        } else {

                            woo_image('id='.$post_id.'&key=image&width=139&height=81&link=img');

                        } // End IF Statement

                    } else {
                        // Fallback
                        woo_taxonomy_image($post_images,$term_link);

                    } // End IF Statement
                    $php_formatting = "m\/d\/Y";
                    $post_item_date = strtotime($post_date_raw);
                ?>
                    </a>
                <h2><a href="<?php echo $term_link; ?>"><?php echo $term_name ?> <br/><span>(<?php echo $counter_value; ?> Farmers)</span></a></h2>
                <p><?php _e('Latest listing ', 'woothemes') ?><?php echo date($php_formatting,$post_item_date); ?></p>
            </div><!-- /.block -->
            <?php
            if ( $block_counter % 5 == 0 ) {
            ?>
                <div class="fix"></div>
            <?php
            } // End IF Statement   

        } // End IF Statement

        ?>
        <?php


    } // End For Loop

    ?>

    <div class="fix"></div>

    <?php if ( $block_counter > 0 ) { ?>




    <?php } else { ?>    
    <p class="woo-sc-box note" style="margin:20px 20px;"><?php _e('Please add some posts in order for this panel to work correctly. You must assign the post to these taxonomies for it to work.','woothemes'); ?></p>
    <?php } ?>

</div><!-- /.listings -->

<div class="fix"></div>

Update Thanks to some of the help I have implemented this code, but still can't get it to work!

I added this to the global variables on line 8 $i = 0; // initialise incrementing variable

I then added this just before the div as u can see with the extra class I am trying to echo

// I added this line as suggested just before my div
<?php foreach ( $all_terms as $all_term) { ?>

// I then added a new class but I was not sure how to write this
<div class="block" class="<?php echo "post-" . $i; ?>">

Just before the closing div tag (about 100 lines later) I add the closing code

 $i++; // increment it
}
Redwall
  • 1,010
  • 5
  • 30
  • 55
  • Where do you need the unique styling applied? The div? The link? The span? – Patrick Q Sep 11 '12 at 21:24
  • Hi Patrick, the div would be ideal – Redwall Sep 11 '12 at 21:29
  • 2
    Why don't you have a global variable and a class like group1, group2 and so on by incrementing the value while adding one.. – Sushanth -- Sep 11 '12 at 21:30
  • @sushanthreddy - sounds like a solution i am after to have incrementing class names for each div returned, but i dont know how to actually do it correctly in my code above...any pointers would be greatly appreciated... – Redwall Sep 11 '12 at 21:33

1 Answers1

1

As @sushanth reddy said, it should really be as simple as

$i = 0; // initialise incrementing variable
foreach ( $all_terms as $all_term) {
    // rest of your code; use $i when you want your incrementing ID / class

    $i++; // increment it
}
stealthyninja
  • 10,343
  • 11
  • 51
  • 59
  • thanks for the answer, and awesome if I can get this working! I am trying my best to follow how to implement this into my code and have attempted but can't get it to work. I get I should add the first part to the top of my code ( I think) but where do I add the 2nd part of the code? I want this div to have the incrementing class `
    ` in my code..thanks
    – Redwall Sep 11 '12 at 22:06
  • Hi - I have made an edit to the question above with my attempt to implement your code. It is not working and you can prob tell why...Would appreciate if you can take a look and let me know what you might think I am doing wrong here...cheers – Redwall Sep 11 '12 at 22:36
  • Replace `
    ">` with `
    `. Check the rendered source and it should now be `
    `, etc.
    – stealthyninja Sep 12 '12 at 06:20
  • great, I tried that but I am getting a strange result. I have 32 locations and now each single location is getting returned 32 times each with the updated class. See here for what the HTML looks like. http://pastie.org/4706390 It seems like the class is getting assigned to each individual location X (times) the number of taxonomies (locations I have in my system which is 32) - I have also put up my latest code here which gives this result http://pastie.org/4706347 - My changes are line 8, 51,52,112,114 - Thanks – Redwall Sep 12 '12 at 07:59
  • 1
    You've got `foreach ( $all_terms as $all_term) {` (Ln. 52) within `foreach ( $all_terms as $all_term) {` (Ln. 35). In other words, the same loop twice. Comment out Ln. 52 and Ln. 114. – stealthyninja Sep 12 '12 at 09:50