XylotrechusZ
<?php
/**
* This file holds various functions that modify the wordpress media uploader
* and list view of media gallery
*
* It utilizes custom posts to create a gallerie for each upload field.
* Kudos to woothemes for this great idea :)
*
* @author Christian "Kriesi" Budschedl
* @copyright Copyright (c) Christian Budschedl
* @link http://kriesi.at
* @link http://aviathemes.com
* @since Version 1.0
* @package AviaFramework
*/
if( ! defined( 'AVIA_FW' ) ) { exit( 'No direct script access allowed' ); }
if( ! class_exists( 'avia_media' ) )
{
/**
* The avia media class is a set of static class methods that help to create the hidden image containing posts
*
* @package AviaFramework
*/
class avia_media
{
/**
* The avia media generate_post_type function builds the hidden posts necessary for image saving on options pages
*/
static public function generate_post_type()
{
register_post_type( 'avia_framework_post', array(
'labels' => array( 'name' => 'Avia Framework' ),
'show_ui' => false,
'query_var' => true,
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => false,
'supports' => array( 'editor', 'title' ),
'can_export' => true,
'public' => true,
'show_in_nav_menus' => false
) );
}
/**
* The avia media get_custom_post function gets a custom post based on a post title. if no post cold be found it creates one
* @param string $post_title the title of the post
*
* @package AviaFramework
*/
static public function get_custom_post( $post_title )
{
$save_title = avia_backend_safe_string( $post_title );
$args = array(
'post_type' => 'avia_framework_post',
'post_title' => 'avia_' . $save_title,
'post_status' => 'draft',
'comment_status' => 'closed',
'ping_status' => 'closed'
);
$avia_post = avia_media::get_post_by_title( $args['post_title'] );
if( ! isset( $avia_post['ID'] ) )
{
$avia_post_id = wp_insert_post( $args );
}
else
{
$avia_post_id = $avia_post['ID'];
}
return $avia_post_id;
}
/**
* The avia media get_post_by_title function gets a custom post based on a post title.
*
* @package AviaFramework
* @param string $post_title the title of the post
* @return array|null
*/
static public function get_post_by_title( $post_title )
{
global $wpdb;
$post = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type='avia_framework_post'", $post_title ) );
if( $post )
{
return get_post( $post, 'ARRAY_A');
}
return null;
}
/**
* The avia add_media_label_header function hooks into wordpress galery tabs and injects a new button label
* this label can be found by the frameworks javascript and it then overwrites the default "insert into post" text
*
* @since 4.8.2 added esc_attr() to prevent code injection (reported by “Julien Legras and Guillaume André of Synacktiv (https://synacktiv.com)”)
* @param array $_default_tabs the default tabs
* @package AviaFramework
*/
static public function add_media_label_header( $_default_tabs )
{
//change the label of the insert button
if( isset( $_GET['avia_label'] ) )
{
echo "<input class='avia_insert_button_label' type='hidden' value='" . html_entity_decode( $_GET['avia_label'] ) . "' />";
}
/**
* activate the gallery mode
*/
if( isset( $_GET['avia_gallery_mode'] ) )
{
echo "<input class='avia_gallery_mode_active' type='hidden' value='" . esc_attr( $_GET['avia_gallery_mode'] ) . "' />";
if( isset( $_default_tabs['library'] ) )
{
unset($_default_tabs['library'] );
}
if( isset( $_default_tabs['type_url'] ) )
{
unset( $_default_tabs['type_url'] );
}
}
//remove the default insert method and replace it with the better image id based method
if( isset( $_GET['avia_idbased'] ) )
{
echo "<input class='avia_idbased' type='hidden' value='" . esc_attr( $_GET['avia_idbased'] ) . "' />";
}
return $_default_tabs;
}
/**
*
* @param string $form_action_url
* @param string $type
* @return string
*/
static public function url_filter( $form_action_url, $type )
{
if( isset( $_REQUEST[ 'avia_idbased'] ) )
{
$form_action_url = $form_action_url . "&avia_idbased=" . $_REQUEST['avia_idbased'];
}
if( isset( $_REQUEST['avia_gallery_mode'] ) )
{
$form_action_url = $form_action_url . "&avia_gallery_mode=" . $_REQUEST['avia_gallery_mode'];
}
if( isset($_REQUEST['avia_label'] ) )
{
$form_action_url = $form_action_url . "&avia_label=" . $_REQUEST['avia_label'];
}
return $form_action_url;
}
}
}
add_action( 'init', array( 'avia_media', 'generate_post_type' ) );
add_filter( 'media_upload_tabs', array( 'avia_media', 'add_media_label_header' ) );
add_filter( 'media_upload_form_url', array( 'avia_media', 'url_filter' ), 10, 2 );
if( ! class_exists( 'avia_media_gallery' ) )
{
/**
* The avia media gallery class is used for the new media gallery
*
* @package AviaFramework
*/
class avia_media_gallery
{
/**
* The url filter function attaches the avia_gallery_parameter to all urls within the form
* based on that parameter we can perform php checks if the current gallery is a advanced gallery
*/
static public function url_filter( $form_action_url, $type )
{
if( isset( $_REQUEST['avia_gallery_active'] ) )
{
$form_action_url = $form_action_url . "&avia_gallery_active=" . $_REQUEST['avia_gallery_active'];
}
return $form_action_url;
}
/*
* register the stylesheet that hides default insert buttons and adds styles for the additional insert buttons
*/
static public function register_stylesheet( $current_hook )
{
if( isset( $_REQUEST['avia_gallery_active'] ) && $current_hook == 'media-upload-popup' )
{
$vn = avia_get_theme_version();
$min_css = avia_minify_extension( 'css' );
wp_enqueue_style( 'avia_gallery_mode', AVIA_CSS_URL . "conditional_load/avia_gallery_mode{$min_css}.css", false, $vn );
}
}
/**
*
* @param array $form_fields
* @param mixed $post
* @return array
*/
static public function add_buttons( $form_fields, $post )
{
if( isset( $_REQUEST['avia_gallery_active'] ) || isset( $_REQUEST['fetch'] ) )
{
$label = __( 'Add to Gallery', 'avia_framework' );
if( isset( $_REQUEST['avia_gallery_label'] ) )
{
$label = $_REQUEST['avia_gallery_label'];
}
$form_fields['avia-send-to-editor'] = array(
'label' => '',
'input' => 'html',
'html' => '<a href="#" data-attachment-id="' . $post->ID . '" class="button avia_send_to_gallery">' . $label . '</a>',
);
}
return $form_fields;
}
/**
*
* @param array $default_tabs
* @return array
*/
static public function remove_unused_tab( $default_tabs )
{
if( isset( $_REQUEST['avia_gallery_active'] ) )
{
$default_tabs = array(
'type' => 'From Computer',
'gallery' => 'Gallery',
'library' => 'Media Library'
);
}
return $default_tabs;
}
/**
* filter for the thickbox - only display insert video tab
*
* @param array $default_tabs
* @return array
*/
static public function video_tab( $default_tabs )
{
if( isset($_REQUEST['tab'] ) && 'avia_video_insert' == $_REQUEST['tab'] )
{
$default_tabs = array( 'avia_video_insert' => 'Insert Video' );
}
return $default_tabs;
}
/**
* creates the insert form
*/
static public function create_video_tab()
{
wp_iframe( array( 'avia_media_gallery', 'media_avia_create_video_insert' ) );
}
static public function media_avia_create_video_insert()
{
$video_description = '<p class="help">Enter the URL to the Video. <br/> A list of all supported Video Services can be found <a href="http://codex.wordpress.org/Embeds#Okay.2C_So_What_Sites_Can_I_Embed_From.3F" target="_blank" rel="noopener noreferrer">here</a>. Youtube videos will display additional info like title, share link, related videos, ...
<br/> <br/>
Working examples:<br/>
<strong>https://vimeo.com/1084537</strong><br/>
<strong>https://www.youtube.com/watch?v=G0k3kHtyoqc</strong><br/>
</p>';
$video_description = apply_filters( 'avia_filter_video_insert_label', $video_description );
$output = "<form>";
$output .='<h3 class="media-title">Insert media from another website</h3>';
$output .= '<div id="media-items">';
$output .= '<div class="media-item media-blank">';
$output .= '<table class="describe avia_video_insert_table"><tbody>
<tr>
<th valign="top" scope="row" class="label" style="width:130px;">
<span class="alignleft"><label for="src">' . __('Enter Video URL', 'avia_framework') . '</label></span>
<span class="alignright"><abbr id="status_img" title="required" class="required">*</abbr></span>
</th>
<td class="field">
<input id="src" name="src" value="" type="text" aria-required="true" />
' . $video_description . '
</td>
</tr>
<tr>
<td></td>
<td class="avia_button_container">
<input type="button" class="button" id="avia_insert_video" value="' . esc_attr__( 'Insert Video', 'avia_framework' ) . '" />
</td>
</tr>';
$output .= '</tbody></table>';
$output .= '</div>';
$output .= '</div>';
$output .= '</form>';
echo $output;
}
/**
* Save filedata on upload
*
* @since 4.8.8 based on code provided by Guenni007 - Weber Günter
* @param int $meta_id
* @param int $post_id
* @param string $meta_key
* @param string $meta_value
*/
static public function add_filesize_metadata_to_images( $meta_id, $post_id, $meta_key, $meta_value )
{
if( '_wp_attachment_metadata' == $meta_key )
{
$file = get_attached_file( $post_id );
$filesize = @filesize( $file );
if( false !== $filesize )
{
update_post_meta( $post_id, 'filesize', $filesize );
}
}
}
/**
* Add the columns
*
* @since 4.8.8 based on code provided by Guenni007 - Weber Günter
* @since 5.0.2 extended with attachment ID
* @param array $posts_columns
* @return type
*/
static public function add_columns( array $posts_columns )
{
/**
* Supress attachment ID
*
* @since 5.0.2
* @param boolean $add_id
* @return true|mixed
*/
if( true === apply_filters( 'avf_media_list_view_id', true ) )
{
$posts_columns['post_attachments_id'] = __( 'ID', 'avia_framework' );
}
$posts_columns['filesize'] = __( 'File Size', 'avia_framework' );
$posts_columns['dimensions'] = __( 'Dimension w * h in px', 'avia_framework' );
return $posts_columns;
}
/**
* Populate the columns
*
* @since 4.8.8 based on code provided by Guenni007 - Weber Günter
* @since 5.0.2 extended with attachment ID
* @param string $column_name
* @param int $post_id
*/
static public function add_columns_value( $column_name, $post_id )
{
if( 'filesize' == $column_name )
{
$file_size = get_post_meta( $post_id, 'filesize', true );
if( ! $file_size )
{
$file = get_attached_file( $post_id );
$file_size = @filesize( $file );
if( false !== $file_size )
{
update_post_meta( $post_id, 'filesize', $file_size );
}
}
if( false !== $file_size )
{
echo size_format( $file_size, 2 );
}
else
{
echo '???';
}
}
else if( 'dimensions' == $column_name )
{
$svg_meta = avia_SVG()->get_meta_data( $post_id );
if( is_array( $svg_meta ) && ! empty( $svg_meta['viewbox'] ) )
{
echo __( 'viewBox', 'avia_framework' ) . '<br />' . $svg_meta['viewbox'];
}
else
{
$meta = wp_get_attachment_metadata( $post_id );
if( isset( $meta['width'] ) )
{
echo $meta['width'] . ' x ' . $meta['height'];
}
else
{
echo '---';
}
}
}
else if( 'post_attachments_id' == $column_name )
{
echo $post_id;
}
return;
}
/**
* Make file-size column and attachment ID sortable
*
* @since 4.8.8 based on code provided by Guenni007 - Weber Günter
* @since 5.0.2 extended with attachment ID
* @param array $columns
* @return array
*/
static public function make_file_size_column_sortable( $columns )
{
$columns['filesize'] = 'filesize';
$columns['post_attachments_id'] = 'post_attachments_id';
return $columns;
}
/**
* File-Size Column / attachment ID sorting logic (query modification)
*
* @since 4.8.8 based on code provided by Guenni007 - Weber Günter
* @since 5.0.2 extended with attachment ID
* @param WP_Query $query
*/
static public function file_size_sorting_logic( $query )
{
global $pagenow;
if( ! ( is_admin() && 'upload.php' == $pagenow && $query->is_main_query() && ! empty( $_REQUEST['orderby'] ) ) )
{
return;
}
switch( $_REQUEST['orderby'] )
{
case 'filesize':
$query->set( 'orderby', 'meta_value_num' );
$query->set( 'meta_key', 'filesize' );
break;
case 'post_attachments_id':
$query->set( 'orderby', 'ID' );
break;
default:
return;
}
if( isset( $_REQUEST['order'] ) && 'desc' == $_REQUEST['order'] )
{
$query->set( 'order', 'DESC' );
}
else
{
$query->set( 'order', 'ASC' );
}
}
}
}
add_action( 'media_upload_avia_video_insert', array( 'avia_media_gallery', 'create_video_tab' ) );
add_filter( 'media_upload_tabs', array( 'avia_media_gallery', 'video_tab' ), 11 );
add_filter( 'media_upload_tabs', array( 'avia_media_gallery', 'remove_unused_tab' ) );
add_filter( 'attachment_fields_to_edit', array( 'avia_media_gallery', 'add_buttons' ), 10, 2 );
add_filter( 'attachment_fields_to_edit', array( 'avia_media_gallery', 'add_buttons' ), 10, 2 );
add_filter( 'media_upload_form_url', array( 'avia_media_gallery', 'url_filter' ), 10, 2 );
add_filter( 'admin_enqueue_scripts', array( 'avia_media_gallery', 'register_stylesheet' ), 10 );
add_action( 'added_post_meta', array( 'avia_media_gallery', 'add_filesize_metadata_to_images' ), 10, 4 );
add_filter( 'manage_media_columns', array( 'avia_media_gallery', 'add_columns' ), 10, 1 );
add_action( 'manage_media_custom_column', array( 'avia_media_gallery', 'add_columns_value' ), 10, 2 );
/**
* As sites might have large galleries that need filesize postmeta to be indexed we block this feature by default
* Only images that are uploaded after this release or viewed in listview will have set this postmeta field
*
* @since 4.8.8
* @return boolean $allow_sort
* @return boolean
*/
if( false !== apply_filters( 'avf_media_gallery_sortable_filesize', false ) )
{
add_filter( 'manage_upload_sortable_columns', array( 'avia_media_gallery', 'make_file_size_column_sortable' ), 10, 1 );
add_action( 'pre_get_posts', array( 'avia_media_gallery', 'file_size_sorting_logic' ), 10, 1 );
}