| @@ -1,156 +1,320 @@ | ||
| 1 | 1 | <?php |
| 2 | -defined( 'WPINC' ) OR exit; | |
| 2 | +/* | |
| 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 | +*/ | |
| 3 | 10 | |
| 4 | -/** | |
| 5 | - * Plugin Name: Document Gallery | |
| 6 | - * Plugin URI: https://wordpress.org/plugins/document-gallery/ | |
| 7 | - * Description: Display non-images (and images) in gallery format on a page or post. | |
| 8 | - * Version: 5.1.1 | |
| 9 | - * Requires at least: 6.1 | |
| 10 | - * Requires PHP: 5.6 | |
| 11 | - * Author: Dan Rossiter | |
| 12 | - * Author URI: https://www.linkedin.com/in/danrossiter/ | |
| 13 | - * License: GPLv3 | |
| 14 | - * License URI: https://www.gnu.org/licenses/gpl-3.0.html | |
| 15 | - * Text Domain: document-gallery | |
| 16 | - * | |
| 17 | - * @package create-block | |
| 18 | - */ | |
| 11 | +define( 'DG_URL', plugin_dir_url( __FILE__ ) ); | |
| 19 | 12 | |
| 20 | -define( 'DG_VERSION', '5.1.1' ); | |
| 13 | +// CREATE GALLERY STRING // | |
| 14 | +function dg_get_attachment_icons($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) ); | |
| 21 | 23 | |
| 22 | -if ( version_compare( PHP_VERSION, '5.6', '<' ) ) { | |
| 23 | - add_action( 'admin_notices', 'dg_php_lt_five_six' ); | |
| 24 | - function dg_php_lt_five_six() { ?> | |
| 25 | - <div class="error"><p> | |
| 26 | - <?php printf( __( 'Document Gallery requires PHP ≥ 5.6. Your server is running version %s.', 'document-gallery' ), PHP_VERSION ); ?> | |
| 27 | - </p></div> | |
| 28 | - <?php } | |
| 24 | + // INIT | |
| 25 | + $attachments = array(); | |
| 26 | + $errs = array(); | |
| 29 | 27 | |
| 30 | - return; | |
| 31 | -} | |
| 32 | 28 | |
| 33 | -// define helper paths & URLs | |
| 34 | -define( 'DG_BASENAME', plugin_basename( __FILE__ ) ); | |
| 35 | -define( 'DG_URL', plugin_dir_url( __FILE__ ) . 'src/' ); | |
| 36 | -define( 'DG_PATH', plugin_dir_path( __FILE__ ) . 'src/' ); | |
| 37 | -define( 'DG_WPINC_PATH', ABSPATH . WPINC . '/' ); | |
| 38 | -define( 'DG_WPADMIN_PATH', ABSPATH . 'wp-admin/' ); | |
| 29 | + // ATTRIBUTE VALIDATION | |
| 30 | + if( strtolower($descriptions) == "false" ){ $descriptions = FALSE; } | |
| 39 | 31 | |
| 40 | -// init DG options for use throughout plugin | |
| 41 | -global $dg_options; | |
| 42 | -define( 'DG_OPTION_NAME', 'document_gallery' ); | |
| 43 | -$dg_options = get_option( DG_OPTION_NAME, null ); | |
| 32 | + $order = strtoupper( $order ); | |
| 33 | + if($order != 'ASC' && $order != 'DEC') | |
| 34 | + $errs[] = "The order attribute must be either ASC or DEC. You entered $order."; | |
| 44 | 35 | |
| 45 | -// core functionality | |
| 46 | -include_once DG_PATH . 'inc/class-document-gallery.php'; | |
| 47 | -include_once DG_PATH . 'inc/class-thumb.php'; | |
| 48 | -include_once DG_PATH . 'inc/class-util.php'; | |
| 36 | + if( strtolower($attachment_pg) == "false" ){ $attachment_pg = FALSE; } | |
| 49 | 37 | |
| 50 | -// logging functionality | |
| 51 | -include_once DG_PATH . 'inc/class-logger.php'; | |
| 52 | -add_action( DG_Logger::PurgeLogsAction, array( 'DG_Logger', 'purgeExpiredEntries' ) ); | |
| 38 | + if( strtolower($images) == "false" ){ $images = FALSE; } | |
| 53 | 39 | |
| 54 | -// handle activation, updates, and uninstallation | |
| 55 | -include_once DG_PATH . 'inc/class-setup.php'; | |
| 56 | -register_activation_hook( __FILE__, array( 'DG_Setup', 'activate' ) ); | |
| 57 | -add_action( 'wpmu_new_blog', array( 'DG_Setup', 'activateNewBlog' ) ); | |
| 58 | -register_uninstall_hook( __FILE__, array( 'DG_Setup', 'uninstall' ) ); | |
| 59 | -DG_Setup::maybeUpdate(); | |
| 40 | + if( strtolower($ids) ){ $ids = FALSE; } | |
| 60 | 41 | |
| 61 | -// ensure we don't allow invalid option structure | |
| 62 | -add_action( 'init', array( 'DocumentGallery', 'addValidation' ) ); | |
| 42 | + // http://www.youtube.com/watch?v=ClnSMCdw6E8 | |
| 43 | + if( $errs ) return implode(' ', $errs); | |
| 44 | + // END VALIDATION (WE MADE IT!) | |
| 63 | 45 | |
| 64 | -// I18n | |
| 65 | -add_action( 'plugins_loaded', array( 'DocumentGallery', 'loadTextDomain' ) ); | |
| 66 | 46 | |
| 67 | -if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { | |
| 68 | - add_action( ( is_admin() ? 'admin' : 'wp' ) . '_footer', 'dg_debug_data' ); | |
| 69 | - function dg_debug_data() { | |
| 70 | - echo '<!-- ' . PHP_EOL; | |
| 71 | - echo 'Document Gallery Count: ' . ( class_exists( 'DG_Gallery' ) ? count( DG_Gallery::getGalleries() ) : 0 ) . PHP_EOL; | |
| 72 | - echo ' -->' . PHP_EOL; | |
| 47 | + // LET'S GET SOME DOCUMENTS! | |
| 48 | + if( $ids && ( $ids = explode( ',', $ids ) ) ){ | |
| 49 | + $attachments = dg_get_attachments_by_ids( $ids ); | |
| 73 | 50 | } |
| 74 | -} | |
| 75 | 51 | |
| 76 | -// cleanup cached data when thumbed attachment deleted | |
| 77 | -include_once DG_PATH . 'inc/class-thumber.php'; | |
| 78 | -add_action( 'delete_attachment', array( 'DG_Thumb', 'cleanupAttachmentMeta' ) ); | |
| 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'; | |
| 79 | 62 | |
| 80 | -if ( is_admin() ) { | |
| 81 | - // admin house keeping | |
| 82 | - include_once DG_PATH . 'admin/class-admin.php'; | |
| 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 ); | |
| 83 | 69 | |
| 84 | - // AJAX handling | |
| 85 | - include_once DG_PATH . 'admin/class-ajax-handler.php'; | |
| 70 | + $count = 0; | |
| 71 | + foreach( $attachments as $attachment ) { //setup array for more than one file attachment | |
| 72 | + $url = $attachment->guid; | |
| 73 | + $filename = basename( $url ); | |
| 86 | 74 | |
| 87 | - // add links to plugin index | |
| 88 | - add_filter( 'plugin_action_links_' . DG_BASENAME, array( 'DG_Admin', 'addSettingsLink' ) ); | |
| 89 | - add_filter( 'plugin_row_meta', array( 'DG_Admin', 'addDonateLink' ), 10, 2 ); | |
| 75 | + if( $attachment_pg ) // link to attachment page | |
| 76 | + $url = get_attachment_link( $attachment->ID ); | |
| 90 | 77 | |
| 91 | - // build options page | |
| 92 | - add_action( 'admin_menu', array( 'DG_Admin', 'addAdminPage' ) ); | |
| 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 | + } | |
| 93 | 90 | |
| 94 | - // add meta box for managing thumbnail generation to attachment Edit Media page | |
| 95 | - add_action( 'add_meta_boxes', array( 'DG_Admin', 'addMetaBox' ) ); | |
| 96 | - add_action( 'wp_ajax_dg_upload_thumb', array( 'DG_Admin', 'saveMetaBox' ) ); | |
| 91 | + $attachment_str[] = " <a href=\"$url\">$icon<br>$title</a>".PHP_EOL; | |
| 97 | 92 | |
| 98 | - if ( DG_Admin::doRegisterSettings() ) { | |
| 99 | - add_action( 'admin_init', array( 'DG_Admin', 'registerSettings' ) ); | |
| 100 | - } | |
| 101 | -} else { | |
| 102 | - // styling for gallery | |
| 103 | - if ( apply_filters( 'dg_use_default_gallery_style', true ) ) { | |
| 104 | - add_action( 'wp_enqueue_scripts', array( 'DocumentGallery', 'enqueueGalleryStyle' ) ); | |
| 105 | - } | |
| 106 | - add_action( 'wp_print_scripts', array( 'DocumentGallery', 'printCustomStyle' ) ); | |
| 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 | |
| 107 | 104 | |
| 108 | - add_action( 'wp_enqueue_scripts', array( 'DocumentGallery', 'enqueueGalleryScript' ) ); | |
| 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; | |
| 109 | 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'); | |
| 110 | 119 | |
| 111 | -/** | |
| 112 | - * Registers the block using the metadata loaded from the `block.json` file. | |
| 113 | - * Behind the scenes, it registers also all assets so they can be enqueued | |
| 114 | - * through the block editor in the corresponding context. | |
| 115 | - * | |
| 116 | - * @see https://developer.wordpress.org/reference/functions/register_block_type/ | |
| 117 | - */ | |
| 118 | -function document_gallery_block_init() { | |
| 119 | - register_block_type( | |
| 120 | - __DIR__ . '/build/block', | |
| 121 | - array( 'render_callback' => 'document_gallery_block_render_callback' ) | |
| 122 | - ); | |
| 120 | + | |
| 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; | |
| 123 | 132 | } |
| 124 | -add_action( 'init', 'document_gallery_block_init' ); | |
| 125 | 133 | |
| 126 | -/** | |
| 127 | - * Pass default options to block editor script. | |
| 128 | - */ | |
| 129 | -function document_gallery_block_localize() { | |
| 130 | - global $dg_options; | |
| 131 | - | |
| 132 | - // Script handle is auto-generated: {namespace}-{block-name}-editor-script | |
| 133 | - wp_localize_script( | |
| 134 | - 'document-gallery-document-gallery-block-editor-script', | |
| 135 | - 'dgBlockConfig', | |
| 136 | - array( 'dgDefaults' => $dg_options['gallery'] ) | |
| 137 | - ); | |
| 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\" />"; | |
| 138 | 306 | } |
| 139 | -add_action( 'enqueue_block_editor_assets', 'document_gallery_block_localize' ); | |
| 140 | 307 | |
| 141 | -/** | |
| 142 | - * This function is called when the block is being rendered on the front end of the site | |
| 143 | - * | |
| 144 | - * @param array $attributes The array of attributes for this block. | |
| 145 | - * @param string $content Rendered block output. ie. <InnerBlocks.Content />. | |
| 146 | - * @param WP_Block $block_instance The instance of the WP_Block class that represents the block being rendered. | |
| 147 | - */ | |
| 148 | -function document_gallery_block_render_callback( $attributes, $content, $block_instance ) { | |
| 149 | - return DocumentGallery::doShortcode( $attributes ); | |
| 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 // | |
| 315 | +function dg_add_header_css() { | |
| 316 | + wp_enqueue_style( 'document-gallery-css', plugins_url('style.css', __FILE__) ); | |
| 150 | 317 | } |
| 318 | +add_action( 'wp_print_styles', 'dg_add_header_css'); | |
| 151 | 319 | |
| 152 | -// adds 'dg' shortcode | |
| 153 | -add_shortcode( 'dg', array( 'DocumentGallery', 'doShortcode' ) ); | |
| 154 | - | |
| 155 | -// public API for developers | |
| 156 | -include_once DG_PATH . 'inc/class-api.php'; | |
| 320 | +?> | |