/** * Initialize the thumber class for use in thumbnail generation. */ public static function init() { $options = DG_Thumber::getOptions(); $active = $options['active']; if ($active['imagick']) { parent::init(); } }
/** * @param string $ID The attachment ID to retrieve thumbnail from. * * @return bool|string False on failure, URL to thumb on success. */ private static function getImageThumbnail($ID) { $options = DG_Thumber::getOptions(); $ret = false; if ($icon = image_downsize($ID, array($options['width'], $options['height']))) { $ret = $icon[0]; } return $ret; }
/** * @param int $ID The attachment ID. * @param int $pg The page to thumbnail. * * @return bool Always false. Asynchronously set the thumbnail in webhook later. */ public function getThumbnail($ID, $pg = 1) { global $dg_options; include_once DG_PATH . 'inc/thumbers/thumber-co/thumber-client/client.php'; include_once DG_PATH . 'inc/thumbers/thumber-co/thumber-client/thumb-request.php'; $options = DG_Thumber::getOptions(); $url_or_path = get_attached_file($ID); if (!self::checkGeometry($options['width'], $options['height'])) { DG_Logger::writeLog(DG_LogLevel::Detail, "Skipping attachment #{$ID} as it exceeds Thumber.co subscription geometry limit."); return false; } if (!self::checkFileSize($url_or_path)) { DG_Logger::writeLog(DG_LogLevel::Detail, "Skipping attachment #{$ID} as it exceeds Thumber.co subscription file size limit."); return false; } $mime_type = get_post_mime_type($ID); if (!$dg_options['thumber-co']['direct_upload']) { $url_or_path = wp_get_attachment_url($ID); } if (!$url_or_path || !$mime_type) { return false; } $req = new ThumberThumbReq(); $req->setCallback(self::$webhook); $req->setMimeType($mime_type); $req->setNonce($ID . self::NonceSeparator . md5(microtime())); $req->setPg($pg); $req->setGeometry($options['width'] . 'x' . $options['height']); if ($dg_options['thumber-co']['direct_upload']) { $req->setDecodedData(file_get_contents($url_or_path)); } else { $req->setUrl($url_or_path); } $resp = self::$client->sendThumbRequest($req); if ($resp['http_code'] < 200 || $resp['http_code'] > 399) { DG_Logger::writeLog(DG_LogLevel::Error, 'Failed to transmit to server: ' . $resp['body']); } // always returns false -- we set the thumbnail later when webhook is hit return false; }
/** * Runs when DG is uninstalled for an individual blog. */ private static function _uninstall($blog) { $options = DG_Thumber::getOptions($blog); if (is_null($options)) { return; } foreach ($options['thumbs'] as $val) { if (isset($val['thumber'])) { @unlink($val['thumb_path']); } } DocumentGallery::deleteOptions($blog); }
/** * Render the Thumbnail table. */ public static function renderThumbnailSection() { include_once DG_PATH . 'inc/class-thumber.php'; $options = DG_Thumber::getOptions(); $URL_params = array('page' => DG_OPTION_NAME, 'tab' => 'Thumbnail'); $att_ids = array(); if (isset($_REQUEST['orderby']) && in_array(strtolower($_REQUEST['orderby']), array('title', 'date'))) { $orderby = strtolower($_REQUEST['orderby']); $URL_params['orderby'] = $orderby; switch ($orderby) { case 'date': foreach ($options['thumbs'] as $key => $node) { $keyArray[$key] = $node['timestamp']; $options['thumbs'][$key]['thumb_id'] = $att_ids[] = $key; } break; case 'title': foreach ($options['thumbs'] as $key => $node) { $keyArray[$key] = basename($node['thumb_path']); $options['thumbs'][$key]['thumb_id'] = $att_ids[] = $key; } break; } $order = strtolower($_REQUEST['order']); if (!isset($_REQUEST['order']) || !in_array($order, array('asc', 'desc'))) { $order = 'asc'; } $URL_params['order'] = $order; if ($order == 'asc') { array_multisort($keyArray, SORT_ASC, $options['thumbs']); } else { array_multisort($keyArray, SORT_DESC, $options['thumbs']); } } else { $orderby = ''; foreach ($options['thumbs'] as $key => $node) { $options['thumbs'][$key]['thumb_id'] = $att_ids[] = $key; } } static $limit_options = array(10, 25, 75); if (!isset($_REQUEST['limit']) || !in_array(intval($_REQUEST['limit']), $limit_options)) { $limit = $limit_options[0]; } else { $limit = intval($_REQUEST['limit']); } $URL_params['limit'] = $limit; $select_limit = ''; foreach ($limit_options as $l_o) { $select_limit .= '<option value="' . $l_o . '"' . selected($limit, $l_o, false) . '>' . $l_o . '</option>' . PHP_EOL; } $thumbs_number = count($options['thumbs']); $lastsheet = ceil($thumbs_number / $limit); $sheet = isset($_REQUEST['sheet']) ? intval($_REQUEST['sheet']) : 1; if ($sheet <= 0 || $sheet > $lastsheet) { $sheet = 1; } $offset = ($sheet - 1) * $limit; $att_ids = array_slice($att_ids, $offset, $limit); // https://core.trac.wordpress.org/ticket/12212 $atts = array(); if (!empty($att_ids)) { $atts = get_posts(array('post_type' => 'any', 'post_status' => 'any', 'numberposts' => -1, 'post__in' => $att_ids, 'orderby' => 'post__in')); } $titles = array(); $contents = array(); foreach ($atts as $att) { $path_parts = pathinfo($att->guid); $titles[$att->ID] = !empty($att->post_title) ? $att->post_title : $path_parts['filename']; $types[$att->ID] = $path_parts['extension']; $contents[$att->ID] = $att->post_content; } unset($atts); $thead = '<tr>' . '<th scope="col" class="manage-column column-cb check-column">' . '<label class="screen-reader-text" for="cb-select-all-%1$d">' . __('Select All', 'document-gallery') . '</label>' . '<input id="cb-select-all-%1$d" type="checkbox">' . '</th>' . '<th scope="col" class="manage-column column-icon">' . __('Thumbnail', 'document-gallery') . '</th>' . '<th scope="col" class="manage-column column-title ' . ($orderby != 'title' ? 'sortable desc' : 'sorted ' . $order) . '"><a href="?' . http_build_query(array_merge($URL_params, array('orderby' => 'title', 'order' => $orderby != 'title' ? 'asc' : ($order == 'asc' ? 'desc' : 'asc')))) . '"><span>' . __('File name', 'document-gallery') . '</span><span class="sorting-indicator"></span></th>' . '<th scope="col" class="manage-column column-description">' . __('Description', 'document-gallery') . '</th>' . '<th scope="col" class="manage-column column-thumbupload"></th>' . '<th scope="col" class="manage-column column-date ' . ($orderby != 'date' ? 'sortable asc' : 'sorted ' . $order) . '"><a href="?' . http_build_query(array_merge($URL_params, array('orderby' => 'date', 'order' => $orderby != 'date' ? 'desc' : ($order == 'asc' ? 'desc' : 'asc')))) . '"><span>' . __('Date', 'document-gallery') . '</span><span class="sorting-indicator"></span></th>' . '</tr>'; $pagination = '<div class="alignleft bulkactions"><button class="button action deleteSelected">' . __('Delete Selected', 'document-gallery') . '</button></div><div class="tablenav-pages">' . '<span class="displaying-num">' . $thumbs_number . ' ' . _n('item', 'items', $thumbs_number) . '</span>' . ($lastsheet > 1 ? '<span class="pagination-links">' . '<a class="first-page' . ($sheet == 1 ? ' disabled' : '') . '" title="' . __('Go to the first page', 'document-gallery') . '"' . ($sheet == 1 ? '' : ' href="?' . http_build_query($URL_params) . '"') . '>«</a>' . '<a class="prev-page' . ($sheet == 1 ? ' disabled' : '') . '" title="' . __('Go to the previous page', 'document-gallery') . '"' . ($sheet == 1 ? '' : ' href="?' . http_build_query(array_merge($URL_params, array('sheet' => $sheet - 1))) . '"') . '>‹</a>' . '<span class="paging-input">' . '<input class="current-page" title="' . __('Current page', 'document-gallery') . '" type="text" name="paged" value="' . $sheet . '" size="' . strlen($sheet) . '" maxlength="' . strlen($sheet) . '"> ' . __('of', 'document-gallery') . ' <span class="total-pages">' . $lastsheet . '</span></span>' . '<a class="next-page' . ($sheet == $lastsheet ? ' disabled' : '') . '" title="' . __('Go to the next page', 'document-gallery') . '"' . ($sheet == $lastsheet ? '' : ' href="?' . http_build_query(array_merge($URL_params, array('sheet' => $sheet + 1))) . '"') . '>›</a>' . '<a class="last-page' . ($sheet == $lastsheet ? ' disabled' : '') . '" title="' . __('Go to the last page', 'document-gallery') . '"' . ($sheet == $lastsheet ? '' : ' href="?' . http_build_query(array_merge($URL_params, array('sheet' => $lastsheet))) . '"') . '>»</a>' . '</span>' : ' <b>|</b> ') . '<span class="displaying-num"><select dir="rtl" class="limit_per_page">' . $select_limit . '</select> ' . __('items per page', 'document-gallery') . '</span>' . '</div>' . '<br class="clear" />'; ?> <script type="text/javascript"> var URL_params = <?php echo wp_json_encode($URL_params); ?> ; </script> <div class="thumbs-list-wrapper"> <div> <div class="tablenav top"><?php echo $pagination; ?> </div> <table id="ThumbsTable" class="wp-list-table widefat fixed media" cellpadding="0" cellspacing="0"> <thead> <?php printf($thead, 1); ?> </thead> <tfoot> <?php printf($thead, 2); ?> </tfoot> <tbody><?php $i = 0; foreach ($options['thumbs'] as $v) { if ($i < $offset) { $i++; continue; } if (++$i > $offset + $limit) { break; } $icon = isset($v['thumb_url']) ? $v['thumb_url'] : DG_Thumber::getDefaultThumbnail($v['thumb_id']); $title = isset($titles[$v['thumb_id']]) ? $titles[$v['thumb_id']] : ''; $type = $types[$v['thumb_id']]; $description = $contents[$v['thumb_id']]; $date = DocumentGallery::localDateTimeFromTimestamp($v['timestamp']); ?> <tr data-entry="<?php echo $v['thumb_id']; ?> "> <td scope="row" class="check-column"> <input type="checkbox" class="cb-ids" name="<?php echo DG_OPTION_NAME; ?> [ids][]" value="<?php echo $v['thumb_id']; ?> "> </td> <td class="column-icon media-icon"><img src="<?php echo $icon; ?> " /></td> <td class="title column-title"> <strong> <a href="<?php echo home_url('/?attachment_id=' . $v['thumb_id']); ?> " target="_blank" title="<?php sprintf(__("View '%s' attachment page", 'document-gallery'), $title); ?> "> <span class="editable-title"><?php echo $title; ?> </span> <sup><?php echo $type; ?> </sup> </a> </strong> <span class="dashicons dashicons-edit"></span> <span class="edit-controls"> <span class="dashicons dashicons-yes"></span> <span class="dashicons dashicons-no"></span> </span> </td> <td class="column-description"> <div class="editable-description"><?php echo $description; ?> </div> <span class="dashicons dashicons-edit"></span> <span class="edit-controls"> <span class="dashicons dashicons-yes"></span> <span class="dashicons dashicons-no"></span> <span class="dashicons dashicons-update"></span> </span> </td> <td class="column-thumbupload"> <span class="manual-download"> <span class="dashicons dashicons-upload"></span> <span class="html5dndmarker">Drop file here<span> or </span></span> <span class="buttons-area"> <input id="upload-button<?php echo $v['thumb_id']; ?> " type="file" /> <input id="trigger-button<?php echo $v['thumb_id']; ?> " type="button" value="Select File" class="button" /> </span> </span> <div class="progress animate invis"> <span><span></span></span> </div> </td> <td class="date column-date"><?php echo $date; ?> </td> </tr> <?php } ?> </tbody> </table> <div class="tablenav bottom"><?php echo $pagination; ?> </div> </div> </div> <?php }
/** * Render a Meta Box. * @param $post WP_Post The post. */ public static function renderMetaBox($post) { // Disabling scripts that have nothing to do with Edit Media pages wp_dequeue_script('dg-media-manager'); remove_filter('mce_external_plugins', array(__CLASS__, 'mce_external_plugins')); remove_filter('mce_css', array(__CLASS__, 'dg_plugin_mce_css')); wp_nonce_field(DG_OPTION_NAME . '_meta_box', DG_OPTION_NAME . '_meta_box_nonce'); $ID = $post->ID; $options = DG_Thumber::getOptions(); $thumb = DG_Thumb::getThumb($ID, $options['width'] . 'x' . $options['height']); $icon = !is_null($thumb) && $thumb->isSuccess() ? $thumb->getUrl() : DG_DefaultThumber::getInstance()->getThumbnail($ID); echo '<table id="ThumbsTable" class="wp-list-table widefat fixed media" cellpadding="0" cellspacing="0">' . '<tbody><tr data-entry="' . $ID . '"><td class="column-icon media-icon"><img src="' . $icon . '" />' . '</td><td class="column-thumbupload">' . '<span class="manual-download">' . '<span class="dashicons dashicons-upload"></span>' . '<span class="html5dndmarker">Drop file here<span> or </span></span>' . '<span class="buttons-area">' . '<input id="upload-button' . $ID . '" type="file" />' . '<input id="trigger-button' . $ID . '" type="button" value="Select File" class="button" />' . '</span>' . '</span>' . '</td></tr></tbody></table>' . (is_null($thumb) ? '<span class="dashicons dashicons-info"></span><span class="">Please note this attachment hasn't been used in any Document Gallery instance and so there is no autogenerated thumbnail, in the meantime default one is used instead.</span>' : '') . PHP_EOL; }
/** * Render the Thumbnail table. */ function dg_render_thumbnail_section() { global $dg_url_params; include_once DG_PATH . 'inc/class-thumber.php'; static $limit_options = array(10, 25, 75); static $order_options = array('asc', 'desc'); static $orderby_options = array('date', 'title'); $options = DG_Thumber::getOptions(); // find subset of thumbs to be included $orderby = $dg_url_params['orderby'] = dg_get_orderby_param($orderby_options); $order = $dg_url_params['order'] = dg_get_order_param($order_options); $limit = $dg_url_params['limit'] = dg_get_limit_param(); /** @var DG_Thumb[] $thumbs */ $thumbs = DG_Thumb::getThumbs($options['width'] . 'x' . $options['height']); uasort($thumbs, 'dg_cmp_thumb'); $thumbs_number = count($thumbs); $lastsheet = ceil($thumbs_number / $limit); $sheet = isset($_REQUEST['sheet']) ? absint($_REQUEST['sheet']) : 1; if ($sheet === 0 || $sheet > $lastsheet) { $sheet = 1; } $offset = ($sheet - 1) * $limit; $thumbs = array_slice($thumbs, $offset, $limit, true); // https://core.trac.wordpress.org/ticket/12212 $posts = array(); if (!empty($thumbs)) { $posts = get_posts(array('post_type' => 'any', 'post_status' => 'any', 'numberposts' => -1, 'post__in' => array_keys($thumbs), 'orderby' => 'post__in')); } foreach ($posts as $post) { $path_parts = pathinfo($post->guid); $thumb = $thumbs[$post->ID]; $thumbs[$post->ID] = array(); $t =& $thumbs[$post->ID]; $t['timestamp'] = $thumb->getTimestamp(); $t['title'] = dg_get_thumb_title($post); $t['ext'] = isset($path_parts['extension']) ? $path_parts['extension'] : ''; $t['description'] = $post->post_content; $t['icon'] = $thumb->isSuccess() ? $thumb->getUrl() : DG_DefaultThumber::getInstance()->getThumbnail($post->ID); } unset($posts); $select_limit = ''; foreach ($limit_options as $l_o) { $select_limit .= '<option value="' . $l_o . '"' . selected($limit, $l_o, false) . '>' . $l_o . '</option>' . PHP_EOL; } $thead = '<tr>' . '<th scope="col" class="manage-column column-cb check-column">' . '<label class="screen-reader-text" for="cb-select-all-%1$d">' . __('Select All', 'document-gallery') . '</label>' . '<input id="cb-select-all-%1$d" type="checkbox">' . '</th>' . '<th scope="col" class="manage-column column-icon">' . __('Thumbnail', 'document-gallery') . '</th>' . '<th scope="col" class="manage-column column-title ' . ($orderby != 'title' ? 'sortable desc' : 'sorted ' . $order) . '"><a href="?' . http_build_query(array_merge($dg_url_params, array('orderby' => 'title', 'order' => $orderby != 'title' ? 'asc' : ($order == 'asc' ? 'desc' : 'asc')))) . '"><span>' . __('File name', 'document-gallery') . '</span><span class="sorting-indicator"></span></th>' . '<th scope="col" class="manage-column column-description">' . __('Description', 'document-gallery') . '</th>' . '<th scope="col" class="manage-column column-thumbupload"></th>' . '<th scope="col" class="manage-column column-date ' . ($orderby != 'date' ? 'sortable asc' : 'sorted ' . $order) . '"><a href="?' . http_build_query(array_merge($dg_url_params, array('orderby' => 'date', 'order' => $orderby != 'date' ? 'desc' : ($order == 'asc' ? 'desc' : 'asc')))) . '"><span>' . __('Date', 'document-gallery') . '</span><span class="sorting-indicator"></span></th>' . '</tr>'; $pagination = '<div class="alignleft bulkactions"><button class="button action deleteSelected">' . __('Delete Selected', 'document-gallery') . '</button></div><div class="tablenav-pages">' . '<span class="displaying-num">' . $thumbs_number . ' ' . _n('item', 'items', $thumbs_number, 'document-gallery') . '</span>' . ($lastsheet > 1 ? '<span class="pagination-links">' . '<a class="first-page' . ($sheet == 1 ? ' disabled' : '') . '" title="' . __('Go to the first page', 'document-gallery') . '"' . ($sheet == 1 ? '' : ' href="?' . http_build_query($dg_url_params) . '"') . '>«</a>' . '<a class="prev-page' . ($sheet == 1 ? ' disabled' : '') . '" title="' . __('Go to the previous page', 'document-gallery') . '"' . ($sheet == 1 ? '' : ' href="?' . http_build_query(array_merge($dg_url_params, array('sheet' => $sheet - 1))) . '"') . '>‹</a>' . '<span class="paging-input">' . '<input class="current-page" title="' . __('Current page', 'document-gallery') . '" type="text" name="paged" value="' . $sheet . '" size="' . strlen($sheet) . '" maxlength="' . strlen($sheet) . '"> ' . __('of', 'document-gallery') . ' <span class="total-pages">' . $lastsheet . '</span></span>' . '<a class="next-page' . ($sheet == $lastsheet ? ' disabled' : '') . '" title="' . __('Go to the next page', 'document-gallery') . '"' . ($sheet == $lastsheet ? '' : ' href="?' . http_build_query(array_merge($dg_url_params, array('sheet' => $sheet + 1))) . '"') . '>›</a>' . '<a class="last-page' . ($sheet == $lastsheet ? ' disabled' : '') . '" title="' . __('Go to the last page', 'document-gallery') . '"' . ($sheet == $lastsheet ? '' : ' href="?' . http_build_query(array_merge($dg_url_params, array('sheet' => $lastsheet))) . '"') . '>»</a>' . '</span>' : ' <b>|</b> ') . '<span class="displaying-num"><select dir="rtl" class="limit_per_page">' . $select_limit . '</select> ' . __('items per page', 'document-gallery') . '</span>' . '</div>' . '<br class="clear" />'; ?> <script type="text/javascript"> var URL_params = <?php echo wp_json_encode($dg_url_params); ?> ; </script> <div class="thumbs-list-wrapper"> <div> <div class="tablenav top"><?php echo $pagination; ?> </div> <table id="ThumbsTable" class="wp-list-table widefat fixed media" cellpadding="0" cellspacing="0"> <thead> <?php printf($thead, 1); ?> </thead> <tfoot> <?php printf($thead, 2); ?> </tfoot> <tbody><?php foreach ($thumbs as $tid => $thumb) { $icon = $thumb['icon']; $title = $thumb['title']; $ext = $thumb['ext']; $description = $thumb['description']; $date = DocumentGallery::localDateTimeFromTimestamp($thumb['timestamp']); ?> <tr data-entry="<?php echo $tid; ?> "> <td scope="row" class="check-column"> <input type="checkbox" class="cb-ids" name="<?php echo DG_OPTION_NAME; ?> [ids][]" value="<?php echo $tid; ?> "> </td> <td class="column-icon media-icon"><img src="<?php echo $icon; ?> " /></td> <td class="title column-title"> <strong> <a href="<?php echo home_url('/?attachment_id=' . $tid); ?> " target="_blank" title="<?php sprintf(__("View '%s' attachment page", 'document-gallery'), $title); ?> "> <span class="editable-title"><?php echo $title; ?> </span> <sup><?php echo $ext; ?> </sup> </a> </strong> <span class="dashicons dashicons-edit"></span> <span class="edit-controls"> <span class="dashicons dashicons-yes"></span> <span class="dashicons dashicons-no"></span> </span> </td> <td class="column-description"> <div class="editable-description"><?php echo $description; ?> </div> <span class="dashicons dashicons-edit"></span> <span class="edit-controls"> <span class="dashicons dashicons-yes"></span> <span class="dashicons dashicons-no"></span> <span class="dashicons dashicons-update"></span> </span> </td> <td class="column-thumbupload"> <span class="manual-download"> <span class="dashicons dashicons-upload"></span> <span class="html5dndmarker">Drop file here<span> or </span></span> <span class="buttons-area"> <input id="upload-button<?php echo $tid; ?> " type="file" /> <input id="trigger-button<?php echo $tid; ?> " type="button" value="Select File" class="button" /> </span> </span> <div class="progress animate invis"> <span><span></span></span> </div> </td> <td class="date column-date"><?php echo $date; ?> </td> </tr> <?php } ?> </tbody> </table> <div class="tablenav bottom"><?php echo $pagination; ?> </div> </div> </div> <?php }
/** * @return bool Whether we can use the GS executable. */ public static function isGhostscriptAvailable() { static $ret = null; if (is_null($ret)) { $options = DG_Thumber::getOptions(); $ret = $options['gs'] && self::isExecAvailable(); } return $ret; }