How to build a WordPress image slider
Our last article about the Meteor slides plugin was about how to use the plugin for your WordPress website and doesnât require any programming skills. My article today is about building a WordPress image slider from the ground up without using a plugin. Actually this is not totally true, because the tutorial is âonlyâ about the WordPress part and we will be using a readymade slideshow plugin written in jQuery. Iâm using the tutorial code for my own website as well, check the demo right below.
All slides are grouped by the slide location taxonomy (here: tutorial).
Upload the Flexslider files and add the PHP code to theme's functions.php file.
Add or edit title, text, image or target URL by using the standard WordPress interface.
All slides are grouped by the slide location taxonomy (here: tutorial).
Upload the Flexslider files and add the PHP code to theme's functions.php file.
WordPress image slider tutorial
Most image slider plugins are based on a third party slideshow plugin, written in jQuery or JavaScript. This is not surprising, because building a responsive and flexible slideshow is a different task than writing a few blocks of PHP code in WordPress. Iâm going to show you how to use the same code most slider plugins use to integrate and control a slider function right in your WordPress blog post. Iâm using Flexslider 2, a jQuery plugin maintained by WooThemes. WooThemes has built Flexslider 2 as the basis for their own premium WordPress themes and plugin. Reason enough to use their jQuery plugin for this WordPress tutorial.
Prepare your WordPress theme
All the tutorial code needs to be placed in your themeâs functions.php file, but before we can do that, we need to copy some files from the Flexslider jQuery plugin into the themeâs directory as well. Create a directory called flexslider in your themes directory. Download the Flexslider 2 plugin and upload the files flexslider.css and jquery.flexslider-min.js including the directories named fonts and images into the flexslider directory you just created.
The following two functions are used to include the necessary JavaScript and CSS code into your theme footer. Iâm using a âspecial methodâ Iâve found on Scribu.net to include these files inside the footer to keep my theme files fast. Many plugin developers include JS/CSS files on every page, post or even archive pages. The function print_my_script() below will include the JS/CSS files only on those pages where the slider shortcode is actually used.
1234567891011121314151617181920212223242526272829303132add_action('init', 'register_my_scripts'); function register_my_scripts() { wp_register_script( 'flexslider', get_stylesheet_directory_uri() . '/flexslider/jquery.flexslider-min.js', array('jquery'), '1.0.0', true );} add_action('wp_footer', 'print_my_script', 99); function print_my_script() { global $add_my_script, $ss_atts; if ( $add_my_script ) { $speed = $ss_atts['slideshowspeed']*1000; echo "<script type=\"text/javascript\">jQuery(document).ready(function($) { $('head').prepend($('<link>').attr({ rel: 'stylesheet', type: 'text/css', media: 'screen', href: '" . get_stylesheet_directory_uri() . "/flexslider/flexslider.css' })); $('.flexslider').flexslider({ animation: '".$ss_atts['animation']."', slideshowSpeed: ".$speed.", controlNav: false });});</script>"; wp_print_scripts('flexslider'); } else { return; }}
The first function registers the JavaScript file and the second function will output (print) all the other code, including the code for Flexslider 2, into the footer of your theme. Note the variable $add_my_scripts is used as a kind of filter. I will explain later how this filter works.
Custom post type and taxonomy
I created a custom post type for all the different sliders I will later create for my website. The custom taxonomy is used to bundle these slides (posts) into one or more slideshows.
12345678910111213141516171819202122232425262728add_action( 'init', 'create_slider_posttype' );function create_slider_posttype() { Â Â $args = array( Â Â Â 'public' => false, Â Â Â 'show_ui' => true, Â Â Â 'menu_icon' => 'dashicons-images-alt', Â Â Â 'capability_type' => 'page', Â Â Â 'rewrite' => array( 'slider-loc', 'post_tag' ), Â Â Â 'label' Â => 'Simple slides', Â Â Â 'supports' => array( 'title', 'editor', 'custom-fields', 'thumbnail', 'page-attributes') Â Â ); Â Â register_post_type( 'slider', $args );} add_action( 'init', 'create_slider_location_tax' );function create_slider_location_tax() { register_taxonomy( 'slider-loc', 'slider', array( 'label' => 'Slider location', 'public' => false, 'show_ui' => true, 'show_admin_column' => true, 'rewrite' => false ) );}
For the custom post type I use the set public to false to keep the slider posts out of the results from any  search engine. I do the same for the custom taxonomy named slide-loc. For the post type, I have enabled only the fields I really need. That includes the custom field, which I use for the target URL behind each slide.
The following small function is responsible for creating a post meta value for each slide. This value is used as a default URL value for the custom field.
123456add_action('wp_insert_post', 'set_default_slidermeta'); function set_default_slidermeta($post_ID){ Â Â add_post_meta($post_ID, 'slider-url', 'http://', true); Â Â return $post_ID;}
WordPress image slider shortcode
The last part of code is used to show your slideshow inside a post, page, theme or any other place where the usage of a shortcode is possible.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253add_shortcode( 'simpleslider', 'simple_slider_shortcode' ); function simple_slider_shortcode($atts = null) { global $add_my_script, $ss_atts; $add_my_script = true; $ss_atts = shortcode_atts( array( 'location' => '', 'limit' => -1, 'ulid' => 'flexid', 'animation' => 'slide', 'slideshowspeed' => 5 ), $atts, 'simpleslider' ); $args = array( 'post_type' => 'slider', 'posts_per_page' => $ss_atts['limit'], 'orderby' => 'menu_order', 'order' => 'ASC' ); if ($ss_atts['location'] != '') { $args['tax_query'] = array( array( 'taxonomy' => 'slider-loc', 'field' => 'slug', 'terms' => $ss_atts['location'] ) ); } $the_query = new WP_Query( $args ); $slides = array(); if ( $the_query->have_posts() ) { while ( $the_query->have_posts() ) { $the_query->the_post(); $imghtml = get_the_post_thumbnail(get_the_ID(), 'full'); $url = get_post_meta(get_the_ID(), 'slider-url', true); if ($url != '' && $url != 'http://') { $imghtml = '<a href="'.$url.'">'.$imghtml.'</a>'; } $slides[] = ' <li> <div class="slide-media">'.$imghtml.'</div> <div class="slide-content"> <h3 class="slide-title">'.get_the_title().'</h3> <div class="slide-text">'.get_the_content().'</div> </div> </li>'; } } wp_reset_query(); return ' <div class="flexslider" id="'.$ss_atts['ulid'].'"> <ul class="slides"> '.implode('', $slides).' </ul> </div>';}
This shortcode accepts 3 attributes: a slider location, the animation type and the slideshow speed. These values are passed to the database query or the JavaScript snippet. Do you remember the variable $add_my_script Iâve mentioned before? This âglobalâ variable is set right in the shortcode function and takes care about that all Flexslider files are only included on pages or posts where the slideshow shortcode is used! All HTML code for the slideshow is created by this function.
Using the slideshow shortcode and final words
This tutorial is not written for the WordPress beginner, but Iâm also sure itâs not too complicated. You can use the three attributes to configure your slideshow a bit, for example:
1[simpleslider location="homepage" animation="slide" slideshowspeed="5"]
This shortcode will show all slides with custom taxonomy âhomepageâ (the slug) and show them in animation mode âslideâ (you can also use âfadeâ) and the speed is set to 5 seconds. The attributes are not required and if you like to have more options you can add them to the function with the name print_my_spript(). This page shows all available Flexslider 2 properties.
The tutorial code doesnât have some special style for the slideshow. If you like to use the same style as I used for my demo, copy/paste this CSS code into your themeâs stylesheet.
1234.flexslider { margin: 0 auto;max-height:300px; }.slide-content { position: relative;max-width:500px;bottom:70px;left:10px;background-color:#fff;font-size:0.95em;padding:0.45em 0.85em 0.25em;border-radius:3px;overflow: hidden; }.slide-content h3 { margin:0;font-size:1.5em;color:#4A7BB5; }.flex-direction-nav a { border-bottom:0;color:#fff;text-shadow: 2px 2px 2px rgba(15, 15, 15, 1);font-size:32px;heigh