| @@ -1,39 +1,320 @@ | ||
| 1 | 1 | <?php |
| 2 | - | |
| 3 | 2 | /* |
| 4 | - Plugin Name: Document Gallery | |
| 5 | - Description: Display non-images (and images) in gallery format on a page or post with the [dg] shortcode. | |
| 6 | - Version: 1.4 | |
| 7 | - Author: Dan Rossiter | |
| 8 | - Author URI: http://danrossiter.org/ | |
| 9 | - License: GPL2 | |
| 10 | - */ | |
| 3 | +Plugin Name: Document Gallery | |
| 4 | +Description: Display non-images (and images) in gallery format on a page or post with the [dg] shortcode. | |
| 5 | +Version: 1.2 | |
| 6 | +Author: Dan Rossiter | |
| 7 | +Author URI: http://danrossiter.org/ | |
| 8 | +License: GPL2 | |
| 9 | +*/ | |
| 11 | 10 | |
| 12 | -define('DG_URL', plugin_dir_url(__FILE__)); | |
| 13 | -define('DG_PATH', dirname(__FILE__).'/'); | |
| 11 | +define( 'DG_URL', plugin_dir_url( __FILE__ ) ); | |
| 14 | 12 | |
| 15 | -/** | |
| 16 | - * Takes values passed from attributes and returns sutable HTML to represent | |
| 17 | - * all valid attachments requested. | |
| 18 | - * | |
| 19 | - * @param array $atts Arguments from the user. | |
| 20 | - * @return string HTML for the Document Gallery. | |
| 21 | - */ | |
| 13 | +// CREATE GALLERY STRING // | |
| 22 | 14 | function dg_get_attachment_icons($atts) { |
| 23 | - include_once(DG_PATH . 'models/class-gallery.php'); | |
| 24 | - return (string)(new DG_Gallery($atts)); | |
| 15 | + extract( shortcode_atts( array( | |
| 16 | + 'descriptions' => FALSE, | |
| 17 | + 'orderby' => 'menu_order', | |
| 18 | + 'order' => 'ASC', | |
| 19 | + 'attachment_pg' => FALSE, // default: link directly to file (true to link to attachment pg) | |
| 20 | + 'images' => FALSE, // if enabled, all images attached to current page will be included also | |
| 21 | + 'ids' => FALSE // comma-separated list of attachment ids | |
| 22 | + ), $atts) ); | |
| 23 | + | |
| 24 | + // INIT | |
| 25 | + $attachments = array(); | |
| 26 | + $errs = array(); | |
| 27 | + | |
| 28 | + | |
| 29 | + // ATTRIBUTE VALIDATION | |
| 30 | + if( strtolower($descriptions) == "false" ){ $descriptions = FALSE; } | |
| 31 | + | |
| 32 | + $order = strtoupper( $order ); | |
| 33 | + if($order != 'ASC' && $order != 'DEC') | |
| 34 | + $errs[] = "The order attribute must be either ASC or DEC. You entered $order."; | |
| 35 | + | |
| 36 | + if( strtolower($attachment_pg) == "false" ){ $attachment_pg = FALSE; } | |
| 37 | + | |
| 38 | + if( strtolower($images) == "false" ){ $images = FALSE; } | |
| 39 | + | |
| 40 | + if( strtolower($ids) ){ $ids = FALSE; } | |
| 41 | + | |
| 42 | + // http://www.youtube.com/watch?v=ClnSMCdw6E8 | |
| 43 | + if( $errs ) return implode(' ', $errs); | |
| 44 | + // END VALIDATION (WE MADE IT!) | |
| 45 | + | |
| 46 | + | |
| 47 | + // LET'S GET SOME DOCUMENTS! | |
| 48 | + if( $ids && ( $ids = explode( ',', $ids ) ) ){ | |
| 49 | + $attachments = dg_get_attachments_by_ids( $ids ); | |
| 50 | + } | |
| 51 | + | |
| 52 | + // if 'ids' was used, skip | |
| 53 | + if( !$attachments ){ | |
| 54 | + $args = array( | |
| 55 | + 'numberposts' => -1, | |
| 56 | + 'orderby' => $orderby, | |
| 57 | + 'order' => $order, | |
| 58 | + 'post_type' => 'attachment', | |
| 59 | + 'post_mime_type' => 'application,video,text,audio', | |
| 60 | + 'post_parent' => get_the_ID() ); | |
| 61 | + if( $images ) $args['post_mime_type'] .= ',image'; | |
| 62 | + | |
| 63 | + $attachments = get_posts($args); | |
| 64 | + } | |
| 65 | + | |
| 66 | + if ( $attachments ) { // DOCUMENT LOOP | |
| 67 | + $attachment_str = array( PHP_EOL.'<!-- Generated using Document Gallery. Get yours here: '. | |
| 68 | + 'http://wordpress.org/extend/plugins/document-gallery -->'.PHP_EOL ); | |
| 69 | + | |
| 70 | + $count = 0; | |
| 71 | + foreach( $attachments as $attachment ) { //setup array for more than one file attachment | |
| 72 | + $url = $attachment->guid; | |
| 73 | + $filename = basename( $url ); | |
| 74 | + | |
| 75 | + if( $attachment_pg ) // link to attachment page | |
| 76 | + $url = get_attachment_link( $attachment->ID ); | |
| 77 | + | |
| 78 | + $title = get_the_title( $attachment->ID ); | |
| 79 | + $icon = dg_get_attachment_image( $attachment->ID, $title, $filename ); | |
| 80 | + | |
| 81 | + if($descriptions) { // start wrapper | |
| 82 | + $attachment_str[] = '<div class="document-icon-wrapper descriptions">'.PHP_EOL. | |
| 83 | + ' <div class="document-icon">'.PHP_EOL; | |
| 84 | + } else { // no description | |
| 85 | + if( $count % 4 == 0 ) { // start wrapper | |
| 86 | + $attachment_str[] = '<div id="document-icon-wrapper">'.PHP_EOL; | |
| 87 | + } | |
| 88 | + $attachment_str[] = ' <div class="document-icon">'.PHP_EOL; | |
| 89 | + } | |
| 90 | + | |
| 91 | + $attachment_str[] = " <a href=\"$url\">$icon<br>$title</a>".PHP_EOL; | |
| 92 | + | |
| 93 | + if($descriptions) { // end icon & add description | |
| 94 | + $attachment_str[] = ' </div>'.PHP_EOL. | |
| 95 | + " <p>$attachment->post_content</p>". | |
| 96 | + PHP_EOL.'</div>'.PHP_EOL; | |
| 97 | + } else { // end icon | |
| 98 | + $attachment_str[] = ' </div>'.PHP_EOL; | |
| 99 | + if( ++$count % 4 == 0 ) { // end wrapper | |
| 100 | + $attachment_str[] = '</div>'.PHP_EOL; | |
| 101 | + } | |
| 102 | + } | |
| 103 | + } // end looping attachments | |
| 104 | + | |
| 105 | + // for galleries w/ number of docs != mult of 4 | |
| 106 | + if( $count % 4 != 0 && !$descriptions ){ // end wrapper | |
| 107 | + $attachment_str[] = '</div>'.PHP_EOL; | |
| 108 | + } | |
| 109 | + | |
| 110 | + // join array & return | |
| 111 | + return implode( '', $attachment_str ); | |
| 112 | + } // END DOCUMENT LOOP | |
| 113 | + | |
| 114 | + return PHP_EOL.'<!-- Document Gallery: No attachments to display. -->'.PHP_EOL; | |
| 25 | 115 | } |
| 116 | +add_shortcode('dg', 'dg_get_attachment_icons'); | |
| 117 | +// Depreciated as of v1.0. left for backward compatibility | |
| 118 | +add_shortcode('document gallery', 'dg_get_attachment_icons'); | |
| 26 | 119 | |
| 27 | -/** | |
| 28 | - * 'document gallery' shortcode depreciated as of v1.0. left for backward compatibility | |
| 29 | - */ | |
| 30 | -add_shortcode('document gallery', 'dg_get_attachment_icons'); | |
| 31 | -add_shortcode('dg', 'dg_get_attachment_icons'); | |
| 32 | 120 | |
| 33 | -/** | |
| 34 | - * Include stylesheet for some basic design. | |
| 35 | - */ | |
| 121 | + | |
| 122 | +// HELPERS // | |
| 123 | +function dg_get_attachments_by_ids( $ids ){ | |
| 124 | + $attachments = array(); | |
| 125 | + foreach( $ids as $id ){ | |
| 126 | + $attachment = get_post( $id ); | |
| 127 | + if( $attachment->post_type == 'attachment' ) | |
| 128 | + $attachments[] = $attachment; | |
| 129 | + // else: not an attachment so skip | |
| 130 | + } | |
| 131 | + return $attachments; | |
| 132 | +} | |
| 133 | + | |
| 134 | +// pass in $title & $url to avoid mult function calls | |
| 135 | +function dg_get_attachment_image( $id, $title, $filename ) { | |
| 136 | + $filetype = wp_check_filetype( $filename ); | |
| 137 | + | |
| 138 | + // identify extension | |
| 139 | + switch( $filetype['ext'] ) { | |
| 140 | + // Most Common First | |
| 141 | + case 'pdf': | |
| 142 | + $icon = 'pdf.png'; | |
| 143 | + break; | |
| 144 | + // MS Office | |
| 145 | + case 'doc': | |
| 146 | + case 'docx': | |
| 147 | + case 'docm': | |
| 148 | + case 'dotx': | |
| 149 | + case 'dotm': | |
| 150 | + $icon = 'msdoc.png'; | |
| 151 | + break; | |
| 152 | + case 'ppt': | |
| 153 | + case 'pot': | |
| 154 | + case 'pps': | |
| 155 | + case 'pptx': | |
| 156 | + case 'pptm': | |
| 157 | + case 'ppsx': | |
| 158 | + case 'ppsm': | |
| 159 | + case 'potx': | |
| 160 | + case 'potm': | |
| 161 | + case 'ppam': | |
| 162 | + case 'sldx': | |
| 163 | + case 'sldm': | |
| 164 | + $icon = 'msppt.png'; | |
| 165 | + break; | |
| 166 | + case 'xla': | |
| 167 | + case 'xls': | |
| 168 | + case 'xlt': | |
| 169 | + case 'xlw': | |
| 170 | + case 'xlsx': | |
| 171 | + case 'xlsm': | |
| 172 | + case 'xlsb': | |
| 173 | + case 'xltx': | |
| 174 | + case 'xltm': | |
| 175 | + case 'xlam': | |
| 176 | + $icon = 'msxls.png'; | |
| 177 | + break; | |
| 178 | + case 'mdb': | |
| 179 | + $icon = 'msaccess.png'; | |
| 180 | + break; | |
| 181 | + // Video formats | |
| 182 | + case 'avi': | |
| 183 | + $icon = 'avi.png'; | |
| 184 | + break; | |
| 185 | + case 'divx': | |
| 186 | + $icon = 'divx.png'; | |
| 187 | + break; | |
| 188 | + case 'flv': | |
| 189 | + $icon = 'flv.png'; | |
| 190 | + break; | |
| 191 | + case 'qt': | |
| 192 | + case 'mov': | |
| 193 | + $icon = 'mov.png'; | |
| 194 | + break; | |
| 195 | + case 'asf': | |
| 196 | + case 'asx': | |
| 197 | + case 'wax': | |
| 198 | + case 'wmv': | |
| 199 | + case 'wmx': | |
| 200 | + $icon = 'wmv.png'; | |
| 201 | + break; | |
| 202 | + case 'mkv': | |
| 203 | + $icon = 'mkv.png'; | |
| 204 | + break; | |
| 205 | + // Audio formats | |
| 206 | + case 'mp3': | |
| 207 | + $icon = 'mp3.png'; | |
| 208 | + break; | |
| 209 | + case 'wav': | |
| 210 | + $icon = 'wav.png'; | |
| 211 | + break; | |
| 212 | + case 'ogg': | |
| 213 | + case 'oga': | |
| 214 | + $icon = 'ogg.png'; | |
| 215 | + break; | |
| 216 | + case 'midi': | |
| 217 | + case 'mid': | |
| 218 | + $icon = 'midi.png'; | |
| 219 | + break; | |
| 220 | + case 'wma': | |
| 221 | + $icon = 'wma.png'; | |
| 222 | + break; | |
| 223 | + // Text formats | |
| 224 | + case 'rtx': | |
| 225 | + $icon = 'rtx.png'; | |
| 226 | + break; | |
| 227 | + case 'ics': | |
| 228 | + $icon = 'ics.png'; | |
| 229 | + break; | |
| 230 | + case 'csv': | |
| 231 | + $icon = 'csv.png'; | |
| 232 | + break; | |
| 233 | + // Msc application formats | |
| 234 | + case 'html': | |
| 235 | + case 'htm': // death to all who use this! | |
| 236 | + $icon = 'html.png'; | |
| 237 | + break; | |
| 238 | + case 'css': | |
| 239 | + $icon = 'css.png'; | |
| 240 | + break; | |
| 241 | + case 'js': | |
| 242 | + $icon = 'javascript.png'; | |
| 243 | + break; | |
| 244 | + case 'class': | |
| 245 | + $icon = 'java.png'; | |
| 246 | + break; | |
| 247 | + case 'zip': | |
| 248 | + $icon = 'zip.png'; | |
| 249 | + break; | |
| 250 | + case 'tar': | |
| 251 | + case 'gzip': | |
| 252 | + case 'gz': | |
| 253 | + case 'bz2': // not yet WP-supported | |
| 254 | + case 'tgz': // not yet WP-supported | |
| 255 | + $icon = 'compressed.png'; | |
| 256 | + break; | |
| 257 | + case 'rar': // RAWR!!! | |
| 258 | + $icon = 'rar.png'; | |
| 259 | + break; | |
| 260 | + case '7z': | |
| 261 | + $icon = '7zip.png'; | |
| 262 | + break; | |
| 263 | + case 'exec': | |
| 264 | + $icon = 'exec.png'; | |
| 265 | + break; | |
| 266 | + case 'rtf': | |
| 267 | + $icon = 'rtf.png'; | |
| 268 | + break; | |
| 269 | + case 'swf': | |
| 270 | + $icon = 'shockwave.png'; | |
| 271 | + break; | |
| 272 | + // OpenOffice formats | |
| 273 | + case 'odt': | |
| 274 | + $icon = 'opendocument-text.png'; | |
| 275 | + break; | |
| 276 | + case 'odp': | |
| 277 | + $icon = 'opendocument-presentation.png'; | |
| 278 | + break; | |
| 279 | + case 'ods': | |
| 280 | + $icon = 'opendocument-spreadsheet.png'; | |
| 281 | + break; | |
| 282 | + case 'odg': | |
| 283 | + $icon = 'opendocument-graphics.png'; | |
| 284 | + break; | |
| 285 | + case 'odb': | |
| 286 | + $icon = 'opendocument-database.png'; | |
| 287 | + break; | |
| 288 | + case 'odf': | |
| 289 | + $icon = 'opendocument-formula.png'; | |
| 290 | + break; | |
| 291 | + // fallback to default icons if not recognized | |
| 292 | + default: | |
| 293 | + // handle images | |
| 294 | + if( preg_match( '/^image/', $filetype['type'] ) && | |
| 295 | + ( $icon = wp_get_attachment_image( $id, 'thumbnail', false ) ) ) | |
| 296 | + return $icon; | |
| 297 | + | |
| 298 | + // fallback to wp defaults - get_attachment_icon is DEPRECIATED! (replaced in dg v1.1) | |
| 299 | + if( $icon = wp_get_attachment_image( $id, null, true ) ) | |
| 300 | + return $icon; | |
| 301 | + | |
| 302 | + return "<!-- Failed to retrive icon for attachment #$id -->"; // everything failed. This is bad... | |
| 303 | + } | |
| 304 | + | |
| 305 | + return '<img src="'.DG_URL."icons/$icon\" title=\"$title\" alt=\"$title\" />"; | |
| 306 | +} | |
| 307 | + | |
| 308 | +// Filtering attachment_icon was considered, then dismissed in v1.0.3 because it would mean almost | |
| 309 | +// doubling the amount of processing for each icon. The native WP function would create the icon, | |
| 310 | +// then 99% of the time this function would replace it. Better to just call the native WP function | |
| 311 | +// at the end when needed. Filter would look like this: | |
| 312 | +// add_filter( 'attachment_icon', 'dg_get_attachment_icon', 10, 2 );v | |
| 313 | + | |
| 314 | +// ADD SOME STYLING // | |
| 36 | 315 | function dg_add_header_css() { |
| 37 | - wp_enqueue_style('document-gallery-css', DG_URL . 'style.css'); | |
| 316 | + wp_enqueue_style( 'document-gallery-css', plugins_url('style.css', __FILE__) ); | |
| 38 | 317 | } |
| 39 | -add_action('wp_print_styles', 'dg_add_header_css'); | |
| 318 | +add_action( 'wp_print_styles', 'dg_add_header_css'); | |
| 319 | + | |
| 320 | +?> | |