0

I have created a post filter with a custom breadcrumb using AJAX. So now theres quite a bit of HTML being returned from the functions.php file. Someone told me that I should not be doing this but they did not tell me why.


Questions

  1. Other than making my functions.php look messy are there any other disadvantages to what I have done?
  2. Would this be considered bad practice?
  3. Could this slow the website down?

functions.php page

add_action('wp_ajax_soldfilter', 'sold_filter');
add_action('wp_ajax_nopriv_soldfilter', 'sold_filter');

function sold_filter(){
    $posts = array(
        'posts_per_page'    =>  -1,
        'post_type'         =>  'property',
        'orderby'           =>  'date',
        'meta_key'          => 'property_status',
        'meta_value'        => 'Sold'
    );

    $posts['meta_query'] = array( 'relation' => 'AND' );
    // price filtering

    if($_POST['min_price'] && !empty($_POST['min_price'])){
        $min_price = $_POST['min_price'];
    }else{
        $min_price = 0;
    }

    if($_POST['max_price'] && !empty($_POST['max_price'])){
        $max_price = $_POST['max_price'];
    }else{
        $max_price = 10000000;
    }

    $posts['meta_query'][] = array(
        'key'       => 'property_price',
        'type'      => 'NUMERIC',
        'value'     => array($min_price, $max_price),
        'compare'   => 'BETWEEN'
    );

    // bed filtering

    if($_POST['min_beds'] && !empty($_POST['min_beds'])){
        $min_beds = $_POST['min_beds'];
    }else{
        $min_beds = '1'; 
    }

    if($_POST['max_beds'] && !empty($_POST['max_beds'])){
        $max_beds = $_POST['max_beds'];
    }else{
        $max_beds = '9+'; 
    }
    
    $posts['meta_query'][] = array(
        'key'       => 'bedrooms',
        'value'     => array($min_beds, $max_beds),
        'compare'   => 'BETWEEN'
    );
    
    //location filtering

    if(isset( $_POST['location'] ) && $_POST['location']){
        $location = $_POST['location'];
        $location_val = stripslashes($location);

        $posts['meta_query'][] = array(
            'relation'  => 'OR',
            array(
                'key'       => 'street',
                'value'     => $location_val,
                'compare'   => 'LIKE'
            ),

            array(
                'key'       => 'town',
                'value'     => $location_val,
                'compare'   => 'LIKE'
            ),

            array(
                'key'       => 'county',
                'value'     => $location_val,
                'compare'   => 'LIKE'
            ),

            array(
                'key'       => 'postcode',
                'value'     => $location_val,
                'compare'   => 'LIKE'
            )
        );                          
    }

    // property type filtering
    if(isset( $_POST['type'] ) && $_POST['type']){
        $posts['meta_query'][] = array(
            'key'       => 'type_of_property',
            'value'     => $_POST['type'],
            'compare'   => 'IN'
        );
    }

    // secondary flash filtering
    if(isset( $_POST['flash_type'] ) && $_POST['flash_type']){
        $posts['meta_query'][] = array(
            'key'       => 'optional_category',
            'value'     => $_POST['flash_type'],
            'compare'   => 'IN'
        );
    }

    $query = new WP_Query( $posts );?>
    
    <div class="row">
        <div class="col-12">
            <div id="crumb">
                <p>Now showing <span id="loop_count"></span> properties</p>

                <?php 
                    // check if property type has been selected if so loop through them and display them
                    if( $_POST['type'] ){
                        $crumb_type = $_POST['type'];

                        foreach($crumb_type as $val) {
                            echo '<span>'.$val.', </span>';
                        }
                    }

                    // check if min beds / max beds has been select if so display it in the crumb
                    if( $_POST['min_beds'] ){
                        $crumb_minbeds = $_POST['min_beds'];

                        echo '<p>from </p><span>'.$crumb_minbeds.' bedrooms </span>';
                    }

                    if( $_POST['max_beds']){
                        $crumb_maxbeds = $_POST['max_beds'];

                        echo '<p>up to </p><span>'.$crumb_maxbeds.' bedrooms, </span>';
                    }

                    // check if min price / max price has been select if so display it in the crumb
                    if( $_POST['min_price'] ){
                        $crumb_minprice = $_POST['min_price'];

                        echo '<p>from </p><span>£'.$crumb_minprice.' </span>';
                    }

                    if( $_POST['max_price']){
                        $crumb_maxprice = $_POST['max_price'];

                        echo '<p>up to </p><span>£'.$crumb_maxprice.' </span>';
                    }

                    // check if location is set 
                    if( $_POST['location'] ){
                        $crumb_location = $_POST['location'];

                        echo '<p>properties in </p><span>'.stripslashes($crumb_location).'</span>';
                    }

                    // check if secondary filters are applied, if so display a clickable box
                    if( $_POST['flash_type'] ): ?>
                        <div id="flash_crumbs">
                            <?php 
                            if( in_array('Ideal First Time Buy', $_POST['flash_type']) ): ?>
                                <a href="javascript:;">Ideal First Time Buy <span data-id="first_time" >&times;</span></a>
                            <?php endif; 

                            if( in_array('Ideal Investment', $_POST['flash_type']) ): ?>
                                <a href="javascript:;">Ideal Investment <span data-id="investment" >&times;</span></a>
                            <?php endif; 

                            if( in_array('Under Offer', $_POST['flash_type']) ): ?>
                                <a href="javascript:;">Under Offer <span data-id="under_offer" >&times;</span></a>
                            <?php endif; ?>
                        </div>
                    <?php endif; 
                ?>
            </div>
        </div>
    </div>

    <?php if( $query->have_posts() ): ?>    
        <div class="row">
            <?php while( $query->have_posts() ): $query->the_post() ?>
                <div class="col-sm-6 col-md-4 col-lg-3 post">
                    <div class="shadowwrapper2">
                        <a href="<?php the_permalink(); ?>">
                            <?php  
                                $main_field = get_field('images');
                                $first_row = $main_field[0];
                                $img = $first_row['image'];
                                $img_med = $img['sizes']['medium'];
                            ?>
                                
                            <div class="propertywrapper">
                                <img class="img-fluid gal_imgs" src="<?php echo $img_med ?>" alt="<?php $img['alt']; ?>"/>

                                <?php $secondary_flash = get_field('optional_category'); ?>

                                <?php if($secondary_flash == "Ideal First Time Buy"): ?>
                                    <span class="second_flash">Ideal First Time Buy</span>
                                <?php elseif($secondary_flash == "Ideal Investment"): ?>
                                    <span class="second_flash">Ideal Investment</span>
                                <?php elseif($secondary_flash == "Under offer"): ?>
                                    <span class="second_flash">Under offer</span>
                                <?php endif; ?>
                            </div>

                            <div class="cornerflash">
                                <img src="<?php bloginfo('template_directory'); ?>/imgs/forsale.svg" alt="corner flash">
                            </div> 

                            <div class="propertyinfo">
                                <div class="row m-0">
                                    <div class="col-6 p-0 mt-2"><?php the_field('type_of_property'); ?></div>
                                    <div class="col-6 p-0 mt-2"><?php the_field('bedrooms'); ?> bedrooms</div>
                                </div>
                            </div>
            
                            <div class="streetpricewrapper">
                                <p class="streetname">
                                    <?php the_field('street'); ?>, <?php the_field('town'); ?>
                                </p>
                                <p class="price">
                                    £<?php the_field('property_price'); ?>
                                </p>    
                            </div>                              
                        </a>
                    </div>
                </div>
            <?php endwhile; ?>
        </div>
    <?php
    wp_reset_postdata(); 
    endif; 
    wp_die();
}
Community
  • 1
  • 1
  • 1
    Possible duplicate of [Why is it a bad practice to return generated HTML instead of JSON? Or is it?](https://stackoverflow.com/questions/1284381/why-is-it-a-bad-practice-to-return-generated-html-instead-of-json-or-is-it) – dave Jun 12 '18 at 15:35

1 Answers1

2

You're transferring more data with HTML, potentially increasing latency.

HTML is sometimes repetitive which can greatly increase the amount you'd be transferring. Often AJAX requests are for something like a large list of items, in which case it might make more sense to just transfer the unique data from the list and create the HTML with a loop on the front end.

Also, sometimes you may want to create different kinds of markup with the same data, in which case JSON is more versatile.

For smaller bits of content, without much repetition, which are only being used in one way, transferring HTML doesn't necessarily have a large downside. It's not the sexiest solution, but not everything needs to be elegantly engineered.

dave
  • 2,762
  • 1
  • 16
  • 32