[wp-trac] [WordPress Trac] #55326: Conditional classes directives in formatting

WordPress Trac noreply at wordpress.org
Sun Mar 6 18:01:43 UTC 2022


#55326: Conditional classes directives in formatting
------------------------------+-----------------------------
 Reporter:  vijayhardaha      |      Owner:  (none)
     Type:  feature request   |     Status:  new
 Priority:  normal            |  Milestone:  Awaiting Review
Component:  Formatting        |    Version:  5.9.1
 Severity:  normal            |   Keywords:
  Focuses:  coding-standards  |
------------------------------+-----------------------------
 Hey people,

 I am here with a suggestion and core feature request for conditional
 classes directive for HTML class attribute. Similar to [Laraval
 conditional-classes](https://laravel.com/docs/9.x/blade#conditional-
 classes)

 If this function is already available in WP then please let me know about
 it, I wasn't able to find a similar function.

 There are many cases in development where we're creating a `$clasess`
 array variable and then with if-else or using conditional statements
 adding classes into it.

 While working with PHP code the code/file format in files look good and
 it's easy to manage but sometimes with HTML and PHP combination writing
 inline if-else make the code/file format ugly. and we also have to repeat
 the escape and echo things again n again if we have a couple of
 conditional CSS to write.

 I have created this custom code to use in my custom development, which
 allows passing set or array or single sting or strings with comma/space
 and then it conditional validate and output the string.

 {{{#!php
 <?php
 /**
  * Returns/echo Conditional HTML Classes.
  *
  * @param array|string $classes    Array of classes, single string or
 strings with comma.
  * @param bool         $echo       If true then echo the output otherwise
 return it.
  * @return string                  HTML classes string.
  */
 function html_class( $classes = array(), $echo = true ) {
         // Define default output.
         $output = '';

         // Make a type and empty check validation.
         if ( ( is_array( $classes ) || is_string( $classes ) ) && ! empty(
 $classes ) ) {
                 /**
                  * If string then parse it comman and space.
                  * otherwise keep the array.
                  */
                 $classes = is_string( $classes ) ? wp_parse_list( $classes
 ) : (array) $classes;

                 // Do an empty check.
                 if ( ! empty( $classes ) ) {
                         // Storing var for valid classess.
                         $class_set = array();

                         // Loop through all classes.
                         foreach ( $classes as $key => $class_name ) {
                                 // Check if array has integer key, which
 means no conditions
                                 // are set for this class, if class is not
 empty then keep it.
                                 if ( is_int( $key ) && is_string(
 $class_name ) && ! empty( $class_name ) ) {
                                         $class_set[] = trim( $class_name
 );
                                 } elseif ( ! empty( $class_name ) && !
 empty( $key ) ) {
                                         $class_set[] = trim( $key );
                                 }
                         }

                         /**
                          * Filter array with empty values.
                          * Make array unique.
                          * Sanitize class name.
                          * Implode by space.
                          */
                         $output = implode( ' ', array_map(
 'sanitize_html_class', array_unique( array_filter( $class_set ) ) ) );
                 }
         }

         if ( $echo ) {
                 echo esc_attr( $output );
         } else {
                 return esc_attr( $output );
         }
 }
 }}}

 so using this function we could save time to not write a few lines of if-
 else and keep the code look clean and simple as well, e.g.
 {{{#!php
 <?php
 $classes   = array();
 $classes[] = array( 'post-title' );
 if ( has_post_thumbnail() ) {
         $classes[] = 'has-thumbnail';
 }
 if ( has_term( 'featured', 'category' ) ) {
         $classes[] = 'is-featured';
 }

 echo '<div class="' . esc_attr( join( ' ', $classes ) ) . '">';
 }}}


 this will convert into this.
 {{{#!php
 <?php
 $classes = array(
         array(
                 'post-title',
                 'has-thumbnail' => has_post_thumbnail(),
                 'is-featured'   => has_term( 'featured', 'category' ),
         ),
 );

 echo '<div class="' . html_class( $classes, false ).'">; // false is for
 returning the values.
 }}}

 however, it does not save too many lines but we are repeating things less
 and I feel it looks clean in code reading. :)

 But this function can be very useful while writing mixed HTML and php.
 {{{#!php
 <?php
 <div class="col-12
 <?php
 if ( is_sidebar_active( 'right-sidebar' ) && is_sidebar_active( 'righleft-
 sidebar' ) ) {
         echo 'col-md-6';
 } elseif ( ! is_sidebar_active( 'right-sidebar' ) && is_sidebar_active(
 'left-sidebar' ) ) {
         echo 'col-md-8';
 } elseif ( is_sidebar_active( 'right-sidebar' ) && ! is_sidebar_active(
 'left-sidebar' ) ) {
         echo 'col-md-8 md-offset-4';
 } else {
         echo 'col-md-8 md-offset-2';
 }
 ?>
 "></div>
 }}}


 {{{#!php
 <?php
 $clasess = array(
         'col-12',
         'col-md-6'             => is_sidebar_active( 'right-sidebar' ) &&
 is_sidebar_active( 'righleft-sidebar' ),
         'col-md-8'             => ! is_sidebar_active( 'right-sidebar' )
 && is_sidebar_active( 'righleft-sidebar' ),
         'col-md-8 md-offset-4' => is_sidebar_active( 'right-sidebar' ) &&
 ! is_sidebar_active( 'righleft-sidebar' ),
         'col-md-8 md-offset-2' => ! ( is_sidebar_active( 'right-sidebar' )
 && is_sidebar_active( 'righleft-sidebar' ) ),
 );
 ?>
 <div class="<?php html_class( $clasess ); ?>"></div>
 }}}


 Please let me know what you people think about having a directive function
 for classes.

 Thanks,

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/55326>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list