Files
medicalalert-web-reloaded/wp/wp-content/plugins/wp-media-folder/class/class-orderby-media.php
2024-07-16 13:57:46 +00:00

405 lines
15 KiB
PHP

<?php
/* Prohibit direct script loading */
defined('ABSPATH') || die('No direct script access allowed!');
use Joomunited\WPMediaFolder\WpmfHelper;
/**
* Class WpmfOrderbyMedia
* This class that holds most of the order functionality for Media Folder.
*/
class WpmfOrderbyMedia
{
/**
* Wpmf_Orderby_Media constructor.
*/
public function __construct()
{
add_filter('manage_media_columns', array($this, 'manageMediaColumns'));
add_filter('manage_upload_sortable_columns', array($this, 'imwidthColumnRegisterSortable'));
add_filter('manage_media_custom_column', array($this, 'manageMediaCustomColumn'), 10, 2);
add_action('pre_get_posts', array($this, 'filter'), 0, 1);
add_filter('post_mime_types', array($this, 'modifyPostMimeTypes'));
}
/**
* Add file type to Filetype filter
*
* @param array $post_mime_types List of post mime types.
*
* @return array $post_mime_types
*/
public function modifyPostMimeTypes($post_mime_types)
{
if (empty($post_mime_types['wpmf-pdf'])) {
$post_mime_types['wpmf-pdf'] = array(__('PDF', 'wpmf'));
}
$post_mime_types['wpmf-other'] = array(__('Other', 'wpmf'));
return $post_mime_types;
}
/**
* Query attachment by file type
* Base on /wp-includes/class-wp-query.php
*
* @param object $query Params use to query attachment
*
* @return mixed $query
*/
public function filter($query)
{
$parse_url = parse_url(site_url());
$host = md5($parse_url['host']);
// phpcs:disable WordPress.Security.NonceVerification.Missing, WordPress.Security.NonceVerification.Recommended -- No action, nonce is not required
global $pagenow;
if (!isset($query->query_vars['post_type']) || $query->query_vars['post_type'] !== 'attachment') {
return $query;
}
if (!empty($query->query_vars['wpmf_gallery']) || !empty($query->query_vars['wpmf_download_folder'])) {
return $query;
}
$orderby = 'date';
$order = 'DESC';
$sort_media = 'all';
if ($pagenow === 'upload.php') {
if (!empty($_COOKIE['media-order-media' . $host])) {
$sort_media = $_COOKIE['media-order-media' . $host];
}
if (isset($_GET['media-order-media'])) {
$sort_media = $_GET['media-order-media'];
}
if ($sort_media === 'custom') {
$query->set('meta_key', 'wpmf_order');
$orderby = 'meta_value_num';
$order = 'ASC';
} else {
if ($sort_media !== 'all') {
$sorts = explode('|', $sort_media);
$orderby = $sorts[0];
$order = $sorts[1];
}
}
if (!empty($_GET['orderby'])) {
$orderby = $_GET['orderby'];
}
if (!empty($_GET['order'])) {
$order = $_GET['order'];
}
if ($orderby === 'size') {
$query->set('meta_key', 'wpmf_size');
$query->set('orderby', 'meta_value_num');
$query->set('order', $order);
} elseif ($orderby === 'filetype') {
$query->set('meta_key', 'wpmf_filetype');
$query->set('orderby', 'meta_value');
$query->set('order', $order);
} else {
$query->set('orderby', $orderby);
$query->set('order', $order);
}
} else {
if (isset($_REQUEST['query']['meta_key']) && isset($_REQUEST['query']['wpmf_orderby'])) {
$query->query_vars['meta_key'] = $_REQUEST['query']['meta_key'];
$query->query_vars['orderby'] = $_REQUEST['query']['wpmf_orderby'];
}
$query->query_vars['ignore_custom_sort'] = true;
}
global $pagenow;
$dates = array();
if (!isset($_GET['attachment_dates']) && !isset($_REQUEST['query']['wpmf_date'])) {
if (isset($_COOKIE['wpmf_wpmf_date' . $host]) && $_COOKIE['wpmf_wpmf_date' . $host] !== '' && $_COOKIE['wpmf_wpmf_date' . $host] !== 'all') {
$dates = explode(',', $_COOKIE['wpmf_wpmf_date' . $host]);
}
} else {
if ($pagenow === 'upload.php') {
if (isset($_GET['attachment_dates'])) {
$dates = explode(',', $_GET['attachment_dates']);
}
} else {
if (!empty($_REQUEST['query']['wpmf_date'])) {
$dates = explode(',', $_REQUEST['query']['wpmf_date']);
}
}
}
if (!empty($dates)) {
$date_query = array();
if (!empty($dates)) {
$date_query['relation'] = 'OR';
foreach ($dates as $date) {
if ((int)$date !== 0 && strlen($date) > 4) {
$year = substr($date, 0, 4);
$month = substr($date, 4, 2);
$date_query[] = array(
'year' => $year,
'month' => $month
);
}
}
$query->query_vars['date_query'] = $date_query;
}
}
$user_id = get_current_user_id();
$filetype = array('all');
// Load file type from $query->query_vars
// When run WP_Query from other plugin/theme
// ex: $media_attachments_query = new WP_Query( 'post_type=attachment&post_mime_type=oembed/gallery&posts_per_page=-1&post_status=any' );
if (isset($query->query_vars['post_mime_type'])) {
if (is_array($query->query_vars['post_mime_type'])) {
$filetype = $query->query_vars['post_mime_type'];
} else {
$filetype = explode(',', $query->query_vars['post_mime_type']);
}
} elseif (!isset($_GET['attachment_types']) && !isset($_REQUEST['query']['post_mime_type'])) {
// load file type filter from cookie
if (isset($_COOKIE['wpmf_post_mime_type' . $host]) && $_COOKIE['wpmf_post_mime_type' . $host] !== '' && $_COOKIE['wpmf_post_mime_type' . $host] !== 'all') {
$filetype = $_COOKIE['wpmf_post_mime_type' . $host];
if ($filetype !== '') {
$filetype = explode(',', $filetype);
}
}
if (in_array('trash', $filetype) && $pagenow === 'upload.php') {
$filetype = array();
}
} else {
// load file type filter from url
if (!empty($_GET['attachment_types'])) {
$filetype = explode(',', $_GET['attachment_types']);
}
// load file type filter from ajax params
if (!empty($_REQUEST['query']['post_mime_type'])) {
if (is_array($_REQUEST['query']['post_mime_type'])) {
$filetype = $_REQUEST['query']['post_mime_type'];
} else {
$filetype = explode(',', $_REQUEST['query']['post_mime_type']);
}
}
}
if (in_array('mine', $filetype)) {
$query->set('author', $user_id);
}
if (!empty($filetype)) {
if (is_array($filetype) && in_array('all', $filetype)) {
$query->query_vars['post_mime_type'] = '';
return $query;
}
$extensions = array();
$mimetypes = array();
foreach ($filetype as $ft) {
$ft = str_replace('post_mime_type:', '', $ft);
if (strpos($ft, 'application/') !== false) {
$extensions = array_merge($extensions, array('application'));
$mimetypes[] = $ft;
}
if ($ft === 'unattached' || $ft === 'detached') {
$query->query_vars['post_parent'] = 0;
}
if ($ft === 'trash') {
$query->query_vars['post_status'] = 'trash';
}
if ($ft === 'uploaded') {
$query->query_vars['post_parent'] = $_REQUEST['post_id'];
}
if ($ft === 'mine') {
$query->query_vars['author'] = $user_id;
}
switch ($ft) {
case 'audio':
$extensions = array_merge($extensions, wp_get_audio_extensions());
break;
case 'video':
$extensions = array_merge($extensions, wp_get_video_extensions(), array('mpg', 'mov', 'avi', 'wmv', '3gp', '3g2'));
break;
case 'image':
$extensions = array_merge($extensions, array('jpg', 'jpeg', 'jpe', 'gif', 'png', 'webp', 'svg', 'heic', 'heif', 'avif'));
break;
case 'wpmf-pdf':
$extensions = array_merge($extensions, array('pdf'));
break;
case 'wpmf-other':
$extensions = array_merge($extensions, array(
'tiff', 'tif', 'ico', 'asf', 'asx', 'wmv',
'wmx', 'wm', 'avi', 'divx', 'flv', 'mov',
'qt', 'mpeg', 'mpg', 'mpe', 'm4v',
'ogv', 'webm', 'mkv', '3gp', '3gpp', '3g2',
'3gp2', 'txt', 'asc', 'c', 'cc', 'h', 'srt',
'csv', 'tsv', 'ics', 'rtx', 'css', 'html',
'htm', 'vtt', 'dfxp', 'm4a', 'm4b',
'ra', 'ram', 'ogg', 'oga', 'mid', 'midi',
'wma', 'wax', 'mka', 'rtf', 'js', 'class',
'gz', '7z', 'psd',
'xcf', 'doc', 'pot', 'pps', 'ppt', 'wri', 'xla',
'xls', 'xlt', 'xlw', 'mdp', 'mpp', 'docx', 'docm',
'dotx', 'xlsx', 'xlsm', 'xlsb', 'xltx', 'xltm',
'xlam', 'pptx', 'pptm', 'ppsx', 'ppsm', 'potx',
'potm', 'ppam', 'sldx', 'sldm', 'onetoc', 'onetoc2',
'onetmp', 'onepkg', 'oxps', 'xps', 'odt', 'odp',
'ods', 'odg', 'odc', 'odb', 'odf', 'wp', 'wpd',
'key', 'numbers', 'pages'
));
break;
default:
$mimetypes[] = $ft;
break;
}
}
if (!empty($extensions)) {
foreach ($extensions as $extension) {
if ($extension !== 'application') {
$mimetype = WpmfHelper::getMimeType($extension);
$mimetypes[] = $mimetype;
}
}
if (!empty($mimetypes)) {
$query->query_vars['post_mime_type'] = $mimetypes;
}
} else {
if (!empty($filetype) && is_array($filetype) && ($filetype[0] === 'unattached' || $filetype[0] === 'detached' || $filetype[0] === 'uploaded' || $filetype[0] === 'trash')) {
$query->query_vars['post_mime_type'] = '';
}
if (!empty($filetype) && is_array($filetype) && $filetype[0] === 'mine') {
$query->query_vars['author'] = $user_id;
$query->query_vars['post_mime_type'] = '';
}
}
}
// phpcs:enable
return $query;
}
/**
* Add size column and filetype column
*
* @param array $columns An array of columns displayed in the Media list table.
*
* @return array $columns
*/
public static function manageMediaColumns($columns)
{
$columns['wpmf_size'] = __('Size', 'wpmf');
$columns['wpmf_filetype'] = __('File type', 'wpmf');
$columns['wpmf_iptc'] = __('IPTC Meta', 'wpmf');
return $columns;
}
/**
* Register sortcolumn
*
* @param array $columns An array of sort columns.
*
* @return array $columns
*/
public function imwidthColumnRegisterSortable($columns)
{
$columns['wpmf_size'] = 'size';
$columns['wpmf_filetype'] = 'filetype';
return $columns;
}
/**
* Get size and filetype of attachment
*
* @param integer $pid Id of attachment
*
* @return array $wpmf_size_filetype
*/
public function getSizeFiletype($pid)
{
$wpmf_size_filetype = array();
// get path file
$filepath = get_attached_file($pid);
$info = pathinfo($filepath);
// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Ignore warning php if file not exist or not have permission
if (@file_exists($filepath)) {
// get size
$size = filesize($filepath);
// get file type
$filetype = wp_check_filetype($filepath);
$ext = $filetype['ext'];
} else {
$size = get_post_meta($pid, 'wpmf_size', true);
if (empty($size)) {
$size = 0;
}
if (isset($info['extension'])) {
$ext = $info['extension'];
} else {
$ext = '';
}
}
$wpmf_size_filetype['size'] = $size;
$wpmf_size_filetype['ext'] = $ext;
return $wpmf_size_filetype;
}
/**
* Get size and filetype of attachment
*
* @param string $column_name Column name
* @param integer $id Id of attachment
*
* @return void
*/
public function manageMediaCustomColumn($column_name, $id)
{
$wpmf_size_filetype = $this->getSizeFiletype($id);
$size = $wpmf_size_filetype['size'];
$ext = $wpmf_size_filetype['ext'];
if ($size < 1024 * 1024) {
$size = round($size / 1024, 1) . ' kB';
} elseif ($size > 1024 * 1024) {
$size = round($size / (1024 * 1024), 1) . ' MB';
}
switch ($column_name) {
case 'wpmf_size':
echo esc_html($size);
break;
case 'wpmf_filetype':
echo esc_html($ext);
break;
case 'wpmf_iptc':
$iptc = get_post_meta($id, 'wpmf_iptc', true);
$iptchtml = '';
if (!empty($iptc)) {
$iptcHeaderArray = getIptcHeader();
$iptchtml .= '<div class="wpmf_iptc_wrap">';
foreach ($iptc as $code => $iptcValue) {
$iptchtml .= '<span><b>' . $iptcHeaderArray[$code] . ': </b>'. implode(',', $iptcValue) .'</span><br>';
}
$iptchtml .= '</div>';
}
// phpcs:ignore WordPress.Security.EscapeOutput -- Content already escaped in the method
echo $iptchtml;
break;
}
}
}