PluginProbe
Document Gallery / 1.2
Document Gallery v1.2
trunk 0.8 0.8.5 1.0 1.0.1 1.0.2 1.0.3 1.0.4 1.1 1.2 1.2.1 1.3 1.3.1 1.4 1.4.1 1.4.2 1.4.3 2.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 All 94 releases
← All changes | document-gallery.php +290 -126 trunk1.2 View file →
@@ -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 &ge; 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 +?>