'application/pdf', 'link_href' => '.', 'selected_attribute' => 'first_letter', 'selected_class' => 'az-current-item', 'css_styles' => 'inline', 'output' => 'flat', // or 'list' 'listtag' => 'ul', 'itemtag' => 'li', 'separator' => "\n", 'single_text' => '%d item', 'multiple_text' => '%d items', ); // Make sure $attr is an array, even if it's empty if ( empty( $attr ) ) { $attr = array(); } elseif ( is_string( $attr ) ) { $attr = shortcode_parse_atts( $attr ); } // Accept only the attributes we need and supply defaults $arguments = shortcode_atts( $default_arguments, $attr ); // Find IDs assigned to taxonomy term(s), if specified $ids = self::find_term_relationships( $attr ); // Build an array of SQL clauses for the posts query $query = array(); $query_parameters = array(); $query[] = "SELECT UCASE( MID( post_title, 1, 1 ) ) AS first_letter, COUNT( ID ) AS count FROM {$wpdb->posts}"; if ( empty( $ids ) ) { $query[] = "WHERE ( 1=1"; } else { $ids = implode( ',', $ids ); $query[] = "WHERE ( ID IN ({$ids})"; } $query[] = "AND post_type = 'attachment'"; if ( ! empty( $arguments['post_mime_type'] ) ) { if ( 'all' != strtolower( $arguments['post_mime_type'] ) ) { $query[] = str_replace( '%', '%%', wp_post_mime_type_where( $arguments['post_mime_type'] ) ) . ')'; } } else { $query[] = ')'; } $query[] = "GROUP BY first_letter"; $query = join(' ', $query); $results = $wpdb->get_results( $query ); /* * Make the current item distinctive */ if ( 'inline' == $arguments['css_styles'] ) { $output = "\n"; } else { $output = ''; } $is_list = 'list' == $arguments['output']; if ( $is_list ) { $output .= '<' . $arguments['listtag'] . '>' . $arguments['separator']; } if ( isset( $_REQUEST[ $arguments['selected_attribute'] ] ) ) { $current_item = $_REQUEST[ $arguments['selected_attribute'] ]; } else { $current_item = ''; } foreach( $results as $result ) { if ( $current_item == $result->first_letter ) { $class = $arguments['selected_class']; } else { $class = ''; } $href = sprintf( '%1$s?%2$s=%3$s', $arguments['link_href'], $arguments['selected_attribute'], $result->first_letter ); if ( 1 == $result->count ) { $title = sprintf( $arguments['single_text'], $result->count ); } else { $title = sprintf( $arguments['multiple_text'], $result->count ); } $link = sprintf( '%4$s%5$s', $class, $href, $title, $result->first_letter, $arguments['separator'] ); if ( $is_list ) { $output .= '<' . $arguments['itemtag'] . '>' . $link . '' . $arguments['separator']; } else { $output .= $link . $arguments['separator']; } } if ( $is_list ) { $output .= '' . $arguments['separator']; } return $output; } //a_to_z_cloud_shortcode /** * WordPress Shortcode; returns items beginning with a particular letter * * @since 1.00 * * @param array shortcode parameters * * @return string shortcode results */ public static function a_to_z_gallery_shortcode( $attr ) { global $wpdb; $a_to_z_arguments = array( 'selected_attribute' => 'first_letter', 'collapse_o_matic' => 'true', 'az_output' => 'list', // or 'flat' 'az_listtag' => 'ul', 'az_itemtag' => 'li', 'az_separator' => "\n", ); $default_arguments = array_merge( array( 'post_mime_type' => 'application/pdf', 'mla_fixed_part' => 'array()', 'mla_caption' => '{+mla_fixed_part+}', 'size' => 'medium', 'columns' => '6', 'link' => 'file', ), $a_to_z_arguments ); // Make sure we have an array of shortcode parameters if ( empty( $attr ) ) { $attr = array(); } elseif ( is_string( $attr ) ) { $attr = shortcode_parse_atts( $attr ); } // Filter the attributes we need and supply defaults $arguments = shortcode_atts( $default_arguments, $attr ); /* * Compose the attributes we will pass to [mla_gallery], * handling embedded quotes */ $mla_arguments = ''; foreach ( array_merge( $attr, $arguments ) as $key => $value ) { if ( array_key_exists( $key, $a_to_z_arguments ) ) { continue; } $slashed = addcslashes( $value, chr(0).chr(7).chr(8)."\f\n\r\t\v\"\\\$" ); if ( ( false !== strpos( $value, ' ' ) ) || ( false !== strpos( $value, '\'' ) ) || ( $slashed != $value ) ) { $value = '"' . $slashed . '"'; } $mla_arguments .= empty( $mla_arguments ) ? $key . '=' . $value : ' ' . $key . '=' . $value; } // foreach $attr if ( isset( $_REQUEST[ $arguments['selected_attribute'] ] ) ) { $current_item = $_REQUEST[ $arguments['selected_attribute'] ]; // Find IDs assigned to taxonomy term(s), if specified $ids = self::find_term_relationships( $attr ); // Build an array of SQL clauses, then run the query $query = array(); $query_parameters = array(); $query[] = "SELECT post_title, ID FROM {$wpdb->posts}"; if ( empty( $ids ) ) { $query[] = "WHERE ( 1=1"; } else { $ids = implode( ',', $ids ); $query[] = "WHERE ( ID IN ({$ids})"; } $query[] = "AND UCASE( MID( post_title, 1, 1 ) ) = '" . $current_item . "'"; $query[] = "AND post_type = 'attachment'"; if ( ! empty( $arguments['post_mime_type'] ) ) { if ( 'all' != strtolower( $arguments['post_mime_type'] ) ) { $query[] = str_replace( '%', '%%', wp_post_mime_type_where( $arguments['post_mime_type'] ) ) . ')'; } } else { $query[] = ')'; } $query[] = "ORDER BY post_title"; $query = join(' ', $query); $results = $wpdb->get_results( $query ); } else { return "Click on a letter to see the song list.\n"; } $is_list = 'list' == strtolower( trim( $arguments['az_output'] ) ); $is_collapse = 'true' == strtolower( trim( $arguments['collapse_o_matic'] ) ); $output = ''; $old_song = NULL; $old_ids = array(); // Accumulate this directly to allow quote and double-quote characters in content self::$mla_fixed_values = array(); if ( $is_list && ! empty( $arguments['az_listtag'] ) ) { $output .= "<{$arguments['az_listtag']}>{$arguments['az_separator']}"; } foreach ( $results as $result ) { // Find the song title and optional part $title = $result->post_title; $divide = strpos( $title, ' - ' ); if ( false === $divide ) { $song = $title; $part = 'All Parts'; } else { $song = substr( $title, 0, $divide ); $part = substr( $title, $divide + 3 ); } // If the song has changed, output the previous entry if ( $old_song && $old_song != $song ) { $output .= self::format_title_and_gallery( $old_song, $old_ids, $mla_arguments, $arguments ); $old_song = $song; $old_ids = array(); self::$mla_fixed_values = array(); } // Accumulate the parts $old_song = $song; $old_ids[] = $result->ID; self::$mla_fixed_values['mla_fixed_part'][] = $part; } // Flush the last entry if ( $old_song ) { $output .= self::format_title_and_gallery( $old_song, $old_ids, $mla_arguments, $arguments ); } if ( $is_list && ! empty( $arguments['az_listtag'] ) ) { $output .= "{$arguments['az_separator']}"; } return $output; } //a_to_z_gallery_shortcode /** * Compose a single item title and parts gallery * * @since 1.00 * * @param string item title * @param array part ID values * @param array [mla_gallery] parameters * @param array formating parameters * * @return string markup for title and gallery */ private static function format_title_and_gallery( $title, $ids, $mla_arguments, $arguments ) { $is_list = 'list' == strtolower( trim( $arguments['az_output'] ) ); $is_collapse = 'true' == strtolower( trim( $arguments['collapse_o_matic'] ) ); $output = ''; if ( $is_list ) { $output .= "<{$arguments['az_itemtag']}>{$arguments['az_separator']}"; } if ( $is_collapse ) { $output .= "[expand title='" . esc_attr( $title ) . "']{$arguments['az_separator']}"; } else { $output .= "{$title}
{$arguments['az_separator']}"; } $output .= "[mla_gallery ids='" . implode( ',', $ids ) . "' "; $output .= $mla_arguments . "]{$arguments['az_separator']}"; if ( $is_collapse ) { $output .= "[/expand]{$arguments['az_separator']}"; } if ( $is_list ) { $output .= "{$arguments['az_separator']}"; } return do_shortcode( $output ); } //format_title_and_gallery /** * Find items assigned to taxonomy term(s) * * @since 1.00 * * @param array shortcode parameters * * @return array ID values of objects assigned to the term(s), if any */ private static function find_term_relationships( $attr ) { global $wpdb; // Start with empty "taxonomy" parameter values $ttids = array(); // Find taxonomy argument, if present, and collect terms $taxonomies = get_taxonomies( array( 'object_type' => array( 'attachment' ) ), 'names' ); foreach( $taxonomies as $taxonomy ) { if ( empty( $attr[ $taxonomy ] ) ) { continue; } // Found the taxonomy; collect the terms $include_children = isset( $attr['include_children'] ) && 'true' == strtolower( trim( $my_query_vars['include_children'] ) ); // Allow for multiple term slug values $terms = array(); $slugs = explode( ',', $attr[ $taxonomy ] ); foreach ( $slugs as $slug ) { $args = array( 'slug' => $slug, 'hide_empty' => false ); $terms = array_merge( $terms, get_terms( $taxonomy, $args ) ); } foreach( $terms as $term ) { // Index by ttid to remove duplicates $ttids[ $term->term_taxonomy_id ] = $term->term_taxonomy_id; if ( $include_children ) { $args = array( 'child_of' => $term->term_id, 'hide_empty' => false ); $children = get_terms( $taxonomy, $args ); foreach( $children as $child ) { $ttids[] = $child->term_taxonomy_id; } } // include_children } // $term break; } // Pre-select the items assigned to the taxonomy terms $ids = array(); if ( ! empty( $ttids ) ) { // Build an array of SQL clauses for the term_relationships query $query = array(); $query_parameters = array(); $query[] = "SELECT DISTINCT tr.object_id FROM {$wpdb->term_relationships} as tr"; $placeholders = array(); if ( ! empty( $ttids ) ) { foreach ( $ttids as $ttid ) { $placeholders[] = '%s'; $query_parameters[] = $ttid; } } else { $placeholders[] = '%s'; $query_parameters[] = '0'; } $query[] = 'WHERE ( tr.term_taxonomy_id IN (' . join( ',', $placeholders ) . ') )'; $query = join(' ', $query); $results = $wpdb->get_results( $wpdb->prepare( $query, $query_parameters ) ); if ( is_array( $results ) ) { foreach ( $results as $id ) { $ids[] = $id->object_id; } } } return $ids; } //find_term_relationships /** * Save the shortcode attributes */ private static $shortcode_attributes = array(); /* * $mla_fixed_values stores the parameter(s) and values. If none are found, the * initialization code sets it to false so the logic is quickly bypassed. */ private static $mla_fixed_values = NULL; /** * MLA Gallery (Display) Attributes * * This filter lets you record or modify the arguments passed in to the shortcode * before they are merged with the default arguments used for the gallery display. * * The $shortcode_attributes array is where you will find your own parameters that * are coded in the shortcode, e.g.: * [mla_gallery mla_fixed_caption="array('test1','test2')" mla_caption="{+mla_fixed_caption+}"]. */ public static function mla_gallery_attributes_filter( $shortcode_attributes ) { /* * Save the attributes for use in the later filter */ self::$shortcode_attributes = $shortcode_attributes; return $shortcode_attributes; } // mla_gallery_attributes_filter /** * MLA Gallery Item Values * * @since 1.00 * * @param array parameter_name => parameter_value pairs * * @return array updated substitution parameter name => value pairs */ public static function mla_gallery_item_values_filter( $item_values ) { /* * We use shortcode parameters of our own to apply our filters on a * gallery-by-gallery basis, leaving other [mla_gallery] instances untouched. * If no "mla_fixed_" parameters are present, we have nothing to do. Here is * an example of how the custom parameter can be used: * * [mla_gallery ids="2621,2622" mla_fixed_title="array('my title','my other title')" mla_image_attributes="title='{+mla_fixed_title+}'"] * * You can have as many "mla_fixed_" parameters as you need for different values. */ if ( false === self::$mla_fixed_values ) { return $item_values; // leave them unchanged } /* * Evaluate the parameter value(s) once per page load. */ if ( NULL === self::$mla_fixed_values ) { self::$mla_fixed_values = array(); foreach ( self::$shortcode_attributes as $parmkey => $parmvalue ) { if ( 'mla_fixed_' == substr( $parmkey, 0, 10 ) ) { if ( 'array(' == substr( $parmvalue, 0, 6 ) ) { $function = @create_function( '', 'return ' . self::$shortcode_attributes[ $parmkey ] . ';' ); if ( is_callable( $function ) ) { self::$mla_fixed_values[ $parmkey ] = $function(); if ( ! is_array( self::$mla_fixed_values[ $parmkey ] ) ) { self::$mla_fixed_values[ $parmkey ] = array(); } } else { self::$mla_fixed_values[ $parmkey ] = array(); } } else { self::$mla_fixed_values[ $parmkey ] = explode( ",", $parmvalue ); if ( false === self::$mla_fixed_values[ $parmkey ] ) { self::$mla_fixed_values[ $parmkey ] = array(); } } } // found mla_fixed_ } // foreach parameter if ( empty( self::$mla_fixed_values ) ) { self::$mla_fixed_values = false; return $item_values; } } // initialization code /* * Apply the appropriate value to the current item. */ foreach ( self::$mla_fixed_values as $mla_fixed_key => $mla_fixed_value ) { /* * Apply the appropriate value to the current item. */ if ( isset( $mla_fixed_value[ $item_values['index'] - 1 ] ) ) { $item_values[ $mla_fixed_key ] = $mla_fixed_value[ $item_values['index'] - 1 ]; } } return $item_values; } // mla_gallery_item_values_filter /** * MLA Gallery Close Values * * @since 1.02 * * @param array parameter_name => parameter_value pairs * * @return array updated substitution parameter name => value pairs */ public static function mla_gallery_close_values_filter( $markup_values ) { /* * Reset $mla_fixed_values for multiple shortcodes on the same post/page */ self::$mla_fixed_values = NULL; return $markup_values; } // mla_gallery_close_values_filter } // Class MLAAtoZCloudExample /* * Install the filters at an early opportunity */ add_action('init', 'MLAAtoZCloudExample::initialize'); ?>