Version Description
- Fixed an issue where field values were improperly overwritten when the instance was set to prepend in some cases
Download this release
Release Info
| Developer | jchristopher |
| Plugin | |
| Version | 3.5.5 |
| Comparing to | |
| See all releases | |
Code changes from version 3.5.4 to 3.5.5
- classes/class.attachments.legacy.php +28 -39
- classes/class.attachments.migrate.php +115 -111
- classes/class.attachments.php +343 -413
- classes/class.attachments.search.php +53 -41
- classes/class.field.php +18 -16
- classes/fields/class.field.select.php +11 -17
- classes/fields/class.field.text.php +6 -12
- classes/fields/class.field.textarea.php +6 -12
- classes/fields/class.field.wysiwyg.php +10 -16
- deprecated/attachments.php +72 -113
- deprecated/get-attachments.php +16 -26
- deprecated/index.php +3 -1
- deprecated/js/index.php +2 -0
- index.php +12 -29
- readme.txt +5 -2
- views/options.php +18 -25
classes/class.attachments.legacy.php
CHANGED
|
@@ -1,27 +1,26 @@
|
|
| 1 |
<?php
|
| 2 |
|
| 3 |
// exit if accessed directly
|
| 4 |
-
if( !defined( 'ABSPATH' ) )
|
|
|
|
|
|
|
| 5 |
|
| 6 |
// exit if we can't extend Attachments
|
| 7 |
-
if ( !class_exists( 'Attachments' ) )
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
|
| 12 |
/**
|
| 13 |
* Check for and handle legacy data appropriately
|
| 14 |
*
|
| 15 |
* @since 3.4.1
|
| 16 |
*/
|
| 17 |
-
class AttachmentsLegacyHandler
|
| 18 |
-
{
|
| 19 |
|
| 20 |
public $legacy = false; // whether or not there is legacy Attachments data
|
| 21 |
public $legacy_pro = false; // whether or not there is legacy Attachment Pro data
|
| 22 |
|
| 23 |
-
function __construct()
|
| 24 |
-
{
|
| 25 |
// deal with our legacy issues if the user hasn't dismissed or migrated already
|
| 26 |
$this->check_for_legacy_data();
|
| 27 |
|
|
@@ -38,30 +37,29 @@ class AttachmentsLegacyHandler
|
|
| 38 |
*
|
| 39 |
* @since 3.1.3
|
| 40 |
*/
|
| 41 |
-
function check_for_legacy_data()
|
| 42 |
-
{
|
| 43 |
// we'll get a warning issued if fired when Network Activated
|
| 44 |
// since it's supremely unlikely we'd have legacy data at this point, we're going to short circuit
|
| 45 |
-
if( is_multisite() )
|
| 46 |
-
{
|
| 47 |
$plugins = get_site_option( 'active_sitewide_plugins' );
|
| 48 |
-
if( isset( $plugins['attachments/index.php'] ) )
|
| 49 |
return;
|
|
|
|
| 50 |
}
|
| 51 |
|
| 52 |
// deal with our legacy issues if the user hasn't dismissed or migrated already
|
| 53 |
-
if( false == get_option( 'attachments_migrated' ) && false == get_option( 'attachments_ignore_migration' ) )
|
| 54 |
-
{
|
| 55 |
$legacy_attachments_settings = get_option( 'attachments_settings' );
|
| 56 |
|
| 57 |
-
if( $legacy_attachments_settings && is_array( $legacy_attachments_settings['post_types'] ) && count( $legacy_attachments_settings['post_types'] ) )
|
| 58 |
-
{
|
| 59 |
// we have legacy settings, so we're going to use the post types that Attachments is currently utilizing
|
| 60 |
|
| 61 |
// the keys are the actual CPT names, so we need those
|
| 62 |
-
foreach( $legacy_attachments_settings['post_types'] as $post_type => $value )
|
| 63 |
-
if( $value )
|
| 64 |
$post_types[] = $post_type;
|
|
|
|
|
|
|
| 65 |
|
| 66 |
// set up our WP_Query args to grab anything with legacy data
|
| 67 |
$args = array(
|
|
@@ -78,13 +76,12 @@ class AttachmentsLegacyHandler
|
|
| 78 |
}
|
| 79 |
|
| 80 |
// deal with our legacy Pro issues if the user hasn't dismissed or migrated already
|
| 81 |
-
if( false == get_option( 'attachments_pro_migrated' ) && false == get_option( 'attachments_pro_ignore_migration' ) )
|
| 82 |
-
{
|
| 83 |
$post_types = get_post_types();
|
| 84 |
|
| 85 |
// set up our WP_Query args to grab anything (really anything) with legacy data
|
| 86 |
$args = array(
|
| 87 |
-
'post_type' => !empty( $post_types ) ? $post_types : array( 'post', 'page' ),
|
| 88 |
'post_status' => 'any',
|
| 89 |
'posts_per_page' => 1,
|
| 90 |
'meta_key' => '_attachments_pro',
|
|
@@ -103,10 +100,8 @@ class AttachmentsLegacyHandler
|
|
| 103 |
*
|
| 104 |
* @since 3.0
|
| 105 |
*/
|
| 106 |
-
function admin_notice()
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
if( $this->has_outstanding_legacy_data() && ( isset( $_GET['page'] ) && $_GET['page'] !== 'attachments' || !isset( $_GET['page'] ) ) ) : ?>
|
| 110 |
<div class="message updated" id="message">
|
| 111 |
<p><?php _e( '<strong>Attachments has detected legacy Attachments data.</strong> A lot has changed since Attachments 1.x.' ,'attachments' ); ?> <a href="options-general.php?page=attachments&overview=1"><?php _e( 'Find out more', 'attachments' ); ?>.</a></p>
|
| 112 |
</div>
|
|
@@ -120,22 +115,18 @@ class AttachmentsLegacyHandler
|
|
| 120 |
*
|
| 121 |
* @since 3.0
|
| 122 |
*/
|
| 123 |
-
function has_outstanding_legacy_data()
|
| 124 |
-
{
|
| 125 |
if(
|
| 126 |
// migration has not taken place and we have legacy data
|
| 127 |
-
( false == get_option( 'attachments_migrated' ) && !empty( $this->legacy ) )
|
| 128 |
|
| 129 |
&&
|
| 130 |
|
| 131 |
// we're not intentionally ignoring the message
|
| 132 |
( false == get_option( 'attachments_ignore_migration' ) )
|
| 133 |
-
)
|
| 134 |
-
{
|
| 135 |
return true;
|
| 136 |
-
}
|
| 137 |
-
else
|
| 138 |
-
{
|
| 139 |
return false;
|
| 140 |
}
|
| 141 |
}
|
|
@@ -147,8 +138,7 @@ class AttachmentsLegacyHandler
|
|
| 147 |
*
|
| 148 |
* @since 3.0
|
| 149 |
*/
|
| 150 |
-
function admin_pointer( $hook_suffix )
|
| 151 |
-
{
|
| 152 |
|
| 153 |
// Assume pointer shouldn't be shown
|
| 154 |
$enqueue_pointer_script_style = false;
|
|
@@ -178,8 +168,7 @@ class AttachmentsLegacyHandler
|
|
| 178 |
*
|
| 179 |
* @since 3.0
|
| 180 |
*/
|
| 181 |
-
function pointer_legacy()
|
| 182 |
-
{
|
| 183 |
$pointer_content = "<h3>". __( esc_html( 'Attachments 3.0 brings big changes!' ), 'attachments' ) ."</h3>";
|
| 184 |
$pointer_content .= "<p>". __( esc_html( 'It is very important that you take a few minutes to see what has been updated. The changes will affect your themes/plugins.' ), 'attachments' ) ."</p>";
|
| 185 |
?>
|
| 1 |
<?php
|
| 2 |
|
| 3 |
// exit if accessed directly
|
| 4 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
| 5 |
+
exit;
|
| 6 |
+
}
|
| 7 |
|
| 8 |
// exit if we can't extend Attachments
|
| 9 |
+
if ( ! class_exists( 'Attachments' ) ) {
|
| 10 |
+
return;
|
| 11 |
+
}
|
|
|
|
| 12 |
|
| 13 |
/**
|
| 14 |
* Check for and handle legacy data appropriately
|
| 15 |
*
|
| 16 |
* @since 3.4.1
|
| 17 |
*/
|
| 18 |
+
class AttachmentsLegacyHandler {
|
|
|
|
| 19 |
|
| 20 |
public $legacy = false; // whether or not there is legacy Attachments data
|
| 21 |
public $legacy_pro = false; // whether or not there is legacy Attachment Pro data
|
| 22 |
|
| 23 |
+
function __construct() {
|
|
|
|
| 24 |
// deal with our legacy issues if the user hasn't dismissed or migrated already
|
| 25 |
$this->check_for_legacy_data();
|
| 26 |
|
| 37 |
*
|
| 38 |
* @since 3.1.3
|
| 39 |
*/
|
| 40 |
+
function check_for_legacy_data() {
|
|
|
|
| 41 |
// we'll get a warning issued if fired when Network Activated
|
| 42 |
// since it's supremely unlikely we'd have legacy data at this point, we're going to short circuit
|
| 43 |
+
if( is_multisite() ) {
|
|
|
|
| 44 |
$plugins = get_site_option( 'active_sitewide_plugins' );
|
| 45 |
+
if ( isset( $plugins['attachments/index.php'] ) ) {
|
| 46 |
return;
|
| 47 |
+
}
|
| 48 |
}
|
| 49 |
|
| 50 |
// deal with our legacy issues if the user hasn't dismissed or migrated already
|
| 51 |
+
if ( false == get_option( 'attachments_migrated' ) && false == get_option( 'attachments_ignore_migration' ) ) {
|
|
|
|
| 52 |
$legacy_attachments_settings = get_option( 'attachments_settings' );
|
| 53 |
|
| 54 |
+
if ( $legacy_attachments_settings && is_array( $legacy_attachments_settings['post_types'] ) && count( $legacy_attachments_settings['post_types'] ) ) {
|
|
|
|
| 55 |
// we have legacy settings, so we're going to use the post types that Attachments is currently utilizing
|
| 56 |
|
| 57 |
// the keys are the actual CPT names, so we need those
|
| 58 |
+
foreach ( $legacy_attachments_settings['post_types'] as $post_type => $value ) {
|
| 59 |
+
if ( $value ) {
|
| 60 |
$post_types[] = $post_type;
|
| 61 |
+
}
|
| 62 |
+
}
|
| 63 |
|
| 64 |
// set up our WP_Query args to grab anything with legacy data
|
| 65 |
$args = array(
|
| 76 |
}
|
| 77 |
|
| 78 |
// deal with our legacy Pro issues if the user hasn't dismissed or migrated already
|
| 79 |
+
if ( false == get_option( 'attachments_pro_migrated' ) && false == get_option( 'attachments_pro_ignore_migration' ) ) {
|
|
|
|
| 80 |
$post_types = get_post_types();
|
| 81 |
|
| 82 |
// set up our WP_Query args to grab anything (really anything) with legacy data
|
| 83 |
$args = array(
|
| 84 |
+
'post_type' => ! empty( $post_types ) ? $post_types : array( 'post', 'page' ),
|
| 85 |
'post_status' => 'any',
|
| 86 |
'posts_per_page' => 1,
|
| 87 |
'meta_key' => '_attachments_pro',
|
| 100 |
*
|
| 101 |
* @since 3.0
|
| 102 |
*/
|
| 103 |
+
function admin_notice() {
|
| 104 |
+
if ( $this->has_outstanding_legacy_data() && ( isset( $_GET['page'] ) && $_GET['page'] !== 'attachments' || ! isset( $_GET['page'] ) ) ) : ?>
|
|
|
|
|
|
|
| 105 |
<div class="message updated" id="message">
|
| 106 |
<p><?php _e( '<strong>Attachments has detected legacy Attachments data.</strong> A lot has changed since Attachments 1.x.' ,'attachments' ); ?> <a href="options-general.php?page=attachments&overview=1"><?php _e( 'Find out more', 'attachments' ); ?>.</a></p>
|
| 107 |
</div>
|
| 115 |
*
|
| 116 |
* @since 3.0
|
| 117 |
*/
|
| 118 |
+
function has_outstanding_legacy_data() {
|
|
|
|
| 119 |
if(
|
| 120 |
// migration has not taken place and we have legacy data
|
| 121 |
+
( false == get_option( 'attachments_migrated' ) && ! empty( $this->legacy ) )
|
| 122 |
|
| 123 |
&&
|
| 124 |
|
| 125 |
// we're not intentionally ignoring the message
|
| 126 |
( false == get_option( 'attachments_ignore_migration' ) )
|
| 127 |
+
) {
|
|
|
|
| 128 |
return true;
|
| 129 |
+
} else {
|
|
|
|
|
|
|
| 130 |
return false;
|
| 131 |
}
|
| 132 |
}
|
| 138 |
*
|
| 139 |
* @since 3.0
|
| 140 |
*/
|
| 141 |
+
function admin_pointer( $hook_suffix ) {
|
|
|
|
| 142 |
|
| 143 |
// Assume pointer shouldn't be shown
|
| 144 |
$enqueue_pointer_script_style = false;
|
| 168 |
*
|
| 169 |
* @since 3.0
|
| 170 |
*/
|
| 171 |
+
function pointer_legacy() {
|
|
|
|
| 172 |
$pointer_content = "<h3>". __( esc_html( 'Attachments 3.0 brings big changes!' ), 'attachments' ) ."</h3>";
|
| 173 |
$pointer_content .= "<p>". __( esc_html( 'It is very important that you take a few minutes to see what has been updated. The changes will affect your themes/plugins.' ), 'attachments' ) ."</p>";
|
| 174 |
?>
|
classes/class.attachments.migrate.php
CHANGED
|
@@ -1,18 +1,18 @@
|
|
| 1 |
<?php
|
| 2 |
|
| 3 |
// Exit if accessed directly
|
| 4 |
-
if( !defined( 'ABSPATH' ) )
|
|
|
|
|
|
|
| 5 |
|
| 6 |
/**
|
| 7 |
* Migration class for legacy Attachments data
|
| 8 |
*
|
| 9 |
* @since 3.1.3
|
| 10 |
*/
|
| 11 |
-
class AttachmentsMigrate extends Attachments
|
| 12 |
-
{
|
| 13 |
|
| 14 |
-
function __construct()
|
| 15 |
-
{
|
| 16 |
parent::__construct();
|
| 17 |
}
|
| 18 |
|
|
@@ -21,11 +21,11 @@ class AttachmentsMigrate extends Attachments
|
|
| 21 |
*
|
| 22 |
* @since 3.0
|
| 23 |
*/
|
| 24 |
-
function migrate( $instance = null, $title = null, $caption = null )
|
| 25 |
-
{
|
| 26 |
// sanitize
|
| 27 |
-
if( is_null( $instance ) || empty( $instance ) || is_null( $title ) || is_null( $caption ) )
|
| 28 |
return false;
|
|
|
|
| 29 |
|
| 30 |
$instance = str_replace( '-', '_', sanitize_title( $instance ) );
|
| 31 |
$title = empty( $title ) ? false : str_replace( '-', '_', sanitize_title( $title ) );
|
|
@@ -38,15 +38,16 @@ class AttachmentsMigrate extends Attachments
|
|
| 38 |
|
| 39 |
$query = false;
|
| 40 |
|
| 41 |
-
if( $legacy_attachments_settings && is_array( $legacy_attachments_settings['post_types'] ) && count( $legacy_attachments_settings['post_types'] ) )
|
| 42 |
-
{
|
| 43 |
// we have legacy settings, so we're going to use the post types
|
| 44 |
// that Attachments is currently utilizing
|
| 45 |
|
| 46 |
// the keys are the actual CPT names, so we need those
|
| 47 |
-
foreach( $legacy_attachments_settings['post_types'] as $post_type => $value )
|
| 48 |
-
if( $value )
|
| 49 |
$post_types[] = $post_type;
|
|
|
|
|
|
|
| 50 |
|
| 51 |
// set up our WP_Query args to grab anything with legacy data
|
| 52 |
$args = array(
|
|
@@ -63,94 +64,96 @@ class AttachmentsMigrate extends Attachments
|
|
| 63 |
$count = 0;
|
| 64 |
|
| 65 |
// loop through each post
|
| 66 |
-
if( $query ) {
|
| 67 |
-
|
| 68 |
-
// set up postdata
|
| 69 |
-
$query->the_post();
|
| 70 |
|
| 71 |
-
|
| 72 |
-
|
| 73 |
|
| 74 |
-
|
|
|
|
| 75 |
|
| 76 |
-
|
| 77 |
-
if( is_array( $existing_attachments ) && count( $existing_attachments ) > 0 )
|
| 78 |
-
{
|
| 79 |
-
// loop through each existing attachment
|
| 80 |
-
foreach( $existing_attachments as $attachment )
|
| 81 |
-
{
|
| 82 |
-
// decode and unserialize the data
|
| 83 |
-
$data = unserialize( base64_decode( $attachment ) );
|
| 84 |
-
|
| 85 |
-
array_push( $post_attachments, array(
|
| 86 |
-
'id' => stripslashes( $data['id'] ),
|
| 87 |
-
'title' => stripslashes( $data['title'] ),
|
| 88 |
-
'caption' => stripslashes( $data['caption'] ),
|
| 89 |
-
'order' => stripslashes( $data['order'] )
|
| 90 |
-
));
|
| 91 |
-
}
|
| 92 |
|
| 93 |
-
//
|
| 94 |
-
if( count( $
|
| 95 |
-
|
| 96 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
}
|
| 98 |
-
}
|
| 99 |
|
| 100 |
-
|
| 101 |
|
| 102 |
-
|
| 103 |
-
|
| 104 |
|
| 105 |
-
|
| 106 |
-
|
|
|
|
| 107 |
|
| 108 |
-
|
| 109 |
|
| 110 |
-
|
| 111 |
-
|
|
|
|
| 112 |
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
$converted_attachment = array( 'id' => $legacy_attachment['id'] );
|
| 118 |
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
|
|
|
| 123 |
|
| 124 |
-
|
| 125 |
-
|
|
|
|
| 126 |
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
}
|
| 133 |
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
|
| 142 |
-
|
| 143 |
-
|
| 144 |
|
| 145 |
-
|
| 146 |
-
|
| 147 |
|
| 148 |
-
|
| 149 |
-
|
| 150 |
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
|
|
|
| 154 |
|
| 155 |
return $count;
|
| 156 |
}
|
|
@@ -162,10 +165,10 @@ class AttachmentsMigrate extends Attachments
|
|
| 162 |
*
|
| 163 |
* @since 3.2
|
| 164 |
*/
|
| 165 |
-
function prepare_migration()
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
?>
|
| 169 |
<h3><?php _e( 'Migration Step 1', 'attachments' ); ?></h3>
|
| 170 |
<p><?php _e( "In order to migrate Attachments 1.x data, you need to set which instance and fields in version 3.0+ you'd like to use:", 'attachments' ); ?></p>
|
| 171 |
<form action="options-general.php" method="get">
|
|
@@ -217,21 +220,20 @@ class AttachmentsMigrate extends Attachments
|
|
| 217 |
*
|
| 218 |
* @since 3.2
|
| 219 |
*/
|
| 220 |
-
function init_migration()
|
| 221 |
-
|
| 222 |
-
if( !wp_verify_nonce( $_GET['nonce'], 'attachments-migrate-2') )
|
| 223 |
wp_die( __( 'Invalid request', 'attachments' ) );
|
|
|
|
| 224 |
|
| 225 |
$total = $this->migrate( $_GET['attachments-instance'], $_GET['attachments-title'], $_GET['attachments-caption'] );
|
| 226 |
|
| 227 |
-
if( false == get_option( 'attachments_migrated' ) )
|
| 228 |
-
?>
|
| 229 |
<h3><?php _e( 'Migration Complete!', 'attachments' ); ?></h3>
|
| 230 |
<p><?php _e( 'The migration has completed.', 'attachments' ); ?> <strong><?php _e( 'Migrated', 'attachments'); ?>: <?php echo $total; ?></strong>.</p>
|
| 231 |
-
<?php else
|
| 232 |
<h3><?php _e( 'Migration has already Run!', 'attachments' ); ?></h3>
|
| 233 |
<p><?php _e( 'The migration has already been run. The migration process has not been repeated.', 'attachments' ); ?></p>
|
| 234 |
-
<?php
|
| 235 |
|
| 236 |
// make sure the database knows the migration has run
|
| 237 |
add_option( 'attachments_migrated', true, '', 'no' );
|
|
@@ -244,10 +246,10 @@ class AttachmentsMigrate extends Attachments
|
|
| 244 |
*
|
| 245 |
* @since 3.5
|
| 246 |
*/
|
| 247 |
-
function prepare_pro_migration()
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
?>
|
| 251 |
<h3><?php _e( 'Migration Step 1', 'attachments' ); ?></h3>
|
| 252 |
<form action="options-general.php" method="get">
|
| 253 |
<input type="hidden" name="page" value="attachments" />
|
|
@@ -262,11 +264,11 @@ class AttachmentsMigrate extends Attachments
|
|
| 262 |
$attachments_pro_settings = get_option( '_iti_apro_settings' );
|
| 263 |
?>
|
| 264 |
|
| 265 |
-
<?php if( is_array( $attachments_pro_settings['positions'] ) ) : ?>
|
| 266 |
<p><?php _e( 'The following Attachments Pro Instances will be migrated:', 'attachments' ); ?></p>
|
| 267 |
<ul style="padding-left:32px;list-style:disc;">
|
| 268 |
<?php foreach( $attachments_pro_settings['positions'] as $attachments_pro_instance ) : ?>
|
| 269 |
-
<li><?php echo $attachments_pro_instance['label']; ?></li>
|
| 270 |
<?php endforeach; ?>
|
| 271 |
</ul>
|
| 272 |
<h2><?php _e( 'Note: this is a multi-step process', 'attachments' ); ?></h2>
|
|
@@ -288,30 +290,32 @@ class AttachmentsMigrate extends Attachments
|
|
| 288 |
*
|
| 289 |
* @since 3.5
|
| 290 |
*/
|
| 291 |
-
function init_pro_migration()
|
| 292 |
-
{
|
| 293 |
global $current_user;
|
| 294 |
|
| 295 |
get_currentuserinfo();
|
| 296 |
|
| 297 |
-
if( !wp_verify_nonce( $_GET['nonce'], 'attachments-pro-migrate-2') )
|
| 298 |
wp_die( __( 'Invalid request', 'attachments' ) );
|
|
|
|
| 299 |
|
| 300 |
$attachments_pro_settings = get_option( '_iti_apro_settings' );
|
| 301 |
-
if( is_array( $attachments_pro_settings['positions'] ) )
|
| 302 |
-
{
|
| 303 |
$totals = array();
|
| 304 |
|
| 305 |
-
foreach( $attachments_pro_settings['positions'] as $attachments_pro_instance )
|
| 306 |
$totals[] = $this->migrate_pro( $attachments_pro_instance );
|
|
|
|
| 307 |
|
| 308 |
$total_attachments = 0;
|
| 309 |
|
| 310 |
-
if( !empty( $totals ) )
|
| 311 |
-
foreach( $totals as $instance_total )
|
| 312 |
$total_attachments += $instance_total['total'];
|
|
|
|
|
|
|
| 313 |
|
| 314 |
-
if( false == get_option( 'attachments_pro_migrated' ) ) :
|
| 315 |
?>
|
| 316 |
<h3><?php _e( 'Data conversion complete!', 'attachments' ); ?></h3>
|
| 317 |
<p><?php _e( 'The data conversion has been completed successfully.', 'attachments' ); ?> <strong><?php _e( 'Converted', 'attachments'); ?>: <?php echo $total_attachments; ?> <?php echo ( $total_attachments == 1 ) ? __( 'Attachment', 'attachments' ) : __( 'Attachments', 'attachments' ); ?></strong></p>
|
|
@@ -326,15 +330,15 @@ class AttachmentsMigrate extends Attachments
|
|
| 326 |
|
| 327 |
array(
|
| 328 |
'name' => '<?php echo str_replace( '-', '_', sanitize_title( $field['label'] ) ); ?>',
|
| 329 |
-
'type' => '<?php echo $field['type']; ?>',
|
| 330 |
-
'label' => '<?php echo $field['label']; ?>',
|
| 331 |
-
'default' => '<?php echo isset( $field['mapped_to'] ) ? $field['mapped_to'] : ''; ?>',
|
| 332 |
),<?php endforeach; echo "\n"; endif; ?>
|
| 333 |
);
|
| 334 |
<?php
|
| 335 |
$post_types = array();
|
| 336 |
-
if( isset( $attachments_pro_instance['conditions'] ) && is_array( $attachments_pro_instance['conditions'] ) && !empty( $attachments_pro_instance['conditions'] ) )
|
| 337 |
-
foreach( $attachments_pro_instance['conditions'] as $condition )
|
| 338 |
if( $condition['param'] == 'post_type' && $condition['operator'] == 'is' )
|
| 339 |
$post_types[] = $condition['limiter'];
|
| 340 |
?>
|
| 1 |
<?php
|
| 2 |
|
| 3 |
// Exit if accessed directly
|
| 4 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
| 5 |
+
exit;
|
| 6 |
+
}
|
| 7 |
|
| 8 |
/**
|
| 9 |
* Migration class for legacy Attachments data
|
| 10 |
*
|
| 11 |
* @since 3.1.3
|
| 12 |
*/
|
| 13 |
+
class AttachmentsMigrate extends Attachments {
|
|
|
|
| 14 |
|
| 15 |
+
function __construct() {
|
|
|
|
| 16 |
parent::__construct();
|
| 17 |
}
|
| 18 |
|
| 21 |
*
|
| 22 |
* @since 3.0
|
| 23 |
*/
|
| 24 |
+
function migrate( $instance = null, $title = null, $caption = null ) {
|
|
|
|
| 25 |
// sanitize
|
| 26 |
+
if( is_null( $instance ) || empty( $instance ) || is_null( $title ) || is_null( $caption ) ) {
|
| 27 |
return false;
|
| 28 |
+
}
|
| 29 |
|
| 30 |
$instance = str_replace( '-', '_', sanitize_title( $instance ) );
|
| 31 |
$title = empty( $title ) ? false : str_replace( '-', '_', sanitize_title( $title ) );
|
| 38 |
|
| 39 |
$query = false;
|
| 40 |
|
| 41 |
+
if ( $legacy_attachments_settings && is_array( $legacy_attachments_settings['post_types'] ) && count( $legacy_attachments_settings['post_types'] ) ) {
|
|
|
|
| 42 |
// we have legacy settings, so we're going to use the post types
|
| 43 |
// that Attachments is currently utilizing
|
| 44 |
|
| 45 |
// the keys are the actual CPT names, so we need those
|
| 46 |
+
foreach ( $legacy_attachments_settings['post_types'] as $post_type => $value ) {
|
| 47 |
+
if ( $value ) {
|
| 48 |
$post_types[] = $post_type;
|
| 49 |
+
}
|
| 50 |
+
}
|
| 51 |
|
| 52 |
// set up our WP_Query args to grab anything with legacy data
|
| 53 |
$args = array(
|
| 64 |
$count = 0;
|
| 65 |
|
| 66 |
// loop through each post
|
| 67 |
+
if ( $query ) {
|
| 68 |
+
while( $query->have_posts() ) {
|
|
|
|
|
|
|
| 69 |
|
| 70 |
+
// set up postdata
|
| 71 |
+
$query->the_post();
|
| 72 |
|
| 73 |
+
// let's first decode our Attachments data
|
| 74 |
+
$existing_attachments = get_post_meta( $query->post->ID, '_attachments', false );
|
| 75 |
|
| 76 |
+
$post_attachments = array();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
|
| 78 |
+
// check to make sure we've got data
|
| 79 |
+
if ( is_array( $existing_attachments ) && count( $existing_attachments ) > 0 ) {
|
| 80 |
+
// loop through each existing attachment
|
| 81 |
+
foreach( $existing_attachments as $attachment ) {
|
| 82 |
+
// decode and unserialize the data
|
| 83 |
+
$data = unserialize( base64_decode( $attachment ) );
|
| 84 |
+
|
| 85 |
+
array_push( $post_attachments, array(
|
| 86 |
+
'id' => stripslashes( $data['id'] ),
|
| 87 |
+
'title' => stripslashes( $data['title'] ),
|
| 88 |
+
'caption' => stripslashes( $data['caption'] ),
|
| 89 |
+
'order' => stripslashes( $data['order'] )
|
| 90 |
+
)
|
| 91 |
+
);
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
// sort attachments
|
| 95 |
+
if ( count( $post_attachments ) > 1 ) {
|
| 96 |
+
usort( $post_attachments, 'attachments_cmp' );
|
| 97 |
+
}
|
| 98 |
}
|
|
|
|
| 99 |
|
| 100 |
+
// we have our Attachments entries
|
| 101 |
|
| 102 |
+
// let's check to see if we're migrating after population has taken place
|
| 103 |
+
$existing_attachments = get_post_meta( $query->post->ID, $this->get_meta_key(), false );
|
| 104 |
|
| 105 |
+
if ( ! isset( $existing_attachments[0] ) ) {
|
| 106 |
+
$existing_attachments[0] = '';
|
| 107 |
+
}
|
| 108 |
|
| 109 |
+
$existing_attachments = json_decode( $existing_attachments[0] );
|
| 110 |
|
| 111 |
+
if ( ! is_object( $existing_attachments ) ) {
|
| 112 |
+
$existing_attachments = new stdClass();
|
| 113 |
+
}
|
| 114 |
|
| 115 |
+
// we'll loop through the legacy Attachments and save them in the new format
|
| 116 |
+
foreach ( $post_attachments as $legacy_attachment ) {
|
| 117 |
+
// convert to the new format
|
| 118 |
+
$converted_attachment = array( 'id' => $legacy_attachment['id'] );
|
|
|
|
| 119 |
|
| 120 |
+
// fields are technically optional so we'll add those separately
|
| 121 |
+
// we're also going to encode them in the same way the main class does
|
| 122 |
+
if ( $title ) {
|
| 123 |
+
$converted_attachment['fields'][$title] = htmlentities( stripslashes( $legacy_attachment['title'] ), ENT_QUOTES, 'UTF-8' );
|
| 124 |
+
}
|
| 125 |
|
| 126 |
+
if ( $caption ) {
|
| 127 |
+
$converted_attachment['fields'][$caption] = htmlentities( stripslashes( $legacy_attachment['caption'] ), ENT_QUOTES, 'UTF-8' );
|
| 128 |
+
}
|
| 129 |
|
| 130 |
+
// check to see if the existing Attachments have our target instance
|
| 131 |
+
if ( ! isset( $existing_attachments->$instance ) ) {
|
| 132 |
+
// the instance doesn't exist so we need to create it
|
| 133 |
+
$existing_attachments->$instance = array();
|
| 134 |
+
}
|
|
|
|
| 135 |
|
| 136 |
+
// we need to convert our array to an object
|
| 137 |
+
$converted_attachment['fields'] = (object) $converted_attachment['fields'];
|
| 138 |
+
$converted_attachment = (object) $converted_attachment;
|
| 139 |
|
| 140 |
+
// append this legacy attachment to the existing instance
|
| 141 |
+
array_push( $existing_attachments->$instance, $converted_attachment );
|
| 142 |
+
}
|
| 143 |
|
| 144 |
+
// we're done! let's save everything in our new format
|
| 145 |
+
$existing_attachments = version_compare( PHP_VERSION, '5.4.0', '>=' ) ? json_encode( $existing_attachments, JSON_UNESCAPED_UNICODE ) : json_encode( $existing_attachments );
|
| 146 |
|
| 147 |
+
// fix potentially encoded Unicode
|
| 148 |
+
$existing_attachments = str_replace( '\\', '\\\\', $existing_attachments );
|
| 149 |
|
| 150 |
+
// save it to the database
|
| 151 |
+
update_post_meta( $query->post->ID, 'attachments', $existing_attachments );
|
| 152 |
|
| 153 |
+
// increment our counter
|
| 154 |
+
$count++;
|
| 155 |
+
}
|
| 156 |
+
}
|
| 157 |
|
| 158 |
return $count;
|
| 159 |
}
|
| 165 |
*
|
| 166 |
* @since 3.2
|
| 167 |
*/
|
| 168 |
+
function prepare_migration() {
|
| 169 |
+
if ( ! wp_verify_nonce( $_GET['nonce'], 'attachments-migrate-1') ) {
|
| 170 |
+
wp_die( __( 'Invalid request', 'attachments' ) );
|
| 171 |
+
} ?>
|
| 172 |
<h3><?php _e( 'Migration Step 1', 'attachments' ); ?></h3>
|
| 173 |
<p><?php _e( "In order to migrate Attachments 1.x data, you need to set which instance and fields in version 3.0+ you'd like to use:", 'attachments' ); ?></p>
|
| 174 |
<form action="options-general.php" method="get">
|
| 220 |
*
|
| 221 |
* @since 3.2
|
| 222 |
*/
|
| 223 |
+
function init_migration() {
|
| 224 |
+
if ( ! wp_verify_nonce( $_GET['nonce'], 'attachments-migrate-2') ) {
|
|
|
|
| 225 |
wp_die( __( 'Invalid request', 'attachments' ) );
|
| 226 |
+
}
|
| 227 |
|
| 228 |
$total = $this->migrate( $_GET['attachments-instance'], $_GET['attachments-title'], $_GET['attachments-caption'] );
|
| 229 |
|
| 230 |
+
if( false == get_option( 'attachments_migrated' ) ) { ?>
|
|
|
|
| 231 |
<h3><?php _e( 'Migration Complete!', 'attachments' ); ?></h3>
|
| 232 |
<p><?php _e( 'The migration has completed.', 'attachments' ); ?> <strong><?php _e( 'Migrated', 'attachments'); ?>: <?php echo $total; ?></strong>.</p>
|
| 233 |
+
<?php } else { ?>
|
| 234 |
<h3><?php _e( 'Migration has already Run!', 'attachments' ); ?></h3>
|
| 235 |
<p><?php _e( 'The migration has already been run. The migration process has not been repeated.', 'attachments' ); ?></p>
|
| 236 |
+
<?php }
|
| 237 |
|
| 238 |
// make sure the database knows the migration has run
|
| 239 |
add_option( 'attachments_migrated', true, '', 'no' );
|
| 246 |
*
|
| 247 |
* @since 3.5
|
| 248 |
*/
|
| 249 |
+
function prepare_pro_migration() {
|
| 250 |
+
if ( ! wp_verify_nonce( $_GET['nonce'], 'attachments-pro-migrate-1') ) {
|
| 251 |
+
wp_die( __( 'Invalid request', 'attachments' ) );
|
| 252 |
+
} ?>
|
| 253 |
<h3><?php _e( 'Migration Step 1', 'attachments' ); ?></h3>
|
| 254 |
<form action="options-general.php" method="get">
|
| 255 |
<input type="hidden" name="page" value="attachments" />
|
| 264 |
$attachments_pro_settings = get_option( '_iti_apro_settings' );
|
| 265 |
?>
|
| 266 |
|
| 267 |
+
<?php if ( is_array( $attachments_pro_settings['positions'] ) ) : ?>
|
| 268 |
<p><?php _e( 'The following Attachments Pro Instances will be migrated:', 'attachments' ); ?></p>
|
| 269 |
<ul style="padding-left:32px;list-style:disc;">
|
| 270 |
<?php foreach( $attachments_pro_settings['positions'] as $attachments_pro_instance ) : ?>
|
| 271 |
+
<li><?php echo esc_html( $attachments_pro_instance['label'] ); ?></li>
|
| 272 |
<?php endforeach; ?>
|
| 273 |
</ul>
|
| 274 |
<h2><?php _e( 'Note: this is a multi-step process', 'attachments' ); ?></h2>
|
| 290 |
*
|
| 291 |
* @since 3.5
|
| 292 |
*/
|
| 293 |
+
function init_pro_migration() {
|
|
|
|
| 294 |
global $current_user;
|
| 295 |
|
| 296 |
get_currentuserinfo();
|
| 297 |
|
| 298 |
+
if ( ! wp_verify_nonce( $_GET['nonce'], 'attachments-pro-migrate-2') ) {
|
| 299 |
wp_die( __( 'Invalid request', 'attachments' ) );
|
| 300 |
+
}
|
| 301 |
|
| 302 |
$attachments_pro_settings = get_option( '_iti_apro_settings' );
|
| 303 |
+
if ( is_array( $attachments_pro_settings['positions'] ) ) {
|
|
|
|
| 304 |
$totals = array();
|
| 305 |
|
| 306 |
+
foreach ( $attachments_pro_settings['positions'] as $attachments_pro_instance ) {
|
| 307 |
$totals[] = $this->migrate_pro( $attachments_pro_instance );
|
| 308 |
+
}
|
| 309 |
|
| 310 |
$total_attachments = 0;
|
| 311 |
|
| 312 |
+
if ( ! empty( $totals ) ) {
|
| 313 |
+
foreach ( $totals as $instance_total ) {
|
| 314 |
$total_attachments += $instance_total['total'];
|
| 315 |
+
}
|
| 316 |
+
}
|
| 317 |
|
| 318 |
+
if ( false == get_option( 'attachments_pro_migrated' ) ) :
|
| 319 |
?>
|
| 320 |
<h3><?php _e( 'Data conversion complete!', 'attachments' ); ?></h3>
|
| 321 |
<p><?php _e( 'The data conversion has been completed successfully.', 'attachments' ); ?> <strong><?php _e( 'Converted', 'attachments'); ?>: <?php echo $total_attachments; ?> <?php echo ( $total_attachments == 1 ) ? __( 'Attachment', 'attachments' ) : __( 'Attachments', 'attachments' ); ?></strong></p>
|
| 330 |
|
| 331 |
array(
|
| 332 |
'name' => '<?php echo str_replace( '-', '_', sanitize_title( $field['label'] ) ); ?>',
|
| 333 |
+
'type' => '<?php echo esc_html( $field['type'] ); ?>',
|
| 334 |
+
'label' => '<?php echo esc_html( $field['label'] ); ?>',
|
| 335 |
+
'default' => '<?php echo isset( $field['mapped_to'] ) ? esc_html( $field['mapped_to'] ) : ''; ?>',
|
| 336 |
),<?php endforeach; echo "\n"; endif; ?>
|
| 337 |
);
|
| 338 |
<?php
|
| 339 |
$post_types = array();
|
| 340 |
+
if ( isset( $attachments_pro_instance['conditions'] ) && is_array( $attachments_pro_instance['conditions'] ) && ! empty( $attachments_pro_instance['conditions'] ) )
|
| 341 |
+
foreach ( $attachments_pro_instance['conditions'] as $condition )
|
| 342 |
if( $condition['param'] == 'post_type' && $condition['operator'] == 'is' )
|
| 343 |
$post_types[] = $condition['limiter'];
|
| 344 |
?>
|
classes/class.attachments.php
CHANGED
|
@@ -11,10 +11,12 @@
|
|
| 11 |
*/
|
| 12 |
|
| 13 |
// Exit if accessed directly
|
| 14 |
-
if( !defined( 'ABSPATH' ) )
|
|
|
|
|
|
|
| 15 |
|
| 16 |
// Declare our class
|
| 17 |
-
if( !class_exists( 'Attachments' ) ) :
|
| 18 |
|
| 19 |
/**
|
| 20 |
* Main Attachments Class
|
|
@@ -22,8 +24,8 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 22 |
* @since 3.0
|
| 23 |
*/
|
| 24 |
|
| 25 |
-
class Attachments
|
| 26 |
-
|
| 27 |
private $version; // stores Attachments' version number
|
| 28 |
private $url; // stores Attachments' URL
|
| 29 |
private $dir; // stores Attachments' directory
|
|
@@ -50,12 +52,11 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 50 |
*
|
| 51 |
* @since 3.0
|
| 52 |
*/
|
| 53 |
-
function __construct( $instance = null, $post_id = null )
|
| 54 |
-
{
|
| 55 |
global $_wp_additional_image_sizes;
|
| 56 |
|
| 57 |
// establish our environment variables
|
| 58 |
-
$this->version = '3.5.
|
| 59 |
$this->url = ATTACHMENTS_URL;
|
| 60 |
$this->dir = ATTACHMENTS_DIR;
|
| 61 |
$plugin = 'attachments/index.php';
|
|
@@ -76,7 +77,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 76 |
add_filter( "plugin_action_links_$plugin", array( $this, 'plugin_settings_link' ) );
|
| 77 |
|
| 78 |
// add update message(s)
|
| 79 |
-
add_action( 'in_plugin_update_message-attachments/index.php', array( $this, 'update_message' ) );
|
| 80 |
|
| 81 |
// set up l10n
|
| 82 |
add_action( 'plugins_loaded', array( $this, 'l10n' ) );
|
|
@@ -106,13 +107,10 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 106 |
add_action( 'admin_init', array( $this, 'admin_init' ) );
|
| 107 |
|
| 108 |
// execution of actions varies depending on whether we're in the admin or not and an instance was passed
|
| 109 |
-
if( is_admin() )
|
| 110 |
-
{
|
| 111 |
add_action( 'after_setup_theme', array( $this, 'apply_init_filters' ), 999 );
|
| 112 |
$this->attachments = $this->get_attachments( $instance, $post_id );
|
| 113 |
-
}
|
| 114 |
-
elseif( !is_null( $instance ) )
|
| 115 |
-
{
|
| 116 |
$this->apply_init_filters();
|
| 117 |
$this->attachments = $this->get_attachments( $instance, $post_id );
|
| 118 |
}
|
|
@@ -124,8 +122,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 124 |
/**
|
| 125 |
* Add notification about available Attachments extensions
|
| 126 |
*/
|
| 127 |
-
function update_message()
|
| 128 |
-
{ ?>
|
| 129 |
<div style="margin-top:10px;padding-top:8px;border-top:1px solid #eaeaea;"><span style="color:#f00;"><?php _e( 'Attachments Extensions Available!', 'attachments' ); ?></span> <span style="font-weight:normal;"><?php _e( 'These utilities make working with Attachments even easier!', 'attachments' ); ?></span></div>
|
| 130 |
<div style="font-weight:normal;padding-top:8px;">
|
| 131 |
<p><strong><a href="https://mondaybynoon.com/members/plugins/attachments-ui/?utm_campaign=Attachments&utm_term=Upgrade%2bNotice">Attachments UI</a></strong> - <?php _e( 'Create Attachments Instances with an easy-to-use UI, easily limit meta box locations with fine grained control (e.g. Home page only), and more.', 'attachments' ); ?></p>
|
|
@@ -140,12 +137,12 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 140 |
* @param $links
|
| 141 |
* @return mixed
|
| 142 |
*/
|
| 143 |
-
function plugin_settings_link( $links )
|
| 144 |
-
{
|
| 145 |
$settings_link = '<a href="options-general.php?page=attachments">'. __( 'Settings', 'attachments' ) . '</a>';
|
| 146 |
array_unshift( $links, $settings_link );
|
| 147 |
$extend_link = '<a href="https://mondaybynoon.com/members/plugins/?utm_campaign=Attachments&utm_term=Plugins%2bExtend#attachments">'. __( 'Extend', 'attachments' ) . '</a>';
|
| 148 |
array_unshift( $links, $extend_link );
|
|
|
|
| 149 |
return $links;
|
| 150 |
}
|
| 151 |
|
|
@@ -156,10 +153,10 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 156 |
*
|
| 157 |
* @since 3.4.3
|
| 158 |
*/
|
| 159 |
-
function admin_init()
|
| 160 |
-
|
| 161 |
-
if( current_user_can( 'delete_posts' ) )
|
| 162 |
add_action( 'delete_post', array( $this, 'handle_wp_post_delete' ), 10 );
|
|
|
|
| 163 |
}
|
| 164 |
|
| 165 |
|
|
@@ -170,8 +167,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 170 |
* @return array
|
| 171 |
* @since 3.5
|
| 172 |
*/
|
| 173 |
-
function get_fields()
|
| 174 |
-
{
|
| 175 |
return $this->fields;
|
| 176 |
}
|
| 177 |
|
|
@@ -184,11 +180,16 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 184 |
* @param int $pid Post ID
|
| 185 |
* @since 3.4.3
|
| 186 |
*/
|
| 187 |
-
function handle_wp_post_delete( $pid )
|
| 188 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
// check to make sure it was an attachment
|
| 190 |
-
if( 'attachment' != get_post_type( $pid ) )
|
| 191 |
return;
|
|
|
|
| 192 |
|
| 193 |
// if a user deletes an attachment from the Media library (but it's been used
|
| 194 |
// in Attachments somewhere else) we need to clean that up...
|
|
@@ -200,10 +201,8 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 200 |
// so we're going to use the search class to find all instances
|
| 201 |
// for any occurrence of the deleted attachment (which has an ID of $pid)
|
| 202 |
|
| 203 |
-
if( is_array( $this->instances ) )
|
| 204 |
-
|
| 205 |
-
foreach( $this->instances as $instance => $details )
|
| 206 |
-
{
|
| 207 |
$search_args = array(
|
| 208 |
'instance' => $instance,
|
| 209 |
'attachment_id' => intval( $pid ),
|
|
@@ -211,22 +210,22 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 211 |
|
| 212 |
$this->search( null, $search_args );
|
| 213 |
|
| 214 |
-
if( $this->exist() )
|
| 215 |
-
{
|
| 216 |
// we've got a hit (e.g. an existing post uses the deleted attachment)
|
| 217 |
-
while( $attachment = $this->get() )
|
| 218 |
-
{
|
| 219 |
$post_id = $attachment->post_id;
|
| 220 |
|
| 221 |
// we'll use the post ID to snag the details
|
| 222 |
$post_attachments = $this->get_attachments_metadata( $post_id );
|
| 223 |
|
| 224 |
-
if( is_object( $post_attachments ) )
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
if( $pid == intval( $existing_instance_attachment->id ) )
|
| 229 |
unset( $post_attachments->{$existing_instance}[$existing_instance_attachment_key] );
|
|
|
|
|
|
|
|
|
|
| 230 |
|
| 231 |
// saving routine assumes array from POST so we'll typecast it
|
| 232 |
$post_attachments = (array) $post_attachments;
|
|
@@ -247,8 +246,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 247 |
*
|
| 248 |
* @since 3.4.2
|
| 249 |
*/
|
| 250 |
-
function get_meta_key()
|
| 251 |
-
{
|
| 252 |
return $this->meta_key;
|
| 253 |
}
|
| 254 |
|
|
@@ -259,8 +257,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 259 |
*
|
| 260 |
* @since 3.5
|
| 261 |
*/
|
| 262 |
-
function get_url()
|
| 263 |
-
{
|
| 264 |
return $this->url;
|
| 265 |
}
|
| 266 |
|
|
@@ -271,15 +268,13 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 271 |
*
|
| 272 |
* @since 3.4.2
|
| 273 |
*/
|
| 274 |
-
function l10n()
|
| 275 |
-
|
| 276 |
-
load_plugin_textdomain( 'attachments', false, 'attachments/languages/' );
|
| 277 |
}
|
| 278 |
|
| 279 |
|
| 280 |
|
| 281 |
-
function load_extensions()
|
| 282 |
-
{
|
| 283 |
do_action( 'attachments_extension', $this );
|
| 284 |
}
|
| 285 |
|
|
@@ -290,8 +285,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 290 |
*
|
| 291 |
* @since 3.4
|
| 292 |
*/
|
| 293 |
-
function apply_init_filters()
|
| 294 |
-
{
|
| 295 |
// allows a different meta_key to be used
|
| 296 |
$this->meta_key = apply_filters( 'attachments_meta_key', $this->meta_key );
|
| 297 |
}
|
|
@@ -303,8 +297,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 303 |
*
|
| 304 |
* @since 3.3
|
| 305 |
*/
|
| 306 |
-
function search( $query = null, $params = array() )
|
| 307 |
-
{
|
| 308 |
$results = new AttachmentsSearch( $query, $params );
|
| 309 |
$this->attachments = $results->results;
|
| 310 |
}
|
|
@@ -316,9 +309,8 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 316 |
*
|
| 317 |
* @since 3.0
|
| 318 |
*/
|
| 319 |
-
function exist()
|
| 320 |
-
|
| 321 |
-
return !empty( $this->attachments );
|
| 322 |
}
|
| 323 |
|
| 324 |
|
|
@@ -328,8 +320,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 328 |
*
|
| 329 |
* @since 3.0.6
|
| 330 |
*/
|
| 331 |
-
function total()
|
| 332 |
-
{
|
| 333 |
return count( $this->attachments );
|
| 334 |
}
|
| 335 |
|
|
@@ -340,8 +331,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 340 |
*
|
| 341 |
* @since 3.6
|
| 342 |
*/
|
| 343 |
-
function rewind()
|
| 344 |
-
{
|
| 345 |
$this->attachments_ref = -1;
|
| 346 |
}
|
| 347 |
|
|
@@ -352,14 +342,14 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 352 |
*
|
| 353 |
* @since 3.0
|
| 354 |
*/
|
| 355 |
-
function get()
|
| 356 |
-
{
|
| 357 |
$this->attachments_ref++;
|
| 358 |
|
| 359 |
-
if( !count( $this->attachments ) || $this->attachments_ref >= count( $this->attachments ) )
|
| 360 |
return false;
|
|
|
|
| 361 |
|
| 362 |
-
return $this->attachments[$this->attachments_ref];
|
| 363 |
}
|
| 364 |
|
| 365 |
|
|
@@ -369,9 +359,8 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 369 |
*
|
| 370 |
* @since 3.2
|
| 371 |
*/
|
| 372 |
-
function get_single( $index )
|
| 373 |
-
|
| 374 |
-
return isset( $this->attachments[$index] ) ? $this->attachments[$index] : false;
|
| 375 |
}
|
| 376 |
|
| 377 |
|
|
@@ -381,21 +370,18 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 381 |
*
|
| 382 |
* @since 3.0.6
|
| 383 |
*/
|
| 384 |
-
function asset( $size = 'thumbnail', $index = null )
|
| 385 |
-
{
|
| 386 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 387 |
|
| 388 |
// do we have our meta yet?
|
| 389 |
-
if( !isset( $this->attachments[$index]->meta ) )
|
| 390 |
-
$this->attachments[$index]->meta = wp_get_attachment_metadata( $this->attachments[$index]->id );
|
|
|
|
| 391 |
|
| 392 |
// is it an image?
|
| 393 |
-
if( isset( $this->attachments[$index]->meta['sizes'] ) )
|
| 394 |
-
|
| 395 |
-
|
| 396 |
-
}
|
| 397 |
-
else
|
| 398 |
-
{
|
| 399 |
// either it's not an image or we don't have the proper size, so we'll use the icon
|
| 400 |
$asset = $this->icon( $index );
|
| 401 |
}
|
|
@@ -410,10 +396,9 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 410 |
*
|
| 411 |
* @since 3.0.6
|
| 412 |
*/
|
| 413 |
-
function icon( $index = null )
|
| 414 |
-
{
|
| 415 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 416 |
-
$asset = wp_get_attachment_image_src( $this->attachments[$index]->id, null, true );
|
| 417 |
|
| 418 |
return $asset;
|
| 419 |
}
|
|
@@ -426,10 +411,9 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 426 |
*
|
| 427 |
* @since 3.4.1
|
| 428 |
*/
|
| 429 |
-
function date( $d = "d/m/Y", $index = null )
|
| 430 |
-
{
|
| 431 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 432 |
-
$date = get_the_time( $d, $this->attachments[$index]->id );
|
| 433 |
|
| 434 |
return $date;
|
| 435 |
}
|
|
@@ -441,17 +425,16 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 441 |
*
|
| 442 |
* @since 3.0
|
| 443 |
*/
|
| 444 |
-
function image( $size = 'thumbnail', $index = null )
|
| 445 |
-
{
|
| 446 |
$asset = $this->asset( $size, $index );
|
| 447 |
|
| 448 |
$image_src = $asset[0];
|
| 449 |
$image_width = $asset[1];
|
| 450 |
$image_height = $asset[2];
|
| 451 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 452 |
-
$image_alt = get_post_meta( $this->attachments[$index]->id, '_wp_attachment_image_alt', true );
|
| 453 |
|
| 454 |
-
$image = '<img src="' . $image_src . '" width="' . $image_width . '" height="' . $image_height . '" alt="' . $image_alt . '" />';
|
| 455 |
|
| 456 |
return $image;
|
| 457 |
}
|
|
@@ -463,10 +446,10 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 463 |
*
|
| 464 |
* @since 3.0
|
| 465 |
*/
|
| 466 |
-
function src( $size = 'thumbnail', $index = null )
|
| 467 |
-
{
|
| 468 |
$asset = $this->asset( $size, $index );
|
| 469 |
-
|
|
|
|
| 470 |
}
|
| 471 |
|
| 472 |
|
|
@@ -476,10 +459,10 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 476 |
*
|
| 477 |
* @since 3.5
|
| 478 |
*/
|
| 479 |
-
function width( $size = 'thumbnail', $index = null )
|
| 480 |
-
{
|
| 481 |
$asset = $this->asset( $size, $index );
|
| 482 |
-
|
|
|
|
| 483 |
}
|
| 484 |
|
| 485 |
|
|
@@ -489,10 +472,10 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 489 |
*
|
| 490 |
* @since 3.5
|
| 491 |
*/
|
| 492 |
-
function height( $size = 'thumbnail', $index = null )
|
| 493 |
-
{
|
| 494 |
$asset = $this->asset( $size, $index );
|
| 495 |
-
|
|
|
|
| 496 |
}
|
| 497 |
|
| 498 |
|
|
@@ -502,21 +485,22 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 502 |
*
|
| 503 |
* @since 3.0
|
| 504 |
*/
|
| 505 |
-
function filesize( $index = null, $size = null )
|
| 506 |
-
{
|
| 507 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 508 |
|
| 509 |
-
if( !isset( $this->attachments[$index]->id ) )
|
| 510 |
return false;
|
|
|
|
| 511 |
|
| 512 |
// if an image size is passed along, use that
|
| 513 |
-
$url = is_string( $size ) ? $this->src( $size, $index ) : wp_get_attachment_url( $this->attachments[$index]->id );
|
| 514 |
$uploads = wp_upload_dir();
|
| 515 |
$file_path = str_replace( $uploads['baseurl'], $uploads['basedir'], $url );
|
| 516 |
|
| 517 |
$formatted = '0 bytes';
|
| 518 |
-
if( file_exists( $file_path ) )
|
| 519 |
$formatted = size_format( @filesize( $file_path ) );
|
|
|
|
| 520 |
|
| 521 |
return $formatted;
|
| 522 |
}
|
|
@@ -528,14 +512,15 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 528 |
*
|
| 529 |
* @since 3.0
|
| 530 |
*/
|
| 531 |
-
function type( $index = null )
|
| 532 |
-
{
|
| 533 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 534 |
|
| 535 |
-
if( !isset( $this->attachments[$index]->id ) )
|
| 536 |
return false;
|
|
|
|
| 537 |
|
| 538 |
$attachment_mime = $this->get_mime_type( $this->attachments[$index]->id );
|
|
|
|
| 539 |
return $attachment_mime;
|
| 540 |
}
|
| 541 |
|
|
@@ -546,9 +531,9 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 546 |
*
|
| 547 |
* @since 3.4.2
|
| 548 |
*/
|
| 549 |
-
function get_mime_type( $id = null )
|
| 550 |
-
{
|
| 551 |
$attachment_mime = explode( '/', get_post_mime_type( intval( $id ) ) );
|
|
|
|
| 552 |
return isset( $attachment_mime[0] ) ? $attachment_mime[0] : false;
|
| 553 |
}
|
| 554 |
|
|
@@ -559,14 +544,15 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 559 |
*
|
| 560 |
* @since 3.0
|
| 561 |
*/
|
| 562 |
-
function subtype( $index = null )
|
| 563 |
-
{
|
| 564 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 565 |
|
| 566 |
-
if( !isset( $this->attachments[$index]->id ) )
|
| 567 |
return false;
|
|
|
|
|
|
|
|
|
|
| 568 |
|
| 569 |
-
$attachment_mime = explode( '/', get_post_mime_type( $this->attachments[$index]->id ) );
|
| 570 |
return isset( $attachment_mime[1] ) ? $attachment_mime[1] : false;
|
| 571 |
}
|
| 572 |
|
|
@@ -577,11 +563,10 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 577 |
*
|
| 578 |
* @since 3.0
|
| 579 |
*/
|
| 580 |
-
function id( $index = null )
|
| 581 |
-
{
|
| 582 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 583 |
|
| 584 |
-
return isset( $this->attachments[$index]->id ) ? $this->attachments[$index]->id : false;
|
| 585 |
}
|
| 586 |
|
| 587 |
|
|
@@ -591,11 +576,10 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 591 |
*
|
| 592 |
* @since 3.3
|
| 593 |
*/
|
| 594 |
-
function post_id( $index = null )
|
| 595 |
-
{
|
| 596 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 597 |
|
| 598 |
-
return isset( $this->attachments[$index]->post_id ) ? $this->attachments[$index]->post_id : false;
|
| 599 |
}
|
| 600 |
|
| 601 |
|
|
@@ -605,11 +589,10 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 605 |
*
|
| 606 |
* @since 3.0
|
| 607 |
*/
|
| 608 |
-
function url( $index = null )
|
| 609 |
-
{
|
| 610 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 611 |
|
| 612 |
-
return isset( $this->attachments[$index]->id ) ? wp_get_attachment_url( $this->attachments[$index]->id ) : false;
|
| 613 |
}
|
| 614 |
|
| 615 |
|
|
@@ -619,11 +602,10 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 619 |
*
|
| 620 |
* @since 3.0
|
| 621 |
*/
|
| 622 |
-
function field( $name = 'title', $index = null )
|
| 623 |
-
{
|
| 624 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 625 |
|
| 626 |
-
return isset( $this->attachments[$index]->fields->$name ) ? $this->attachments[$index]->fields->$name : false;
|
| 627 |
}
|
| 628 |
|
| 629 |
|
|
@@ -633,12 +615,11 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 633 |
*
|
| 634 |
* @since 3.0
|
| 635 |
*/
|
| 636 |
-
function setup_instances()
|
| 637 |
-
{
|
| 638 |
// implement our default instance if appropriate
|
| 639 |
-
|
| 640 |
-
if( $filtered && ( ! defined( 'ATTACHMENTS_DEFAULT_INSTANCE' ) || true == ATTACHMENTS_DEFAULT_INSTANCE ) ) {
|
| 641 |
-
|
| 642 |
}
|
| 643 |
|
| 644 |
// facilitate user-defined instance registration
|
|
@@ -652,17 +633,18 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 652 |
*
|
| 653 |
* @since 3.0
|
| 654 |
*/
|
| 655 |
-
function assets( $hook )
|
| 656 |
-
{
|
| 657 |
global $post;
|
| 658 |
|
| 659 |
// we only want our assets on edit screens
|
| 660 |
-
if( !empty( $this->instances_for_post_type ) && 'edit.php' != $hook && 'post.php' != $hook && 'post-new.php' != $hook )
|
| 661 |
return;
|
|
|
|
| 662 |
|
| 663 |
// we only want to enqueue if appropriate
|
| 664 |
-
if( empty( $this->instances_for_post_type ) )
|
| 665 |
return;
|
|
|
|
| 666 |
|
| 667 |
$post_id = isset( $post->ID ) ? $post->ID : null;
|
| 668 |
wp_enqueue_media( array( 'post' => $post_id ) );
|
|
@@ -679,14 +661,11 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 679 |
*
|
| 680 |
* @since 3.0
|
| 681 |
*/
|
| 682 |
-
function meta_box_init()
|
| 683 |
-
{
|
| 684 |
$nonce_sent = false;
|
| 685 |
|
| 686 |
-
if( !empty( $this->instances_for_post_type ) )
|
| 687 |
-
|
| 688 |
-
foreach( $this->instances_for_post_type as $instance )
|
| 689 |
-
{
|
| 690 |
// facilitate more fine-grained meta box positioning than post type
|
| 691 |
$applicable = apply_filters( "attachments_location_{$instance}", true, $instance );
|
| 692 |
|
|
@@ -698,19 +677,19 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 698 |
$priority = isset($instance->priority) ? $instance->priority : 'high';
|
| 699 |
|
| 700 |
if( $applicable ) {
|
| 701 |
-
|
| 702 |
-
|
| 703 |
-
|
| 704 |
-
|
| 705 |
-
|
| 706 |
-
|
| 707 |
-
|
| 708 |
-
|
| 709 |
-
|
| 710 |
-
|
| 711 |
-
|
| 712 |
-
|
| 713 |
-
|
| 714 |
}
|
| 715 |
|
| 716 |
}
|
|
@@ -724,17 +703,17 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 724 |
*
|
| 725 |
* @since 3.0
|
| 726 |
*/
|
| 727 |
-
function meta_box_markup( $post, $metabox )
|
| 728 |
-
{
|
| 729 |
// single out our $instance
|
| 730 |
$instance = (object) $metabox['args']['instance'];
|
| 731 |
|
| 732 |
-
if( $metabox['args']['setup_nonce'] )
|
| 733 |
wp_nonce_field( 'attachments_save', 'attachments_nonce' );
|
|
|
|
| 734 |
|
| 735 |
?>
|
| 736 |
|
| 737 |
-
<div id="attachments-<?php echo $instance->name; ?>" class="attachments-parent-container<?php if( $instance->append == false ) : ?> attachments-prepend<?php endif; ?>">
|
| 738 |
<?php if( ! empty( $instance->note ) ) : ?>
|
| 739 |
<div class="attachments-note"><?php echo wpautop( $instance->note ); ?></div>
|
| 740 |
<?php endif; ?>
|
|
@@ -743,11 +722,9 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 743 |
<a class="button attachments-invoke"><?php _e( esc_attr( $instance->button_text ), 'attachments' ); ?></a>
|
| 744 |
</div>
|
| 745 |
<?php endif; ?>
|
| 746 |
-
<div class="attachments-container attachments-<?php echo $instance->name; ?>"><?php
|
| 747 |
-
if( isset( $instance->attachments ) && !empty( $instance->attachments ) )
|
| 748 |
-
|
| 749 |
-
foreach( $instance->attachments as $attachment )
|
| 750 |
-
{
|
| 751 |
// we need to give our Attachment a uid to carry through to all the fields
|
| 752 |
$attachment->uid = uniqid();
|
| 753 |
|
|
@@ -769,7 +746,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 769 |
button = '<?php echo __( esc_attr( $instance->modal_text ) ); ?>',
|
| 770 |
router = '<?php echo __( esc_attr( $instance->router ) ); ?>',
|
| 771 |
limit = <?php echo intval( $instance->limit ); ?>,
|
| 772 |
-
existing = <?php echo ( isset( $instance->attachments ) && !empty( $instance->attachments ) ) ? count( $instance->attachments ): 0; ?>,
|
| 773 |
attachmentsframe,
|
| 774 |
editframe;
|
| 775 |
|
|
@@ -864,12 +841,12 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 864 |
|
| 865 |
// if we're in a sidebar we DO want to show the fields which are normally hidden on load via CSS
|
| 866 |
if($element.parents('#side-sortables')){
|
| 867 |
-
$element.find('.attachments-attachment:last .attachments-fields').show();
|
| 868 |
}
|
| 869 |
|
| 870 |
// see if we need to set a default
|
| 871 |
// TODO: can we tie this into other field types (select, radio, checkbox)?
|
| 872 |
-
$element.find('.attachments-attachment:last .attachments-fields input, .attachments-attachment:last .attachments-fields textarea').each(function(){
|
| 873 |
if($(this).data('default')){
|
| 874 |
var meta_for_default = $(this).data('default');
|
| 875 |
if(attachments_isset(attachment.attributes)){
|
|
@@ -884,7 +861,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 884 |
|
| 885 |
// if it wasn't an image we need to ditch the dimensions
|
| 886 |
if(!attachments_isset(attachment.attributes.width)||!attachments_isset(attachment.attributes.height)){
|
| 887 |
-
$element.find('.attachments-attachment:last .dimensions').hide();
|
| 888 |
}
|
| 889 |
});
|
| 890 |
});
|
|
@@ -996,8 +973,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 996 |
*
|
| 997 |
* @since 3.0
|
| 998 |
**/
|
| 999 |
-
function get_field_types()
|
| 1000 |
-
{
|
| 1001 |
$field_types = array(
|
| 1002 |
'text' => ATTACHMENTS_DIR . 'classes/fields/class.field.text.php',
|
| 1003 |
'textarea' => ATTACHMENTS_DIR . 'classes/fields/class.field.textarea.php',
|
|
@@ -1009,11 +985,9 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1009 |
// $field_types = apply_filters( 'attachments_fields', $field_types );
|
| 1010 |
|
| 1011 |
$field_index = 0;
|
| 1012 |
-
foreach( $field_types as $type => $path )
|
| 1013 |
-
{
|
| 1014 |
// proceed with inclusion
|
| 1015 |
-
if( file_exists( $path ) )
|
| 1016 |
-
{
|
| 1017 |
// include the file
|
| 1018 |
include_once( $path );
|
| 1019 |
|
|
@@ -1032,7 +1006,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1032 |
$field_class = $existing_classes[$flag + $field_index + 1];
|
| 1033 |
|
| 1034 |
// create our link using our new field class
|
| 1035 |
-
$field_types[$type] = $field_class;
|
| 1036 |
|
| 1037 |
$field_index++;
|
| 1038 |
}
|
|
@@ -1049,8 +1023,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1049 |
*
|
| 1050 |
* @since 3.0
|
| 1051 |
*/
|
| 1052 |
-
function register_field( $params = array() )
|
| 1053 |
-
{
|
| 1054 |
$defaults = array(
|
| 1055 |
'name' => 'title',
|
| 1056 |
'type' => 'text',
|
|
@@ -1061,18 +1034,22 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1061 |
$params = array_merge( $defaults, $params );
|
| 1062 |
|
| 1063 |
// ensure it's a valid type
|
| 1064 |
-
if( !isset( $this->fields[$params['type']] ) )
|
| 1065 |
return false;
|
|
|
|
| 1066 |
|
| 1067 |
-
|
| 1068 |
-
|
| 1069 |
$params['name'] = str_replace( '-', '_', sanitize_title( $params['name'] ) );
|
|
|
|
| 1070 |
|
| 1071 |
-
if( isset( $params['label'] ) )
|
| 1072 |
$params['label'] = __( esc_html( $params['label'] ) );
|
|
|
|
| 1073 |
|
| 1074 |
-
if( !isset( $params['meta'] ) || !is_array( $params['meta'] ) )
|
| 1075 |
$params['meta'] = array();
|
|
|
|
| 1076 |
|
| 1077 |
// instantiate the class for this field and send it back
|
| 1078 |
return new $this->fields[ $params['type'] ]( $params['name'], $params['label'], $params['meta'] );
|
|
@@ -1085,8 +1062,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1085 |
*
|
| 1086 |
* @since 3.0
|
| 1087 |
*/
|
| 1088 |
-
function register( $name = 'attachments', $params = array() )
|
| 1089 |
-
{
|
| 1090 |
$defaults = array(
|
| 1091 |
|
| 1092 |
// title of the meta box (string)
|
|
@@ -1144,53 +1120,50 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1144 |
$params = array_merge( $defaults, $params );
|
| 1145 |
|
| 1146 |
// sanitize
|
| 1147 |
-
if( !is_array( $params['post_type'] ) )
|
| 1148 |
$params['post_type'] = array( $params['post_type'] ); // we always want an array
|
|
|
|
| 1149 |
|
| 1150 |
-
if( !is_array( $params['filetype'] ) )
|
| 1151 |
$params['filetype'] = array( $params['filetype'] ); // we always want an array
|
|
|
|
| 1152 |
|
| 1153 |
$params['label'] = esc_html( $params['label'] );
|
| 1154 |
$params['limit'] = intval( $params['limit'] );
|
| 1155 |
-
$params['note'] =
|
| 1156 |
$params['button_text'] = esc_attr( $params['button_text'] );
|
| 1157 |
$params['modal_text'] = esc_attr( $params['modal_text'] );
|
| 1158 |
|
| 1159 |
// make sure we've got valid filetypes
|
| 1160 |
-
if( is_array( $params['filetype'] ) )
|
| 1161 |
-
|
| 1162 |
-
|
| 1163 |
-
|
| 1164 |
-
if( !in_array( $filetype, $this->valid_filetypes ) )
|
| 1165 |
-
{
|
| 1166 |
-
unset( $params['filetype'][$key] );
|
| 1167 |
}
|
| 1168 |
}
|
| 1169 |
}
|
| 1170 |
|
| 1171 |
// WordPress sanitizes post type names when registering, so we will too
|
| 1172 |
-
foreach( $params['post_type'] as $key => $post_type )
|
| 1173 |
-
$params['post_type'][$key] = sanitize_key( $post_type );
|
| 1174 |
-
|
| 1175 |
|
| 1176 |
// make sure the instance name is proper
|
| 1177 |
$instance = str_replace( '-', '_', sanitize_title( $name ) );
|
| 1178 |
|
| 1179 |
// register the fields
|
| 1180 |
-
if( isset( $params['fields'] ) && is_array( $params['fields'] ) && count( $params['fields'] ) )
|
| 1181 |
-
|
| 1182 |
-
foreach( $params['fields'] as $field )
|
| 1183 |
-
{
|
| 1184 |
// register the field
|
| 1185 |
$this->register_field( $field );
|
| 1186 |
}
|
| 1187 |
}
|
| 1188 |
|
| 1189 |
// set the instance
|
| 1190 |
-
$this->instances[$instance] = $params;
|
| 1191 |
|
| 1192 |
// set the Attachments for this instance
|
| 1193 |
-
$this->instances[$instance]['attachments'] = $this->get_attachments( $instance );
|
| 1194 |
|
| 1195 |
}
|
| 1196 |
|
|
@@ -1201,18 +1174,14 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1201 |
*
|
| 1202 |
* @since 3.0
|
| 1203 |
*/
|
| 1204 |
-
function get_instances_for_post_type( $post_type = null )
|
| 1205 |
-
|
| 1206 |
-
$post_type = ( !is_null( $post_type ) && post_type_exists( $post_type ) ) ? $post_type : $this->get_post_type();
|
| 1207 |
|
| 1208 |
$instances = array();
|
| 1209 |
|
| 1210 |
-
if( !empty( $this->instances ) )
|
| 1211 |
-
|
| 1212 |
-
|
| 1213 |
-
{
|
| 1214 |
-
if( in_array( $post_type, $params['post_type'] ) )
|
| 1215 |
-
{
|
| 1216 |
$instances[] = $name;
|
| 1217 |
}
|
| 1218 |
}
|
|
@@ -1229,25 +1198,17 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1229 |
*
|
| 1230 |
* @since 3.0
|
| 1231 |
*/
|
| 1232 |
-
function get_post_type()
|
| 1233 |
-
{
|
| 1234 |
global $post;
|
| 1235 |
|
| 1236 |
// TODO: Retrieving the post_type at this point is ugly to say the least. This needs major cleanup.
|
| 1237 |
-
if( empty( $post->ID ) && isset( $_GET['post_type'] ) )
|
| 1238 |
-
|
| 1239 |
-
|
| 1240 |
-
}
|
| 1241 |
-
elseif( !empty( $post->ID ) )
|
| 1242 |
-
{
|
| 1243 |
$post_type = get_post_type( $post->ID );
|
| 1244 |
-
}
|
| 1245 |
-
elseif( isset( $_GET['post'] ) )
|
| 1246 |
-
{
|
| 1247 |
$post_type = get_post_type( intval( $_GET['post'] ) );
|
| 1248 |
-
}
|
| 1249 |
-
else
|
| 1250 |
-
{
|
| 1251 |
$post_type = 'post';
|
| 1252 |
}
|
| 1253 |
|
|
@@ -1261,8 +1222,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1261 |
*
|
| 1262 |
* @since 3.0
|
| 1263 |
*/
|
| 1264 |
-
function set_instances_for_current_post_type()
|
| 1265 |
-
{
|
| 1266 |
// store the applicable instances for this post type
|
| 1267 |
$this->instances_for_post_type = $this->get_instances_for_post_type( $this->get_post_type() );
|
| 1268 |
}
|
|
@@ -1274,22 +1234,20 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1274 |
*
|
| 1275 |
* @since 3.0
|
| 1276 |
*/
|
| 1277 |
-
function create_attachment_field( $instance, $field, $attachment = null )
|
| 1278 |
-
{
|
| 1279 |
|
| 1280 |
// the $field at this point is just the user-declared array
|
| 1281 |
// we need to make it a field object
|
| 1282 |
$type = $field['type'];
|
| 1283 |
|
| 1284 |
-
if( isset( $this->fields[$type] ) )
|
| 1285 |
-
{
|
| 1286 |
$name = sanitize_title( $field['name'] );
|
| 1287 |
$label = esc_html( $field['label'] );
|
| 1288 |
$default = isset( $field['default'] ) ? $field['default'] : false; // validated in the class
|
| 1289 |
$meta = isset( $field['meta'] ) ? $field['meta'] : array();
|
| 1290 |
$value = isset( $attachment->fields->$name ) ? $attachment->fields->$name : null;
|
| 1291 |
|
| 1292 |
-
$field = new $this->fields[$type]( $name, $label, $value, $meta );
|
| 1293 |
$field->value = $field->format_value_for_input( $field->value );
|
| 1294 |
|
| 1295 |
// does this field already have a unique ID?
|
|
@@ -1302,18 +1260,15 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1302 |
$field->set_field_default( $default );
|
| 1303 |
|
| 1304 |
?>
|
| 1305 |
-
<div class="attachments-attachment-field attachments-attachment-field-<?php echo $instance; ?> attachments-attachment-field-<?php echo $field->type; ?> attachment-field-<?php echo $field->name; ?>">
|
| 1306 |
-
<div class="attachment-label attachment-label-<?php echo $instance; ?>">
|
| 1307 |
-
<label for="<?php echo $field->field_id; ?>"><?php echo $field->label; ?></label>
|
| 1308 |
</div>
|
| 1309 |
-
<div class="attachment-field attachment-field-<?php echo $instance; ?>">
|
| 1310 |
<?php echo $this->create_field( $instance, $field ); ?>
|
| 1311 |
</div>
|
| 1312 |
</div>
|
| 1313 |
-
<?php
|
| 1314 |
-
}
|
| 1315 |
-
else
|
| 1316 |
-
{
|
| 1317 |
$field = false;
|
| 1318 |
}
|
| 1319 |
|
|
@@ -1327,8 +1282,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1327 |
*
|
| 1328 |
* @since 3.0
|
| 1329 |
*/
|
| 1330 |
-
function create_field( $instance, $field )
|
| 1331 |
-
{
|
| 1332 |
$field = (object) $field;
|
| 1333 |
|
| 1334 |
// with all of our attributes properly set, we can output
|
|
@@ -1342,26 +1296,24 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1342 |
*
|
| 1343 |
* @since 3.0
|
| 1344 |
*/
|
| 1345 |
-
function create_attachment( $instance, $attachment = null )
|
| 1346 |
-
{
|
| 1347 |
?>
|
| 1348 |
-
<div class="attachments-attachment attachments-attachment-<?php echo $instance; ?>">
|
| 1349 |
<?php $array_flag = ( isset( $attachment->uid ) ) ? $attachment->uid : '{{ attachments.attachment_uid }}'; ?>
|
| 1350 |
|
| 1351 |
-
<input type="hidden" class="attachments-track-id" name="attachments[<?php echo $instance; ?>][<?php echo $array_flag; ?>][id]" value="<?php echo isset( $attachment->id ) ? $attachment->id : '{{ attachments.id }}' ; ?>" />
|
| 1352 |
|
| 1353 |
<?php
|
| 1354 |
// since attributes can change over time (image gets replaced, cropped, etc.) we'll pull that info
|
| 1355 |
-
if( isset( $attachment->id ) )
|
| 1356 |
-
{
|
| 1357 |
// we'll just use the full size since that's what Media in 3.5 uses
|
| 1358 |
$attachment_meta = wp_get_attachment_metadata( $attachment->id );
|
| 1359 |
|
| 1360 |
// only images return the 'file' key
|
| 1361 |
-
if( !isset( $attachment_meta['file'] ))
|
| 1362 |
$attachment_meta['file'] = get_attached_file( $attachment->id );
|
| 1363 |
-
|
| 1364 |
-
|
| 1365 |
|
| 1366 |
$attachment->width = isset( $attachment_meta['width'] ) ? $attachment_meta['width'] : null;
|
| 1367 |
$attachment->height = isset( $attachment_meta['height'] ) ? $attachment_meta['height'] : null;
|
|
@@ -1383,9 +1335,9 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1383 |
<img src="<?php echo $image; ?>" alt="Thumbnail" />
|
| 1384 |
</div>
|
| 1385 |
<div class="attachment-details attachment-info details">
|
| 1386 |
-
<div class="filename"><?php echo isset( $attachment->filename ) ? $attachment->filename : '{{ attachments.filename }}' ; ?></div>
|
| 1387 |
-
<?php if( ( isset( $attachment->id ) && isset( $attachment->width ) ) || !isset( $attachment->id ) ) : ?>
|
| 1388 |
-
<div class="dimensions"><?php echo isset( $attachment->width ) ? $attachment->width : '{{ attachments.width }}' ; ?> × <?php echo isset( $attachment->height ) ? $attachment->height : '{{ attachments.height }}' ; ?></div>
|
| 1389 |
<?php endif; ?>
|
| 1390 |
<div class="edit-attachment-asset"><a href="#"><?php _e( 'Change', 'attachments' ); ?></a></div>
|
| 1391 |
<div class="delete-attachment"><a href="#"><?php _e( 'Remove', 'attachments' ); ?></a></div>
|
|
@@ -1397,8 +1349,9 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1397 |
|
| 1398 |
<div class="attachments-fields">
|
| 1399 |
<?php
|
| 1400 |
-
foreach( $this->instances[$instance]['fields'] as $field )
|
| 1401 |
$field_ref = $this->create_attachment_field( $instance, $field, $attachment );
|
|
|
|
| 1402 |
?>
|
| 1403 |
</div>
|
| 1404 |
|
|
@@ -1413,29 +1366,30 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1413 |
*
|
| 1414 |
* @since 3.1
|
| 1415 |
*/
|
| 1416 |
-
function field_assets()
|
| 1417 |
-
{
|
| 1418 |
global $post;
|
| 1419 |
|
| 1420 |
// we only want to enqueue if we're on an edit screen and it's applicable
|
| 1421 |
-
if( empty( $this->instances_for_post_type ) || empty( $post ) )
|
| 1422 |
return;
|
|
|
|
| 1423 |
|
| 1424 |
// all metaboxes have been put in place, we can now determine which field assets need to be included
|
| 1425 |
|
| 1426 |
// first we'll get a list of the field types on screen
|
| 1427 |
$fieldtypes = array();
|
| 1428 |
-
foreach( $this->instances_for_post_type as $instance )
|
| 1429 |
-
foreach( $this->instances[$instance]['fields'] as $field )
|
| 1430 |
$fieldtypes[] = $field['type'];
|
|
|
|
|
|
|
| 1431 |
|
| 1432 |
// we only want to dump out assets once for each field type
|
| 1433 |
$fieldtypes = array_unique( $fieldtypes );
|
| 1434 |
|
| 1435 |
// loop through and dump out all the assets
|
| 1436 |
-
foreach( $fieldtypes as $fieldtype )
|
| 1437 |
-
|
| 1438 |
-
$field = new $this->fields[$fieldtype];
|
| 1439 |
$field->assets();
|
| 1440 |
}
|
| 1441 |
}
|
|
@@ -1447,29 +1401,30 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1447 |
*
|
| 1448 |
* @since 3.1
|
| 1449 |
*/
|
| 1450 |
-
function field_inits()
|
| 1451 |
-
{
|
| 1452 |
global $post;
|
| 1453 |
|
| 1454 |
// we only want to enqueue if we're on an edit screen and it's applicable
|
| 1455 |
-
if( empty( $this->instances_for_post_type ) || empty( $post ) )
|
| 1456 |
return;
|
|
|
|
| 1457 |
|
| 1458 |
// all metaboxes have been put in place, we can now determine which field assets need to be included
|
| 1459 |
|
| 1460 |
// first we'll get a list of the field types on screen
|
| 1461 |
$fieldtypes = array();
|
| 1462 |
-
foreach( $this->instances_for_post_type as $instance )
|
| 1463 |
-
foreach( $this->instances[$instance]['fields'] as $field )
|
| 1464 |
$fieldtypes[] = $field['type'];
|
|
|
|
|
|
|
| 1465 |
|
| 1466 |
// we only want to dump out assets once for each field type
|
| 1467 |
$fieldtypes = array_unique( $fieldtypes );
|
| 1468 |
|
| 1469 |
// loop through and dump out all the assets
|
| 1470 |
-
foreach( $fieldtypes as $fieldtype )
|
| 1471 |
-
|
| 1472 |
-
$field = new $this->fields[$fieldtype];
|
| 1473 |
$field->init();
|
| 1474 |
}
|
| 1475 |
}
|
|
@@ -1482,16 +1437,13 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1482 |
*
|
| 1483 |
* @since 3.0
|
| 1484 |
*/
|
| 1485 |
-
function admin_footer()
|
| 1486 |
-
|
| 1487 |
-
if( !empty( $this->instances_for_post_type ) )
|
| 1488 |
-
{ ?>
|
| 1489 |
<script type="text/javascript">
|
| 1490 |
var ATTACHMENTS_VIEWS = {};
|
| 1491 |
</script>
|
| 1492 |
-
|
| 1493 |
-
|
| 1494 |
-
<script type="text/template" id="tmpl-attachments-<?php echo $instance; ?>">
|
| 1495 |
<?php $this->create_attachment( $instance ); ?>
|
| 1496 |
</script>
|
| 1497 |
<?php endforeach;
|
|
@@ -1505,23 +1457,26 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1505 |
*
|
| 1506 |
* @since 3.0
|
| 1507 |
*/
|
| 1508 |
-
function save( $post_id )
|
| 1509 |
-
{
|
| 1510 |
// is the user logged in?
|
| 1511 |
-
if( !is_user_logged_in() )
|
| 1512 |
return $post_id;
|
|
|
|
| 1513 |
|
| 1514 |
// is the nonce set?
|
| 1515 |
-
if( !isset( $_POST['attachments_nonce'] ) )
|
| 1516 |
return $post_id;
|
|
|
|
| 1517 |
|
| 1518 |
// is the nonce valid?
|
| 1519 |
-
if( !wp_verify_nonce( $_POST['attachments_nonce'], 'attachments_save' ) )
|
| 1520 |
return $post_id;
|
|
|
|
| 1521 |
|
| 1522 |
// can this user edit this post?
|
| 1523 |
-
if( !current_user_can( 'edit_post', $post_id ) )
|
| 1524 |
return $post_id;
|
|
|
|
| 1525 |
|
| 1526 |
// passed authentication, proceed with save
|
| 1527 |
|
|
@@ -1543,45 +1498,38 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1543 |
* @return bool
|
| 1544 |
* @since 3.4.3
|
| 1545 |
*/
|
| 1546 |
-
function save_metadata( $post_id = 0, $attachments_meta = null )
|
| 1547 |
-
|
| 1548 |
-
if( !is_array( $attachments_meta ) || !is_int( $post_id ) || intval( $post_id ) < 1 )
|
| 1549 |
return false;
|
|
|
|
| 1550 |
|
| 1551 |
// final data store
|
| 1552 |
$attachments = array();
|
| 1553 |
|
| 1554 |
// loop through each submitted instance
|
| 1555 |
-
foreach( $attachments_meta as $instance => $instance_attachments )
|
| 1556 |
-
{
|
| 1557 |
// loop through each Attachment of this instance
|
| 1558 |
-
foreach( $instance_attachments as $key => $attachment )
|
| 1559 |
-
|
| 1560 |
-
|
| 1561 |
-
|
| 1562 |
-
|
| 1563 |
-
|
| 1564 |
-
|
| 1565 |
-
|
| 1566 |
-
|
| 1567 |
-
|
| 1568 |
-
|
| 1569 |
-
|
| 1570 |
-
}
|
| 1571 |
-
|
| 1572 |
-
$attachment_exists = isset( $attachment['id'] ) ? get_post( absint( $attachment['id'] ) ) : false;
|
| 1573 |
|
| 1574 |
// make sure the attachment exists
|
| 1575 |
-
if( $attachment_exists )
|
| 1576 |
-
{
|
| 1577 |
// since we're using JSON for storage in the database, we need
|
| 1578 |
// to make sure that characters are encoded that would otherwise
|
| 1579 |
// break the JSON
|
| 1580 |
-
if( isset( $attachment['fields'] ) && is_array( $attachment['fields'] ) )
|
| 1581 |
-
{
|
| 1582 |
|
| 1583 |
-
foreach( $attachment['fields'] as $key => $field_value )
|
| 1584 |
-
{
|
| 1585 |
// take care of our returns
|
| 1586 |
$field_value = str_replace( "\r\n", "\n", $field_value );
|
| 1587 |
$field_value = str_replace( "\r", "\n", $field_value );
|
|
@@ -1599,30 +1547,29 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1599 |
$field_value = $this->encode_field_value( $field_value );
|
| 1600 |
|
| 1601 |
// encode things properly
|
| 1602 |
-
$attachment['fields'][$key] = $field_value;
|
| 1603 |
}
|
| 1604 |
}
|
| 1605 |
|
| 1606 |
-
|
| 1607 |
-
|
| 1608 |
-
|
| 1609 |
-
|
| 1610 |
-
|
| 1611 |
-
|
| 1612 |
-
|
| 1613 |
-
|
| 1614 |
-
|
| 1615 |
-
|
| 1616 |
-
|
| 1617 |
-
|
| 1618 |
|
| 1619 |
-
$attachments[$instance][] = $attachment;
|
| 1620 |
}
|
| 1621 |
}
|
| 1622 |
}
|
| 1623 |
|
| 1624 |
-
if( !empty( $attachments ) )
|
| 1625 |
-
{
|
| 1626 |
// we're going to store JSON (JSON_UNESCAPED_UNICODE is PHP 5.4+)
|
| 1627 |
$attachments = version_compare( PHP_VERSION, '5.4.0', '>=' ) ? json_encode( $attachments, JSON_UNESCAPED_UNICODE ) : json_encode( $attachments );
|
| 1628 |
|
|
@@ -1631,9 +1578,7 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1631 |
|
| 1632 |
// we're going to wipe out any existing Attachments meta (because we'll put it back)
|
| 1633 |
return update_post_meta( $post_id, $this->meta_key, $attachments );
|
| 1634 |
-
}
|
| 1635 |
-
else
|
| 1636 |
-
{
|
| 1637 |
// there are no attachments so we'll clean up the record
|
| 1638 |
return delete_post_meta( $post_id, $this->meta_key );
|
| 1639 |
}
|
|
@@ -1648,27 +1593,26 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1648 |
*
|
| 1649 |
* @since 3.3
|
| 1650 |
*/
|
| 1651 |
-
function encode_field_value( $field_value = null )
|
| 1652 |
-
|
| 1653 |
-
if( is_null( $field_value ) )
|
| 1654 |
return false;
|
|
|
|
| 1655 |
|
| 1656 |
-
if( is_object( $field_value ) )
|
| 1657 |
-
{
|
| 1658 |
$input = get_object_vars( $field_value );
|
| 1659 |
|
| 1660 |
-
foreach( $input as $key => $val )
|
| 1661 |
-
$field_value[$key] = $this->encode_field_value( $val );
|
|
|
|
| 1662 |
|
| 1663 |
$field_value = (object) $field_value;
|
| 1664 |
-
}
|
| 1665 |
-
|
| 1666 |
-
{
|
| 1667 |
-
foreach( $field_value as $key => $val )
|
| 1668 |
$field_value[$key] = $this->encode_field_value( $val );
|
| 1669 |
-
|
| 1670 |
-
else
|
| 1671 |
$field_value = htmlentities( $field_value, ENT_QUOTES, 'UTF-8' );
|
|
|
|
| 1672 |
|
| 1673 |
return $field_value;
|
| 1674 |
}
|
|
@@ -1680,44 +1624,45 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1680 |
*
|
| 1681 |
* @since 3.0
|
| 1682 |
*/
|
| 1683 |
-
function get_attachments( $instance = null, $post_id = null )
|
| 1684 |
-
{
|
| 1685 |
$post_id = $this->determine_post_id( $post_id );
|
| 1686 |
|
| 1687 |
-
if(
|
| 1688 |
return false;
|
|
|
|
| 1689 |
|
| 1690 |
$attachments = array();
|
| 1691 |
$attachments_raw = $this->get_attachments_metadata( $post_id );
|
| 1692 |
|
| 1693 |
// we need to decode the fields (that were encoded during save) and run them through
|
| 1694 |
// their format_value_for_input as defined in it's class
|
| 1695 |
-
if( !is_null( $instance ) && is_string( $instance ) && isset( $attachments_raw->$instance ) )
|
| 1696 |
-
|
| 1697 |
-
foreach( $attachments_raw->$instance as $attachment )
|
| 1698 |
$attachments[] = $this->process_attachment( $attachment, $instance );
|
| 1699 |
-
|
| 1700 |
-
elseif( is_null( $instance ) )
|
| 1701 |
-
{
|
| 1702 |
// return them all, regardless of instance
|
| 1703 |
-
if( ( is_array( $attachments_raw ) && count( $attachments_raw ) ) || is_object( $attachments_raw ) )
|
| 1704 |
-
{
|
| 1705 |
// cast an object if necessary
|
| 1706 |
-
if( is_object( $attachments_raw ) ) $attachments_raw = (array) $attachments_raw;
|
| 1707 |
|
| 1708 |
-
foreach( $attachments_raw as $instance => $attachments_unprocessed )
|
| 1709 |
-
foreach( $attachments_unprocessed as $unprocessed_attachment )
|
| 1710 |
$attachments[] = $this->process_attachment( $unprocessed_attachment, $instance );
|
|
|
|
|
|
|
| 1711 |
}
|
| 1712 |
}
|
| 1713 |
|
| 1714 |
// tack on the post ID for each attachment
|
| 1715 |
-
for( $i = 0; $i < count( $attachments ); $i++ )
|
| 1716 |
-
$attachments[$i]->post_id = $post_id;
|
|
|
|
| 1717 |
|
| 1718 |
// we don't want the filter to run on the admin side of things
|
| 1719 |
-
if( !is_admin() )
|
| 1720 |
$attachments = apply_filters( "attachments_get_{$instance}", $attachments );
|
|
|
|
| 1721 |
|
| 1722 |
return $attachments;
|
| 1723 |
}
|
|
@@ -1731,21 +1676,25 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1731 |
*
|
| 1732 |
* @since 3.3
|
| 1733 |
*/
|
| 1734 |
-
function get_attachments_metadata( $post_id )
|
| 1735 |
-
{
|
| 1736 |
$post_id = intval( $post_id );
|
| 1737 |
|
| 1738 |
// grab our JSON and decode it
|
| 1739 |
$attachments_json = get_post_meta( $post_id, $this->meta_key, true );
|
| 1740 |
$attachments_raw = is_string( $attachments_json ) ? json_decode( $attachments_json ) : false;
|
| 1741 |
|
| 1742 |
-
|
| 1743 |
-
|
| 1744 |
-
|
| 1745 |
-
|
| 1746 |
-
|
| 1747 |
-
|
| 1748 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1749 |
|
| 1750 |
return $attachments_raw;
|
| 1751 |
}
|
|
@@ -1757,25 +1706,17 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1757 |
* @param int $post_id Desired post ID
|
| 1758 |
* @return mixed The understood post ID
|
| 1759 |
*/
|
| 1760 |
-
function determine_post_id( $post_id = null )
|
| 1761 |
-
{
|
| 1762 |
global $post;
|
| 1763 |
|
| 1764 |
// if a post id was passed, we'll use it
|
| 1765 |
-
if( !is_null( $post_id ) )
|
| 1766 |
-
{
|
| 1767 |
$post_id = intval( $post_id );
|
| 1768 |
-
}
|
| 1769 |
-
elseif( is_null( $post_id ) && is_object( $post ) && isset( $post->ID ) )
|
| 1770 |
-
{
|
| 1771 |
$post_id = $post->ID;
|
| 1772 |
-
}
|
| 1773 |
-
elseif( isset( $_GET['post'] ) )
|
| 1774 |
-
{
|
| 1775 |
$post_id = intval( $_GET['post'] );
|
| 1776 |
-
}
|
| 1777 |
-
else
|
| 1778 |
-
{
|
| 1779 |
// no post ID, nothing to do...
|
| 1780 |
$post_id = false;
|
| 1781 |
}
|
|
@@ -1793,40 +1734,30 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1793 |
*
|
| 1794 |
* @since 3.3
|
| 1795 |
*/
|
| 1796 |
-
function process_attachment( $attachment, $instance )
|
| 1797 |
-
|
| 1798 |
-
if( !is_object( $attachment ) || !is_string( $instance ) )
|
| 1799 |
return $attachment;
|
|
|
|
| 1800 |
|
| 1801 |
-
if( isset( $attachment->fields ) && is_object( $attachment->fields ) )
|
| 1802 |
-
|
| 1803 |
-
foreach( $attachment->fields as $key => $value )
|
| 1804 |
-
{
|
| 1805 |
// loop through the instance fields to get the type
|
| 1806 |
-
if( isset( $this->instances[$instance]['fields'] ) )
|
| 1807 |
-
{
|
| 1808 |
$type = '';
|
| 1809 |
-
foreach( $this->instances[$instance]['fields'] as $field )
|
| 1810 |
-
|
| 1811 |
-
if( isset( $field['name'] ) && $field['name'] == $key )
|
| 1812 |
-
{
|
| 1813 |
$type = isset( $field['type'] ) ? $field['type'] : false;
|
| 1814 |
break;
|
| 1815 |
}
|
| 1816 |
}
|
| 1817 |
-
if( isset( $this->fields[$type] ) )
|
| 1818 |
-
{
|
| 1819 |
// we need to decode the html entities that were encoded for the save
|
| 1820 |
$attachment->fields->$key = $this->decode_field_value( $attachment->fields->$key );
|
| 1821 |
-
}
|
| 1822 |
-
else
|
| 1823 |
-
{
|
| 1824 |
// the type doesn't exist
|
| 1825 |
$attachment->fields->$key = false;
|
| 1826 |
}
|
| 1827 |
-
}
|
| 1828 |
-
else
|
| 1829 |
-
{
|
| 1830 |
// this was a theme file request, just grab it
|
| 1831 |
$attachment->fields->$key = $this->decode_field_value( $attachment->fields->$key );
|
| 1832 |
}
|
|
@@ -1844,27 +1775,26 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1844 |
*
|
| 1845 |
* @since 3.3
|
| 1846 |
*/
|
| 1847 |
-
function decode_field_value( $field_value = null )
|
| 1848 |
-
|
| 1849 |
-
if( is_null( $field_value ) )
|
| 1850 |
return false;
|
|
|
|
| 1851 |
|
| 1852 |
-
if( is_object( $field_value ) )
|
| 1853 |
-
{
|
| 1854 |
$input = get_object_vars( $field_value );
|
| 1855 |
|
| 1856 |
-
foreach( $input as $key => $val )
|
| 1857 |
$field_value[$key] = $this->decode_field_value( $val );
|
|
|
|
| 1858 |
|
| 1859 |
$field_value = (object) $field_value;
|
| 1860 |
-
}
|
| 1861 |
-
|
| 1862 |
-
{
|
| 1863 |
-
foreach( $field_value as $key => $val )
|
| 1864 |
$field_value[$key] = $this->decode_field_value( $val );
|
| 1865 |
-
|
| 1866 |
-
else
|
| 1867 |
$field_value = html_entity_decode( $field_value, ENT_QUOTES, 'UTF-8' );
|
|
|
|
| 1868 |
|
| 1869 |
return $field_value;
|
| 1870 |
}
|
|
@@ -1877,11 +1807,11 @@ if( !class_exists( 'Attachments' ) ) :
|
|
| 1877 |
* @since 3.0
|
| 1878 |
*/
|
| 1879 |
function admin_page() {
|
| 1880 |
-
|
| 1881 |
-
|
| 1882 |
-
|
| 1883 |
-
|
| 1884 |
-
|
| 1885 |
}
|
| 1886 |
|
| 1887 |
|
| 11 |
*/
|
| 12 |
|
| 13 |
// Exit if accessed directly
|
| 14 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
| 15 |
+
exit;
|
| 16 |
+
}
|
| 17 |
|
| 18 |
// Declare our class
|
| 19 |
+
if ( ! class_exists( 'Attachments' ) ) :
|
| 20 |
|
| 21 |
/**
|
| 22 |
* Main Attachments Class
|
| 24 |
* @since 3.0
|
| 25 |
*/
|
| 26 |
|
| 27 |
+
class Attachments {
|
| 28 |
+
|
| 29 |
private $version; // stores Attachments' version number
|
| 30 |
private $url; // stores Attachments' URL
|
| 31 |
private $dir; // stores Attachments' directory
|
| 52 |
*
|
| 53 |
* @since 3.0
|
| 54 |
*/
|
| 55 |
+
function __construct( $instance = null, $post_id = null ) {
|
|
|
|
| 56 |
global $_wp_additional_image_sizes;
|
| 57 |
|
| 58 |
// establish our environment variables
|
| 59 |
+
$this->version = '3.5.5';
|
| 60 |
$this->url = ATTACHMENTS_URL;
|
| 61 |
$this->dir = ATTACHMENTS_DIR;
|
| 62 |
$plugin = 'attachments/index.php';
|
| 77 |
add_filter( "plugin_action_links_$plugin", array( $this, 'plugin_settings_link' ) );
|
| 78 |
|
| 79 |
// add update message(s)
|
| 80 |
+
// add_action( 'in_plugin_update_message-attachments/index.php', array( $this, 'update_message' ) );
|
| 81 |
|
| 82 |
// set up l10n
|
| 83 |
add_action( 'plugins_loaded', array( $this, 'l10n' ) );
|
| 107 |
add_action( 'admin_init', array( $this, 'admin_init' ) );
|
| 108 |
|
| 109 |
// execution of actions varies depending on whether we're in the admin or not and an instance was passed
|
| 110 |
+
if( is_admin() ) {
|
|
|
|
| 111 |
add_action( 'after_setup_theme', array( $this, 'apply_init_filters' ), 999 );
|
| 112 |
$this->attachments = $this->get_attachments( $instance, $post_id );
|
| 113 |
+
} elseif ( ! is_null( $instance ) ) {
|
|
|
|
|
|
|
| 114 |
$this->apply_init_filters();
|
| 115 |
$this->attachments = $this->get_attachments( $instance, $post_id );
|
| 116 |
}
|
| 122 |
/**
|
| 123 |
* Add notification about available Attachments extensions
|
| 124 |
*/
|
| 125 |
+
function update_message() { ?>
|
|
|
|
| 126 |
<div style="margin-top:10px;padding-top:8px;border-top:1px solid #eaeaea;"><span style="color:#f00;"><?php _e( 'Attachments Extensions Available!', 'attachments' ); ?></span> <span style="font-weight:normal;"><?php _e( 'These utilities make working with Attachments even easier!', 'attachments' ); ?></span></div>
|
| 127 |
<div style="font-weight:normal;padding-top:8px;">
|
| 128 |
<p><strong><a href="https://mondaybynoon.com/members/plugins/attachments-ui/?utm_campaign=Attachments&utm_term=Upgrade%2bNotice">Attachments UI</a></strong> - <?php _e( 'Create Attachments Instances with an easy-to-use UI, easily limit meta box locations with fine grained control (e.g. Home page only), and more.', 'attachments' ); ?></p>
|
| 137 |
* @param $links
|
| 138 |
* @return mixed
|
| 139 |
*/
|
| 140 |
+
function plugin_settings_link( $links ) {
|
|
|
|
| 141 |
$settings_link = '<a href="options-general.php?page=attachments">'. __( 'Settings', 'attachments' ) . '</a>';
|
| 142 |
array_unshift( $links, $settings_link );
|
| 143 |
$extend_link = '<a href="https://mondaybynoon.com/members/plugins/?utm_campaign=Attachments&utm_term=Plugins%2bExtend#attachments">'. __( 'Extend', 'attachments' ) . '</a>';
|
| 144 |
array_unshift( $links, $extend_link );
|
| 145 |
+
|
| 146 |
return $links;
|
| 147 |
}
|
| 148 |
|
| 153 |
*
|
| 154 |
* @since 3.4.3
|
| 155 |
*/
|
| 156 |
+
function admin_init() {
|
| 157 |
+
if ( current_user_can( 'delete_posts' ) ) {
|
|
|
|
| 158 |
add_action( 'delete_post', array( $this, 'handle_wp_post_delete' ), 10 );
|
| 159 |
+
}
|
| 160 |
}
|
| 161 |
|
| 162 |
|
| 167 |
* @return array
|
| 168 |
* @since 3.5
|
| 169 |
*/
|
| 170 |
+
function get_fields() {
|
|
|
|
| 171 |
return $this->fields;
|
| 172 |
}
|
| 173 |
|
| 180 |
* @param int $pid Post ID
|
| 181 |
* @since 3.4.3
|
| 182 |
*/
|
| 183 |
+
function handle_wp_post_delete( $pid ) {
|
| 184 |
+
|
| 185 |
+
if ( ! current_user_can( 'delete_posts' ) ) {
|
| 186 |
+
return;
|
| 187 |
+
}
|
| 188 |
+
|
| 189 |
// check to make sure it was an attachment
|
| 190 |
+
if( 'attachment' != get_post_type( $pid ) ) {
|
| 191 |
return;
|
| 192 |
+
}
|
| 193 |
|
| 194 |
// if a user deletes an attachment from the Media library (but it's been used
|
| 195 |
// in Attachments somewhere else) we need to clean that up...
|
| 201 |
// so we're going to use the search class to find all instances
|
| 202 |
// for any occurrence of the deleted attachment (which has an ID of $pid)
|
| 203 |
|
| 204 |
+
if ( is_array( $this->instances ) ) {
|
| 205 |
+
foreach( $this->instances as $instance => $details ) {
|
|
|
|
|
|
|
| 206 |
$search_args = array(
|
| 207 |
'instance' => $instance,
|
| 208 |
'attachment_id' => intval( $pid ),
|
| 210 |
|
| 211 |
$this->search( null, $search_args );
|
| 212 |
|
| 213 |
+
if( $this->exist() ) {
|
|
|
|
| 214 |
// we've got a hit (e.g. an existing post uses the deleted attachment)
|
| 215 |
+
while( $attachment = $this->get() ) {
|
|
|
|
| 216 |
$post_id = $attachment->post_id;
|
| 217 |
|
| 218 |
// we'll use the post ID to snag the details
|
| 219 |
$post_attachments = $this->get_attachments_metadata( $post_id );
|
| 220 |
|
| 221 |
+
if( is_object( $post_attachments ) ) {
|
| 222 |
+
foreach( $post_attachments as $existing_instance => $existing_instance_attachments ) {
|
| 223 |
+
foreach( $existing_instance_attachments as $existing_instance_attachment_key => $existing_instance_attachment ) {
|
| 224 |
+
if( $pid == intval( $existing_instance_attachment->id ) ) {
|
|
|
|
| 225 |
unset( $post_attachments->{$existing_instance}[$existing_instance_attachment_key] );
|
| 226 |
+
}
|
| 227 |
+
}
|
| 228 |
+
}
|
| 229 |
|
| 230 |
// saving routine assumes array from POST so we'll typecast it
|
| 231 |
$post_attachments = (array) $post_attachments;
|
| 246 |
*
|
| 247 |
* @since 3.4.2
|
| 248 |
*/
|
| 249 |
+
function get_meta_key() {
|
|
|
|
| 250 |
return $this->meta_key;
|
| 251 |
}
|
| 252 |
|
| 257 |
*
|
| 258 |
* @since 3.5
|
| 259 |
*/
|
| 260 |
+
function get_url() {
|
|
|
|
| 261 |
return $this->url;
|
| 262 |
}
|
| 263 |
|
| 268 |
*
|
| 269 |
* @since 3.4.2
|
| 270 |
*/
|
| 271 |
+
function l10n() {
|
| 272 |
+
load_plugin_textdomain( 'attachments', false, 'attachments/languages/' );
|
|
|
|
| 273 |
}
|
| 274 |
|
| 275 |
|
| 276 |
|
| 277 |
+
function load_extensions() {
|
|
|
|
| 278 |
do_action( 'attachments_extension', $this );
|
| 279 |
}
|
| 280 |
|
| 285 |
*
|
| 286 |
* @since 3.4
|
| 287 |
*/
|
| 288 |
+
function apply_init_filters() {
|
|
|
|
| 289 |
// allows a different meta_key to be used
|
| 290 |
$this->meta_key = apply_filters( 'attachments_meta_key', $this->meta_key );
|
| 291 |
}
|
| 297 |
*
|
| 298 |
* @since 3.3
|
| 299 |
*/
|
| 300 |
+
function search( $query = null, $params = array() ) {
|
|
|
|
| 301 |
$results = new AttachmentsSearch( $query, $params );
|
| 302 |
$this->attachments = $results->results;
|
| 303 |
}
|
| 309 |
*
|
| 310 |
* @since 3.0
|
| 311 |
*/
|
| 312 |
+
function exist() {
|
| 313 |
+
return ! empty( $this->attachments );
|
|
|
|
| 314 |
}
|
| 315 |
|
| 316 |
|
| 320 |
*
|
| 321 |
* @since 3.0.6
|
| 322 |
*/
|
| 323 |
+
function total() {
|
|
|
|
| 324 |
return count( $this->attachments );
|
| 325 |
}
|
| 326 |
|
| 331 |
*
|
| 332 |
* @since 3.6
|
| 333 |
*/
|
| 334 |
+
function rewind() {
|
|
|
|
| 335 |
$this->attachments_ref = -1;
|
| 336 |
}
|
| 337 |
|
| 342 |
*
|
| 343 |
* @since 3.0
|
| 344 |
*/
|
| 345 |
+
function get() {
|
|
|
|
| 346 |
$this->attachments_ref++;
|
| 347 |
|
| 348 |
+
if ( ! count( $this->attachments ) || $this->attachments_ref >= count( $this->attachments ) ) {
|
| 349 |
return false;
|
| 350 |
+
}
|
| 351 |
|
| 352 |
+
return $this->attachments[ $this->attachments_ref ];
|
| 353 |
}
|
| 354 |
|
| 355 |
|
| 359 |
*
|
| 360 |
* @since 3.2
|
| 361 |
*/
|
| 362 |
+
function get_single( $index ) {
|
| 363 |
+
return isset( $this->attachments[ $index ] ) ? $this->attachments[ $index ] : false;
|
|
|
|
| 364 |
}
|
| 365 |
|
| 366 |
|
| 370 |
*
|
| 371 |
* @since 3.0.6
|
| 372 |
*/
|
| 373 |
+
function asset( $size = 'thumbnail', $index = null ) {
|
|
|
|
| 374 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 375 |
|
| 376 |
// do we have our meta yet?
|
| 377 |
+
if ( ! isset( $this->attachments[ $index ]->meta ) ) {
|
| 378 |
+
$this->attachments[ $index ]->meta = wp_get_attachment_metadata( $this->attachments[ $index ]->id );
|
| 379 |
+
}
|
| 380 |
|
| 381 |
// is it an image?
|
| 382 |
+
if ( isset( $this->attachments[ $index ]->meta['sizes'] ) ) {
|
| 383 |
+
$asset = wp_get_attachment_image_src( $this->attachments[ $index ]->id, $size );
|
| 384 |
+
} else {
|
|
|
|
|
|
|
|
|
|
| 385 |
// either it's not an image or we don't have the proper size, so we'll use the icon
|
| 386 |
$asset = $this->icon( $index );
|
| 387 |
}
|
| 396 |
*
|
| 397 |
* @since 3.0.6
|
| 398 |
*/
|
| 399 |
+
function icon( $index = null ) {
|
|
|
|
| 400 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 401 |
+
$asset = wp_get_attachment_image_src( $this->attachments[ $index ]->id, null, true );
|
| 402 |
|
| 403 |
return $asset;
|
| 404 |
}
|
| 411 |
*
|
| 412 |
* @since 3.4.1
|
| 413 |
*/
|
| 414 |
+
function date( $d = "d/m/Y", $index = null ) {
|
|
|
|
| 415 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 416 |
+
$date = get_the_time( $d, $this->attachments[ $index ]->id );
|
| 417 |
|
| 418 |
return $date;
|
| 419 |
}
|
| 425 |
*
|
| 426 |
* @since 3.0
|
| 427 |
*/
|
| 428 |
+
function image( $size = 'thumbnail', $index = null ) {
|
|
|
|
| 429 |
$asset = $this->asset( $size, $index );
|
| 430 |
|
| 431 |
$image_src = $asset[0];
|
| 432 |
$image_width = $asset[1];
|
| 433 |
$image_height = $asset[2];
|
| 434 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 435 |
+
$image_alt = get_post_meta( $this->attachments[ $index ]->id, '_wp_attachment_image_alt', true );
|
| 436 |
|
| 437 |
+
$image = '<img src="' . esc_url( $image_src ) . '" width="' . absint( $image_width ) . '" height="' . absint( $image_height ) . '" alt="' . esc_attr( $image_alt ) . '" />';
|
| 438 |
|
| 439 |
return $image;
|
| 440 |
}
|
| 446 |
*
|
| 447 |
* @since 3.0
|
| 448 |
*/
|
| 449 |
+
function src( $size = 'thumbnail', $index = null ) {
|
|
|
|
| 450 |
$asset = $this->asset( $size, $index );
|
| 451 |
+
|
| 452 |
+
return esc_url( $asset[0] );
|
| 453 |
}
|
| 454 |
|
| 455 |
|
| 459 |
*
|
| 460 |
* @since 3.5
|
| 461 |
*/
|
| 462 |
+
function width( $size = 'thumbnail', $index = null ) {
|
|
|
|
| 463 |
$asset = $this->asset( $size, $index );
|
| 464 |
+
|
| 465 |
+
return absint( $asset[1] );
|
| 466 |
}
|
| 467 |
|
| 468 |
|
| 472 |
*
|
| 473 |
* @since 3.5
|
| 474 |
*/
|
| 475 |
+
function height( $size = 'thumbnail', $index = null ) {
|
|
|
|
| 476 |
$asset = $this->asset( $size, $index );
|
| 477 |
+
|
| 478 |
+
return absint( $asset[2] );
|
| 479 |
}
|
| 480 |
|
| 481 |
|
| 485 |
*
|
| 486 |
* @since 3.0
|
| 487 |
*/
|
| 488 |
+
function filesize( $index = null, $size = null ) {
|
|
|
|
| 489 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 490 |
|
| 491 |
+
if ( ! isset( $this->attachments[ $index ]->id ) ) {
|
| 492 |
return false;
|
| 493 |
+
}
|
| 494 |
|
| 495 |
// if an image size is passed along, use that
|
| 496 |
+
$url = is_string( $size ) ? $this->src( $size, $index ) : wp_get_attachment_url( $this->attachments[ $index ]->id );
|
| 497 |
$uploads = wp_upload_dir();
|
| 498 |
$file_path = str_replace( $uploads['baseurl'], $uploads['basedir'], $url );
|
| 499 |
|
| 500 |
$formatted = '0 bytes';
|
| 501 |
+
if ( file_exists( $file_path ) ) {
|
| 502 |
$formatted = size_format( @filesize( $file_path ) );
|
| 503 |
+
}
|
| 504 |
|
| 505 |
return $formatted;
|
| 506 |
}
|
| 512 |
*
|
| 513 |
* @since 3.0
|
| 514 |
*/
|
| 515 |
+
function type( $index = null ) {
|
|
|
|
| 516 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 517 |
|
| 518 |
+
if ( ! isset( $this->attachments[$index]->id ) ) {
|
| 519 |
return false;
|
| 520 |
+
}
|
| 521 |
|
| 522 |
$attachment_mime = $this->get_mime_type( $this->attachments[$index]->id );
|
| 523 |
+
|
| 524 |
return $attachment_mime;
|
| 525 |
}
|
| 526 |
|
| 531 |
*
|
| 532 |
* @since 3.4.2
|
| 533 |
*/
|
| 534 |
+
function get_mime_type( $id = null ) {
|
|
|
|
| 535 |
$attachment_mime = explode( '/', get_post_mime_type( intval( $id ) ) );
|
| 536 |
+
|
| 537 |
return isset( $attachment_mime[0] ) ? $attachment_mime[0] : false;
|
| 538 |
}
|
| 539 |
|
| 544 |
*
|
| 545 |
* @since 3.0
|
| 546 |
*/
|
| 547 |
+
function subtype( $index = null ) {
|
|
|
|
| 548 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 549 |
|
| 550 |
+
if ( ! isset( $this->attachments[$index]->id ) ) {
|
| 551 |
return false;
|
| 552 |
+
}
|
| 553 |
+
|
| 554 |
+
$attachment_mime = explode( '/', get_post_mime_type( $this->attachments[ $index ]->id ) );
|
| 555 |
|
|
|
|
| 556 |
return isset( $attachment_mime[1] ) ? $attachment_mime[1] : false;
|
| 557 |
}
|
| 558 |
|
| 563 |
*
|
| 564 |
* @since 3.0
|
| 565 |
*/
|
| 566 |
+
function id( $index = null ) {
|
|
|
|
| 567 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 568 |
|
| 569 |
+
return isset( $this->attachments[ $index ]->id ) ? $this->attachments[ $index ]->id : false;
|
| 570 |
}
|
| 571 |
|
| 572 |
|
| 576 |
*
|
| 577 |
* @since 3.3
|
| 578 |
*/
|
| 579 |
+
function post_id( $index = null ) {
|
|
|
|
| 580 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 581 |
|
| 582 |
+
return isset( $this->attachments[ $index ]->post_id ) ? $this->attachments[ $index ]->post_id : false;
|
| 583 |
}
|
| 584 |
|
| 585 |
|
| 589 |
*
|
| 590 |
* @since 3.0
|
| 591 |
*/
|
| 592 |
+
function url( $index = null ) {
|
|
|
|
| 593 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 594 |
|
| 595 |
+
return isset( $this->attachments[ $index ]->id ) ? wp_get_attachment_url( $this->attachments[ $index ]->id ) : false;
|
| 596 |
}
|
| 597 |
|
| 598 |
|
| 602 |
*
|
| 603 |
* @since 3.0
|
| 604 |
*/
|
| 605 |
+
function field( $name = 'title', $index = null ) {
|
|
|
|
| 606 |
$index = is_null( $index ) ? $this->attachments_ref : intval( $index );
|
| 607 |
|
| 608 |
+
return isset( $this->attachments[ $index ]->fields->$name ) ? $this->attachments[ $index ]->fields->$name : false;
|
| 609 |
}
|
| 610 |
|
| 611 |
|
| 615 |
*
|
| 616 |
* @since 3.0
|
| 617 |
*/
|
| 618 |
+
function setup_instances() {
|
|
|
|
| 619 |
// implement our default instance if appropriate
|
| 620 |
+
$filtered = apply_filters( 'attachments_default_instance', true );
|
| 621 |
+
if ( $filtered && ( ! defined( 'ATTACHMENTS_DEFAULT_INSTANCE' ) || true == ATTACHMENTS_DEFAULT_INSTANCE ) ) {
|
| 622 |
+
$this->register();
|
| 623 |
}
|
| 624 |
|
| 625 |
// facilitate user-defined instance registration
|
| 633 |
*
|
| 634 |
* @since 3.0
|
| 635 |
*/
|
| 636 |
+
function assets( $hook ) {
|
|
|
|
| 637 |
global $post;
|
| 638 |
|
| 639 |
// we only want our assets on edit screens
|
| 640 |
+
if ( ! empty( $this->instances_for_post_type ) && 'edit.php' != $hook && 'post.php' != $hook && 'post-new.php' != $hook ) {
|
| 641 |
return;
|
| 642 |
+
}
|
| 643 |
|
| 644 |
// we only want to enqueue if appropriate
|
| 645 |
+
if ( empty( $this->instances_for_post_type ) ) {
|
| 646 |
return;
|
| 647 |
+
}
|
| 648 |
|
| 649 |
$post_id = isset( $post->ID ) ? $post->ID : null;
|
| 650 |
wp_enqueue_media( array( 'post' => $post_id ) );
|
| 661 |
*
|
| 662 |
* @since 3.0
|
| 663 |
*/
|
| 664 |
+
function meta_box_init() {
|
|
|
|
| 665 |
$nonce_sent = false;
|
| 666 |
|
| 667 |
+
if ( !empty ( $this->instances_for_post_type ) ) {
|
| 668 |
+
foreach( $this->instances_for_post_type as $instance ) {
|
|
|
|
|
|
|
| 669 |
// facilitate more fine-grained meta box positioning than post type
|
| 670 |
$applicable = apply_filters( "attachments_location_{$instance}", true, $instance );
|
| 671 |
|
| 677 |
$priority = isset($instance->priority) ? $instance->priority : 'high';
|
| 678 |
|
| 679 |
if( $applicable ) {
|
| 680 |
+
add_meta_box(
|
| 681 |
+
'attachments-' . $instance_name,
|
| 682 |
+
__( esc_attr( $instance->label ) ),
|
| 683 |
+
array( $this, 'meta_box_markup' ),
|
| 684 |
+
$this->get_post_type(),
|
| 685 |
+
$position,
|
| 686 |
+
$priority,
|
| 687 |
+
array(
|
| 688 |
+
'instance' => $instance,
|
| 689 |
+
'setup_nonce' => !$nonce_sent
|
| 690 |
+
)
|
| 691 |
+
);
|
| 692 |
+
$nonce_sent = true;
|
| 693 |
}
|
| 694 |
|
| 695 |
}
|
| 703 |
*
|
| 704 |
* @since 3.0
|
| 705 |
*/
|
| 706 |
+
function meta_box_markup( $post, $metabox ) {
|
|
|
|
| 707 |
// single out our $instance
|
| 708 |
$instance = (object) $metabox['args']['instance'];
|
| 709 |
|
| 710 |
+
if( $metabox['args']['setup_nonce'] ) {
|
| 711 |
wp_nonce_field( 'attachments_save', 'attachments_nonce' );
|
| 712 |
+
}
|
| 713 |
|
| 714 |
?>
|
| 715 |
|
| 716 |
+
<div id="attachments-<?php echo esc_attr( $instance->name ); ?>" class="attachments-parent-container<?php if( $instance->append == false ) : ?> attachments-prepend<?php endif; ?>">
|
| 717 |
<?php if( ! empty( $instance->note ) ) : ?>
|
| 718 |
<div class="attachments-note"><?php echo wpautop( $instance->note ); ?></div>
|
| 719 |
<?php endif; ?>
|
| 722 |
<a class="button attachments-invoke"><?php _e( esc_attr( $instance->button_text ), 'attachments' ); ?></a>
|
| 723 |
</div>
|
| 724 |
<?php endif; ?>
|
| 725 |
+
<div class="attachments-container attachments-<?php echo esc_attr( $instance->name ); ?>"><?php
|
| 726 |
+
if ( isset( $instance->attachments ) && !empty( $instance->attachments ) ) {
|
| 727 |
+
foreach( $instance->attachments as $attachment ) {
|
|
|
|
|
|
|
| 728 |
// we need to give our Attachment a uid to carry through to all the fields
|
| 729 |
$attachment->uid = uniqid();
|
| 730 |
|
| 746 |
button = '<?php echo __( esc_attr( $instance->modal_text ) ); ?>',
|
| 747 |
router = '<?php echo __( esc_attr( $instance->router ) ); ?>',
|
| 748 |
limit = <?php echo intval( $instance->limit ); ?>,
|
| 749 |
+
existing = <?php echo ( isset( $instance->attachments ) && ! empty( $instance->attachments ) ) ? count( $instance->attachments ): 0; ?>,
|
| 750 |
attachmentsframe,
|
| 751 |
editframe;
|
| 752 |
|
| 841 |
|
| 842 |
// if we're in a sidebar we DO want to show the fields which are normally hidden on load via CSS
|
| 843 |
if($element.parents('#side-sortables')){
|
| 844 |
+
$element.find('.attachments-attachment:<?php if( $instance->append ) : ?>last<?php else : ?>first<?php endif; ?> .attachments-fields').show();
|
| 845 |
}
|
| 846 |
|
| 847 |
// see if we need to set a default
|
| 848 |
// TODO: can we tie this into other field types (select, radio, checkbox)?
|
| 849 |
+
$element.find('.attachments-attachment:<?php if( $instance->append ) : ?>last<?php else : ?>first<?php endif; ?> .attachments-fields input, .attachments-attachment:<?php if( $instance->append ) : ?>last<?php else : ?>first<?php endif; ?> .attachments-fields textarea').each(function(){
|
| 850 |
if($(this).data('default')){
|
| 851 |
var meta_for_default = $(this).data('default');
|
| 852 |
if(attachments_isset(attachment.attributes)){
|
| 861 |
|
| 862 |
// if it wasn't an image we need to ditch the dimensions
|
| 863 |
if(!attachments_isset(attachment.attributes.width)||!attachments_isset(attachment.attributes.height)){
|
| 864 |
+
$element.find('.attachments-attachment:<?php if( $instance->append ) : ?>last<?php else : ?>first<?php endif; ?> .dimensions').hide();
|
| 865 |
}
|
| 866 |
});
|
| 867 |
});
|
| 973 |
*
|
| 974 |
* @since 3.0
|
| 975 |
**/
|
| 976 |
+
function get_field_types() {
|
|
|
|
| 977 |
$field_types = array(
|
| 978 |
'text' => ATTACHMENTS_DIR . 'classes/fields/class.field.text.php',
|
| 979 |
'textarea' => ATTACHMENTS_DIR . 'classes/fields/class.field.textarea.php',
|
| 985 |
// $field_types = apply_filters( 'attachments_fields', $field_types );
|
| 986 |
|
| 987 |
$field_index = 0;
|
| 988 |
+
foreach ( $field_types as $type => $path ) {
|
|
|
|
| 989 |
// proceed with inclusion
|
| 990 |
+
if ( file_exists( $path ) ) {
|
|
|
|
| 991 |
// include the file
|
| 992 |
include_once( $path );
|
| 993 |
|
| 1006 |
$field_class = $existing_classes[$flag + $field_index + 1];
|
| 1007 |
|
| 1008 |
// create our link using our new field class
|
| 1009 |
+
$field_types[ $type ] = $field_class;
|
| 1010 |
|
| 1011 |
$field_index++;
|
| 1012 |
}
|
| 1023 |
*
|
| 1024 |
* @since 3.0
|
| 1025 |
*/
|
| 1026 |
+
function register_field( $params = array() ) {
|
|
|
|
| 1027 |
$defaults = array(
|
| 1028 |
'name' => 'title',
|
| 1029 |
'type' => 'text',
|
| 1034 |
$params = array_merge( $defaults, $params );
|
| 1035 |
|
| 1036 |
// ensure it's a valid type
|
| 1037 |
+
if ( ! isset( $this->fields[$params['type']] ) ) {
|
| 1038 |
return false;
|
| 1039 |
+
}
|
| 1040 |
|
| 1041 |
+
// sanitize
|
| 1042 |
+
if ( isset( $params['name'] ) ) {
|
| 1043 |
$params['name'] = str_replace( '-', '_', sanitize_title( $params['name'] ) );
|
| 1044 |
+
}
|
| 1045 |
|
| 1046 |
+
if ( isset( $params['label'] ) ) {
|
| 1047 |
$params['label'] = __( esc_html( $params['label'] ) );
|
| 1048 |
+
}
|
| 1049 |
|
| 1050 |
+
if ( !isset( $params['meta'] ) || !is_array( $params['meta'] ) ) {
|
| 1051 |
$params['meta'] = array();
|
| 1052 |
+
}
|
| 1053 |
|
| 1054 |
// instantiate the class for this field and send it back
|
| 1055 |
return new $this->fields[ $params['type'] ]( $params['name'], $params['label'], $params['meta'] );
|
| 1062 |
*
|
| 1063 |
* @since 3.0
|
| 1064 |
*/
|
| 1065 |
+
function register( $name = 'attachments', $params = array() ) {
|
|
|
|
| 1066 |
$defaults = array(
|
| 1067 |
|
| 1068 |
// title of the meta box (string)
|
| 1120 |
$params = array_merge( $defaults, $params );
|
| 1121 |
|
| 1122 |
// sanitize
|
| 1123 |
+
if ( ! is_array( $params['post_type'] ) ) {
|
| 1124 |
$params['post_type'] = array( $params['post_type'] ); // we always want an array
|
| 1125 |
+
}
|
| 1126 |
|
| 1127 |
+
if ( ! is_array( $params['filetype'] ) ) {
|
| 1128 |
$params['filetype'] = array( $params['filetype'] ); // we always want an array
|
| 1129 |
+
}
|
| 1130 |
|
| 1131 |
$params['label'] = esc_html( $params['label'] );
|
| 1132 |
$params['limit'] = intval( $params['limit'] );
|
| 1133 |
+
$params['note'] = esc_html( $params['note'] );
|
| 1134 |
$params['button_text'] = esc_attr( $params['button_text'] );
|
| 1135 |
$params['modal_text'] = esc_attr( $params['modal_text'] );
|
| 1136 |
|
| 1137 |
// make sure we've got valid filetypes
|
| 1138 |
+
if ( is_array( $params['filetype'] ) ) {
|
| 1139 |
+
foreach ( $params['filetype'] as $key => $filetype ) {
|
| 1140 |
+
if ( ! in_array( $filetype, $this->valid_filetypes ) ) {
|
| 1141 |
+
unset( $params['filetype'][ $key ] );
|
|
|
|
|
|
|
|
|
|
| 1142 |
}
|
| 1143 |
}
|
| 1144 |
}
|
| 1145 |
|
| 1146 |
// WordPress sanitizes post type names when registering, so we will too
|
| 1147 |
+
foreach ( $params['post_type'] as $key => $post_type ) {
|
| 1148 |
+
$params['post_type'][ $key ] = sanitize_key( $post_type );
|
| 1149 |
+
}
|
| 1150 |
|
| 1151 |
// make sure the instance name is proper
|
| 1152 |
$instance = str_replace( '-', '_', sanitize_title( $name ) );
|
| 1153 |
|
| 1154 |
// register the fields
|
| 1155 |
+
if ( isset( $params['fields'] ) && is_array( $params['fields'] ) && count( $params['fields'] ) ) {
|
| 1156 |
+
foreach( $params['fields'] as $field ) {
|
|
|
|
|
|
|
| 1157 |
// register the field
|
| 1158 |
$this->register_field( $field );
|
| 1159 |
}
|
| 1160 |
}
|
| 1161 |
|
| 1162 |
// set the instance
|
| 1163 |
+
$this->instances[ $instance ] = $params;
|
| 1164 |
|
| 1165 |
// set the Attachments for this instance
|
| 1166 |
+
$this->instances[ $instance ]['attachments'] = $this->get_attachments( $instance );
|
| 1167 |
|
| 1168 |
}
|
| 1169 |
|
| 1174 |
*
|
| 1175 |
* @since 3.0
|
| 1176 |
*/
|
| 1177 |
+
function get_instances_for_post_type( $post_type = null ) {
|
| 1178 |
+
$post_type = ( ! is_null( $post_type ) && post_type_exists( $post_type ) ) ? $post_type : $this->get_post_type();
|
|
|
|
| 1179 |
|
| 1180 |
$instances = array();
|
| 1181 |
|
| 1182 |
+
if ( ! empty( $this->instances ) ) {
|
| 1183 |
+
foreach ( $this->instances as $name => $params ) {
|
| 1184 |
+
if ( in_array( $post_type, $params['post_type'] ) ) {
|
|
|
|
|
|
|
|
|
|
| 1185 |
$instances[] = $name;
|
| 1186 |
}
|
| 1187 |
}
|
| 1198 |
*
|
| 1199 |
* @since 3.0
|
| 1200 |
*/
|
| 1201 |
+
function get_post_type() {
|
|
|
|
| 1202 |
global $post;
|
| 1203 |
|
| 1204 |
// TODO: Retrieving the post_type at this point is ugly to say the least. This needs major cleanup.
|
| 1205 |
+
if ( empty( $post->ID ) && isset( $_GET['post_type'] ) ) {
|
| 1206 |
+
$post_type = sanitize_text_field( $_GET['post_type'] );
|
| 1207 |
+
} elseif( !empty( $post->ID ) ) {
|
|
|
|
|
|
|
|
|
|
| 1208 |
$post_type = get_post_type( $post->ID );
|
| 1209 |
+
} elseif( isset( $_GET['post'] ) ) {
|
|
|
|
|
|
|
| 1210 |
$post_type = get_post_type( intval( $_GET['post'] ) );
|
| 1211 |
+
} else {
|
|
|
|
|
|
|
| 1212 |
$post_type = 'post';
|
| 1213 |
}
|
| 1214 |
|
| 1222 |
*
|
| 1223 |
* @since 3.0
|
| 1224 |
*/
|
| 1225 |
+
function set_instances_for_current_post_type() {
|
|
|
|
| 1226 |
// store the applicable instances for this post type
|
| 1227 |
$this->instances_for_post_type = $this->get_instances_for_post_type( $this->get_post_type() );
|
| 1228 |
}
|
| 1234 |
*
|
| 1235 |
* @since 3.0
|
| 1236 |
*/
|
| 1237 |
+
function create_attachment_field( $instance, $field, $attachment = null ) {
|
|
|
|
| 1238 |
|
| 1239 |
// the $field at this point is just the user-declared array
|
| 1240 |
// we need to make it a field object
|
| 1241 |
$type = $field['type'];
|
| 1242 |
|
| 1243 |
+
if( isset( $this->fields[ $type ] ) ) {
|
|
|
|
| 1244 |
$name = sanitize_title( $field['name'] );
|
| 1245 |
$label = esc_html( $field['label'] );
|
| 1246 |
$default = isset( $field['default'] ) ? $field['default'] : false; // validated in the class
|
| 1247 |
$meta = isset( $field['meta'] ) ? $field['meta'] : array();
|
| 1248 |
$value = isset( $attachment->fields->$name ) ? $attachment->fields->$name : null;
|
| 1249 |
|
| 1250 |
+
$field = new $this->fields[ $type ]( $name, $label, $value, $meta );
|
| 1251 |
$field->value = $field->format_value_for_input( $field->value );
|
| 1252 |
|
| 1253 |
// does this field already have a unique ID?
|
| 1260 |
$field->set_field_default( $default );
|
| 1261 |
|
| 1262 |
?>
|
| 1263 |
+
<div class="attachments-attachment-field attachments-attachment-field-<?php echo esc_attr( $instance ); ?> attachments-attachment-field-<?php echo esc_attr( $field->type ); ?> attachment-field-<?php echo esc_attr( $field->name ); ?>">
|
| 1264 |
+
<div class="attachment-label attachment-label-<?php echo esc_attr( $instance ); ?>">
|
| 1265 |
+
<label for="<?php echo esc_attr( $field->field_id ); ?>"><?php echo esc_html( $field->label ); ?></label>
|
| 1266 |
</div>
|
| 1267 |
+
<div class="attachment-field attachment-field-<?php echo esc_attr( $instance ); ?>">
|
| 1268 |
<?php echo $this->create_field( $instance, $field ); ?>
|
| 1269 |
</div>
|
| 1270 |
</div>
|
| 1271 |
+
<?php } else {
|
|
|
|
|
|
|
|
|
|
| 1272 |
$field = false;
|
| 1273 |
}
|
| 1274 |
|
| 1282 |
*
|
| 1283 |
* @since 3.0
|
| 1284 |
*/
|
| 1285 |
+
function create_field( $instance, $field ) {
|
|
|
|
| 1286 |
$field = (object) $field;
|
| 1287 |
|
| 1288 |
// with all of our attributes properly set, we can output
|
| 1296 |
*
|
| 1297 |
* @since 3.0
|
| 1298 |
*/
|
| 1299 |
+
function create_attachment( $instance, $attachment = null ) {
|
|
|
|
| 1300 |
?>
|
| 1301 |
+
<div class="attachments-attachment attachments-attachment-<?php echo esc_attr( $instance ); ?>">
|
| 1302 |
<?php $array_flag = ( isset( $attachment->uid ) ) ? $attachment->uid : '{{ attachments.attachment_uid }}'; ?>
|
| 1303 |
|
| 1304 |
+
<input type="hidden" class="attachments-track-id" name="attachments[<?php echo esc_attr( $instance ); ?>][<?php echo esc_attr( $array_flag ); ?>][id]" value="<?php echo isset( $attachment->id ) ? esc_attr( $attachment->id ) : '{{ attachments.id }}' ; ?>" />
|
| 1305 |
|
| 1306 |
<?php
|
| 1307 |
// since attributes can change over time (image gets replaced, cropped, etc.) we'll pull that info
|
| 1308 |
+
if ( isset( $attachment->id ) ) {
|
|
|
|
| 1309 |
// we'll just use the full size since that's what Media in 3.5 uses
|
| 1310 |
$attachment_meta = wp_get_attachment_metadata( $attachment->id );
|
| 1311 |
|
| 1312 |
// only images return the 'file' key
|
| 1313 |
+
if ( ! isset( $attachment_meta['file'] ) ) {
|
| 1314 |
$attachment_meta['file'] = get_attached_file( $attachment->id );
|
| 1315 |
+
$filename = explode( "/", $attachment_meta['file'] );
|
| 1316 |
+
}
|
| 1317 |
|
| 1318 |
$attachment->width = isset( $attachment_meta['width'] ) ? $attachment_meta['width'] : null;
|
| 1319 |
$attachment->height = isset( $attachment_meta['height'] ) ? $attachment_meta['height'] : null;
|
| 1335 |
<img src="<?php echo $image; ?>" alt="Thumbnail" />
|
| 1336 |
</div>
|
| 1337 |
<div class="attachment-details attachment-info details">
|
| 1338 |
+
<div class="filename"><?php echo isset( $attachment->filename ) ? esc_html( $attachment->filename ) : '{{ attachments.filename }}' ; ?></div>
|
| 1339 |
+
<?php if( ( isset( $attachment->id ) && isset( $attachment->width ) ) || ! isset( $attachment->id ) ) : ?>
|
| 1340 |
+
<div class="dimensions"><?php echo isset( $attachment->width ) ? esc_html( $attachment->width ) : '{{ attachments.width }}' ; ?> × <?php echo isset( $attachment->height ) ? esc_html( $attachment->height ) : '{{ attachments.height }}' ; ?></div>
|
| 1341 |
<?php endif; ?>
|
| 1342 |
<div class="edit-attachment-asset"><a href="#"><?php _e( 'Change', 'attachments' ); ?></a></div>
|
| 1343 |
<div class="delete-attachment"><a href="#"><?php _e( 'Remove', 'attachments' ); ?></a></div>
|
| 1349 |
|
| 1350 |
<div class="attachments-fields">
|
| 1351 |
<?php
|
| 1352 |
+
foreach( $this->instances[$instance]['fields'] as $field ) {
|
| 1353 |
$field_ref = $this->create_attachment_field( $instance, $field, $attachment );
|
| 1354 |
+
}
|
| 1355 |
?>
|
| 1356 |
</div>
|
| 1357 |
|
| 1366 |
*
|
| 1367 |
* @since 3.1
|
| 1368 |
*/
|
| 1369 |
+
function field_assets() {
|
|
|
|
| 1370 |
global $post;
|
| 1371 |
|
| 1372 |
// we only want to enqueue if we're on an edit screen and it's applicable
|
| 1373 |
+
if ( empty( $this->instances_for_post_type ) || empty( $post ) ) {
|
| 1374 |
return;
|
| 1375 |
+
}
|
| 1376 |
|
| 1377 |
// all metaboxes have been put in place, we can now determine which field assets need to be included
|
| 1378 |
|
| 1379 |
// first we'll get a list of the field types on screen
|
| 1380 |
$fieldtypes = array();
|
| 1381 |
+
foreach ( $this->instances_for_post_type as $instance ) {
|
| 1382 |
+
foreach ( $this->instances[$instance]['fields'] as $field ) {
|
| 1383 |
$fieldtypes[] = $field['type'];
|
| 1384 |
+
}
|
| 1385 |
+
}
|
| 1386 |
|
| 1387 |
// we only want to dump out assets once for each field type
|
| 1388 |
$fieldtypes = array_unique( $fieldtypes );
|
| 1389 |
|
| 1390 |
// loop through and dump out all the assets
|
| 1391 |
+
foreach ( $fieldtypes as $fieldtype ) {
|
| 1392 |
+
$field = new $this->fields[ $fieldtype ];
|
|
|
|
| 1393 |
$field->assets();
|
| 1394 |
}
|
| 1395 |
}
|
| 1401 |
*
|
| 1402 |
* @since 3.1
|
| 1403 |
*/
|
| 1404 |
+
function field_inits() {
|
|
|
|
| 1405 |
global $post;
|
| 1406 |
|
| 1407 |
// we only want to enqueue if we're on an edit screen and it's applicable
|
| 1408 |
+
if ( empty( $this->instances_for_post_type ) || empty( $post ) ) {
|
| 1409 |
return;
|
| 1410 |
+
}
|
| 1411 |
|
| 1412 |
// all metaboxes have been put in place, we can now determine which field assets need to be included
|
| 1413 |
|
| 1414 |
// first we'll get a list of the field types on screen
|
| 1415 |
$fieldtypes = array();
|
| 1416 |
+
foreach ( $this->instances_for_post_type as $instance ) {
|
| 1417 |
+
foreach( $this->instances[ $instance ]['fields'] as $field ) {
|
| 1418 |
$fieldtypes[] = $field['type'];
|
| 1419 |
+
}
|
| 1420 |
+
}
|
| 1421 |
|
| 1422 |
// we only want to dump out assets once for each field type
|
| 1423 |
$fieldtypes = array_unique( $fieldtypes );
|
| 1424 |
|
| 1425 |
// loop through and dump out all the assets
|
| 1426 |
+
foreach( $fieldtypes as $fieldtype ) {
|
| 1427 |
+
$field = new $this->fields[ $fieldtype ];
|
|
|
|
| 1428 |
$field->init();
|
| 1429 |
}
|
| 1430 |
}
|
| 1437 |
*
|
| 1438 |
* @since 3.0
|
| 1439 |
*/
|
| 1440 |
+
function admin_footer() {
|
| 1441 |
+
if ( ! empty( $this->instances_for_post_type ) ) { ?>
|
|
|
|
|
|
|
| 1442 |
<script type="text/javascript">
|
| 1443 |
var ATTACHMENTS_VIEWS = {};
|
| 1444 |
</script>
|
| 1445 |
+
<?php foreach ( $this->instances_for_post_type as $instance ) : ?>
|
| 1446 |
+
<script type="text/template" id="tmpl-attachments-<?php echo esc_attr( $instance ); ?>">
|
|
|
|
| 1447 |
<?php $this->create_attachment( $instance ); ?>
|
| 1448 |
</script>
|
| 1449 |
<?php endforeach;
|
| 1457 |
*
|
| 1458 |
* @since 3.0
|
| 1459 |
*/
|
| 1460 |
+
function save( $post_id ) {
|
|
|
|
| 1461 |
// is the user logged in?
|
| 1462 |
+
if ( ! is_user_logged_in() ) {
|
| 1463 |
return $post_id;
|
| 1464 |
+
}
|
| 1465 |
|
| 1466 |
// is the nonce set?
|
| 1467 |
+
if ( ! isset( $_POST['attachments_nonce'] ) ) {
|
| 1468 |
return $post_id;
|
| 1469 |
+
}
|
| 1470 |
|
| 1471 |
// is the nonce valid?
|
| 1472 |
+
if ( ! wp_verify_nonce( $_POST['attachments_nonce'], 'attachments_save' ) ) {
|
| 1473 |
return $post_id;
|
| 1474 |
+
}
|
| 1475 |
|
| 1476 |
// can this user edit this post?
|
| 1477 |
+
if ( ! current_user_can( 'edit_post', $post_id ) ) {
|
| 1478 |
return $post_id;
|
| 1479 |
+
}
|
| 1480 |
|
| 1481 |
// passed authentication, proceed with save
|
| 1482 |
|
| 1498 |
* @return bool
|
| 1499 |
* @since 3.4.3
|
| 1500 |
*/
|
| 1501 |
+
function save_metadata( $post_id = 0, $attachments_meta = null ) {
|
| 1502 |
+
if ( ! is_array( $attachments_meta ) || ! is_int( $post_id ) || intval( $post_id ) < 1 ) {
|
|
|
|
| 1503 |
return false;
|
| 1504 |
+
}
|
| 1505 |
|
| 1506 |
// final data store
|
| 1507 |
$attachments = array();
|
| 1508 |
|
| 1509 |
// loop through each submitted instance
|
| 1510 |
+
foreach ( $attachments_meta as $instance => $instance_attachments ) {
|
|
|
|
| 1511 |
// loop through each Attachment of this instance
|
| 1512 |
+
foreach( $instance_attachments as $key => $attachment ) {
|
| 1513 |
+
// see if it was pulled as JSON from a delete cleanup
|
| 1514 |
+
if ( is_object( $attachment ) ) {
|
| 1515 |
+
$attachment = get_object_vars( $attachment );
|
| 1516 |
+
if ( is_array( $attachment ) && !empty( $attachment ) ) {
|
| 1517 |
+
if ( isset( $attachment['fields'] ) && is_object( $attachment['fields'] ) ) {
|
| 1518 |
+
$attachment['fields'] = get_object_vars( $attachment['fields'] );
|
| 1519 |
+
}
|
| 1520 |
+
}
|
| 1521 |
+
}
|
| 1522 |
+
|
| 1523 |
+
$attachment_exists = isset( $attachment['id'] ) ? get_post( absint( $attachment['id'] ) ) : false;
|
|
|
|
|
|
|
|
|
|
| 1524 |
|
| 1525 |
// make sure the attachment exists
|
| 1526 |
+
if ( $attachment_exists ) {
|
|
|
|
| 1527 |
// since we're using JSON for storage in the database, we need
|
| 1528 |
// to make sure that characters are encoded that would otherwise
|
| 1529 |
// break the JSON
|
| 1530 |
+
if ( isset( $attachment['fields'] ) && is_array( $attachment['fields'] ) ) {
|
|
|
|
| 1531 |
|
| 1532 |
+
foreach( $attachment['fields'] as $key => $field_value ) {
|
|
|
|
| 1533 |
// take care of our returns
|
| 1534 |
$field_value = str_replace( "\r\n", "\n", $field_value );
|
| 1535 |
$field_value = str_replace( "\r", "\n", $field_value );
|
| 1547 |
$field_value = $this->encode_field_value( $field_value );
|
| 1548 |
|
| 1549 |
// encode things properly
|
| 1550 |
+
$attachment['fields'][ $key ] = $field_value;
|
| 1551 |
}
|
| 1552 |
}
|
| 1553 |
|
| 1554 |
+
// set the post parent if applicable
|
| 1555 |
+
// need to first check to make sure we're not overwriting a native Attach
|
| 1556 |
+
$attach_post_ref = $attachment_exists;
|
| 1557 |
+
if ( $attach_post_ref->post_parent == 0 && ! empty( $this->instances[ $instance ]['post_parent'] ) ) {
|
| 1558 |
+
// no current Attach, we can add ours
|
| 1559 |
+
$attach_post = array(
|
| 1560 |
+
'ID' => absint( $attachment['id'] ),
|
| 1561 |
+
'post_parent' => $post_id,
|
| 1562 |
+
);
|
| 1563 |
+
|
| 1564 |
+
wp_update_post( $attach_post );
|
| 1565 |
+
}
|
| 1566 |
|
| 1567 |
+
$attachments[ $instance ][] = $attachment;
|
| 1568 |
}
|
| 1569 |
}
|
| 1570 |
}
|
| 1571 |
|
| 1572 |
+
if ( ! empty( $attachments ) ) {
|
|
|
|
| 1573 |
// we're going to store JSON (JSON_UNESCAPED_UNICODE is PHP 5.4+)
|
| 1574 |
$attachments = version_compare( PHP_VERSION, '5.4.0', '>=' ) ? json_encode( $attachments, JSON_UNESCAPED_UNICODE ) : json_encode( $attachments );
|
| 1575 |
|
| 1578 |
|
| 1579 |
// we're going to wipe out any existing Attachments meta (because we'll put it back)
|
| 1580 |
return update_post_meta( $post_id, $this->meta_key, $attachments );
|
| 1581 |
+
} else {
|
|
|
|
|
|
|
| 1582 |
// there are no attachments so we'll clean up the record
|
| 1583 |
return delete_post_meta( $post_id, $this->meta_key );
|
| 1584 |
}
|
| 1593 |
*
|
| 1594 |
* @since 3.3
|
| 1595 |
*/
|
| 1596 |
+
function encode_field_value( $field_value = null ) {
|
| 1597 |
+
if ( is_null( $field_value ) ) {
|
|
|
|
| 1598 |
return false;
|
| 1599 |
+
}
|
| 1600 |
|
| 1601 |
+
if ( is_object( $field_value ) ) {
|
|
|
|
| 1602 |
$input = get_object_vars( $field_value );
|
| 1603 |
|
| 1604 |
+
foreach ( $input as $key => $val ) {
|
| 1605 |
+
$field_value[ $key ] = $this->encode_field_value( $val );
|
| 1606 |
+
}
|
| 1607 |
|
| 1608 |
$field_value = (object) $field_value;
|
| 1609 |
+
} elseif ( is_array( $field_value ) ) {
|
| 1610 |
+
foreach ( $field_value as $key => $val ) {
|
|
|
|
|
|
|
| 1611 |
$field_value[$key] = $this->encode_field_value( $val );
|
| 1612 |
+
}
|
| 1613 |
+
} else {
|
| 1614 |
$field_value = htmlentities( $field_value, ENT_QUOTES, 'UTF-8' );
|
| 1615 |
+
}
|
| 1616 |
|
| 1617 |
return $field_value;
|
| 1618 |
}
|
| 1624 |
*
|
| 1625 |
* @since 3.0
|
| 1626 |
*/
|
| 1627 |
+
function get_attachments( $instance = null, $post_id = null ) {
|
|
|
|
| 1628 |
$post_id = $this->determine_post_id( $post_id );
|
| 1629 |
|
| 1630 |
+
if ( ! $post_id ) {
|
| 1631 |
return false;
|
| 1632 |
+
}
|
| 1633 |
|
| 1634 |
$attachments = array();
|
| 1635 |
$attachments_raw = $this->get_attachments_metadata( $post_id );
|
| 1636 |
|
| 1637 |
// we need to decode the fields (that were encoded during save) and run them through
|
| 1638 |
// their format_value_for_input as defined in it's class
|
| 1639 |
+
if ( ! is_null( $instance ) && is_string( $instance ) && isset( $attachments_raw->$instance ) ) {
|
| 1640 |
+
foreach( $attachments_raw->$instance as $attachment ) {
|
|
|
|
| 1641 |
$attachments[] = $this->process_attachment( $attachment, $instance );
|
| 1642 |
+
}
|
| 1643 |
+
} elseif ( is_null( $instance ) ) {
|
|
|
|
| 1644 |
// return them all, regardless of instance
|
| 1645 |
+
if ( ( is_array( $attachments_raw ) && count( $attachments_raw ) ) || is_object( $attachments_raw ) ) {
|
|
|
|
| 1646 |
// cast an object if necessary
|
| 1647 |
+
if ( is_object( $attachments_raw ) ) $attachments_raw = (array) $attachments_raw;
|
| 1648 |
|
| 1649 |
+
foreach( $attachments_raw as $instance => $attachments_unprocessed ) {
|
| 1650 |
+
foreach( $attachments_unprocessed as $unprocessed_attachment ) {
|
| 1651 |
$attachments[] = $this->process_attachment( $unprocessed_attachment, $instance );
|
| 1652 |
+
}
|
| 1653 |
+
}
|
| 1654 |
}
|
| 1655 |
}
|
| 1656 |
|
| 1657 |
// tack on the post ID for each attachment
|
| 1658 |
+
for ( $i = 0; $i < count( $attachments ); $i++ ) {
|
| 1659 |
+
$attachments[ $i ]->post_id = $post_id;
|
| 1660 |
+
}
|
| 1661 |
|
| 1662 |
// we don't want the filter to run on the admin side of things
|
| 1663 |
+
if ( ! is_admin() ) {
|
| 1664 |
$attachments = apply_filters( "attachments_get_{$instance}", $attachments );
|
| 1665 |
+
}
|
| 1666 |
|
| 1667 |
return $attachments;
|
| 1668 |
}
|
| 1676 |
*
|
| 1677 |
* @since 3.3
|
| 1678 |
*/
|
| 1679 |
+
function get_attachments_metadata( $post_id ) {
|
|
|
|
| 1680 |
$post_id = intval( $post_id );
|
| 1681 |
|
| 1682 |
// grab our JSON and decode it
|
| 1683 |
$attachments_json = get_post_meta( $post_id, $this->meta_key, true );
|
| 1684 |
$attachments_raw = is_string( $attachments_json ) ? json_decode( $attachments_json ) : false;
|
| 1685 |
|
| 1686 |
+
// convert field newline characters properly
|
| 1687 |
+
if ( ! empty( $attachments_raw ) ) {
|
| 1688 |
+
foreach ( $attachments_raw as $instanceKey => $instance ) {
|
| 1689 |
+
foreach( $instance as $attachmentKey => $attachment ) {
|
| 1690 |
+
if( isset( $attachment->fields ) ) {
|
| 1691 |
+
foreach( $attachment->fields as $fieldKey => $fieldValue ) {
|
| 1692 |
+
$attachment->fields->$fieldKey = str_replace( '\\n', "\n", $fieldValue );
|
| 1693 |
+
}
|
| 1694 |
+
}
|
| 1695 |
+
}
|
| 1696 |
+
}
|
| 1697 |
+
}
|
| 1698 |
|
| 1699 |
return $attachments_raw;
|
| 1700 |
}
|
| 1706 |
* @param int $post_id Desired post ID
|
| 1707 |
* @return mixed The understood post ID
|
| 1708 |
*/
|
| 1709 |
+
function determine_post_id( $post_id = null ) {
|
|
|
|
| 1710 |
global $post;
|
| 1711 |
|
| 1712 |
// if a post id was passed, we'll use it
|
| 1713 |
+
if ( !is_null( $post_id ) ) {
|
|
|
|
| 1714 |
$post_id = intval( $post_id );
|
| 1715 |
+
} elseif( is_null( $post_id ) && is_object( $post ) && isset( $post->ID ) ) {
|
|
|
|
|
|
|
| 1716 |
$post_id = $post->ID;
|
| 1717 |
+
} elseif( isset( $_GET['post'] ) ) {
|
|
|
|
|
|
|
| 1718 |
$post_id = intval( $_GET['post'] );
|
| 1719 |
+
} else {
|
|
|
|
|
|
|
| 1720 |
// no post ID, nothing to do...
|
| 1721 |
$post_id = false;
|
| 1722 |
}
|
| 1734 |
*
|
| 1735 |
* @since 3.3
|
| 1736 |
*/
|
| 1737 |
+
function process_attachment( $attachment, $instance ) {
|
| 1738 |
+
if ( ! is_object( $attachment ) || !is_string( $instance ) ) {
|
|
|
|
| 1739 |
return $attachment;
|
| 1740 |
+
}
|
| 1741 |
|
| 1742 |
+
if ( isset( $attachment->fields ) && is_object( $attachment->fields ) ) {
|
| 1743 |
+
foreach ( $attachment->fields as $key => $value ) {
|
|
|
|
|
|
|
| 1744 |
// loop through the instance fields to get the type
|
| 1745 |
+
if ( isset( $this->instances[ $instance ]['fields'] ) ) {
|
|
|
|
| 1746 |
$type = '';
|
| 1747 |
+
foreach ( $this->instances[$instance]['fields'] as $field ) {
|
| 1748 |
+
if ( isset( $field['name'] ) && $field['name'] == $key ) {
|
|
|
|
|
|
|
| 1749 |
$type = isset( $field['type'] ) ? $field['type'] : false;
|
| 1750 |
break;
|
| 1751 |
}
|
| 1752 |
}
|
| 1753 |
+
if ( isset( $this->fields[$type] ) ) {
|
|
|
|
| 1754 |
// we need to decode the html entities that were encoded for the save
|
| 1755 |
$attachment->fields->$key = $this->decode_field_value( $attachment->fields->$key );
|
| 1756 |
+
} else {
|
|
|
|
|
|
|
| 1757 |
// the type doesn't exist
|
| 1758 |
$attachment->fields->$key = false;
|
| 1759 |
}
|
| 1760 |
+
} else {
|
|
|
|
|
|
|
| 1761 |
// this was a theme file request, just grab it
|
| 1762 |
$attachment->fields->$key = $this->decode_field_value( $attachment->fields->$key );
|
| 1763 |
}
|
| 1775 |
*
|
| 1776 |
* @since 3.3
|
| 1777 |
*/
|
| 1778 |
+
function decode_field_value( $field_value = null ) {
|
| 1779 |
+
if ( is_null( $field_value ) ) {
|
|
|
|
| 1780 |
return false;
|
| 1781 |
+
}
|
| 1782 |
|
| 1783 |
+
if ( is_object( $field_value ) ) {
|
|
|
|
| 1784 |
$input = get_object_vars( $field_value );
|
| 1785 |
|
| 1786 |
+
foreach ( $input as $key => $val ) {
|
| 1787 |
$field_value[$key] = $this->decode_field_value( $val );
|
| 1788 |
+
}
|
| 1789 |
|
| 1790 |
$field_value = (object) $field_value;
|
| 1791 |
+
} elseif( is_array( $field_value ) ) {
|
| 1792 |
+
foreach ( $field_value as $key => $val ) {
|
|
|
|
|
|
|
| 1793 |
$field_value[$key] = $this->decode_field_value( $val );
|
| 1794 |
+
}
|
| 1795 |
+
} else {
|
| 1796 |
$field_value = html_entity_decode( $field_value, ENT_QUOTES, 'UTF-8' );
|
| 1797 |
+
}
|
| 1798 |
|
| 1799 |
return $field_value;
|
| 1800 |
}
|
| 1807 |
* @since 3.0
|
| 1808 |
*/
|
| 1809 |
function admin_page() {
|
| 1810 |
+
if ( ! ( defined( 'ATTACHMENTS_SETTINGS_SCREEN' ) && ATTACHMENTS_SETTINGS_SCREEN === false ) ) {
|
| 1811 |
+
if ( apply_filters( 'attachments_settings_screen', true ) ) {
|
| 1812 |
+
add_options_page( 'Settings', __( 'Attachments', 'attachments' ), 'manage_options', 'attachments', array( $this, 'options_page' ) );
|
| 1813 |
+
}
|
| 1814 |
+
}
|
| 1815 |
}
|
| 1816 |
|
| 1817 |
|
classes/class.attachments.search.php
CHANGED
|
@@ -1,10 +1,14 @@
|
|
| 1 |
<?php
|
| 2 |
|
| 3 |
// exit if accessed directly
|
| 4 |
-
if( !defined( 'ABSPATH' ) )
|
|
|
|
|
|
|
| 5 |
|
| 6 |
// exit if we can't extend Attachments
|
| 7 |
-
if ( !class_exists( 'Attachments' ) )
|
|
|
|
|
|
|
| 8 |
|
| 9 |
|
| 10 |
|
|
@@ -14,8 +18,7 @@ if ( !class_exists( 'Attachments' ) ) return;
|
|
| 14 |
*
|
| 15 |
* @since 3.4.1
|
| 16 |
*/
|
| 17 |
-
class AttachmentsSearch extends Attachments
|
| 18 |
-
{
|
| 19 |
|
| 20 |
public $results;
|
| 21 |
|
|
@@ -24,8 +27,7 @@ class AttachmentsSearch extends Attachments
|
|
| 24 |
*
|
| 25 |
* @since 3.3
|
| 26 |
*/
|
| 27 |
-
function __construct( $query = null, $params = array() )
|
| 28 |
-
{
|
| 29 |
parent::__construct();
|
| 30 |
$this->apply_init_filters();
|
| 31 |
|
|
@@ -50,15 +52,18 @@ class AttachmentsSearch extends Attachments
|
|
| 50 |
|
| 51 |
$params['post_status'] = sanitize_text_field( $params['post_status'] );
|
| 52 |
|
| 53 |
-
if( is_string( $params['fields'] ) )
|
| 54 |
$params['fields'] = array( $params['fields'] ); // we always want an array
|
|
|
|
| 55 |
|
| 56 |
-
if( is_string( $params['filetype'] ) )
|
| 57 |
$params['filetype'] = array( $params['filetype'] ); // we always want an array
|
|
|
|
| 58 |
|
| 59 |
// since we have an array for our fields, we need to loop through and sanitize
|
| 60 |
-
for( $i = 0; $i < count( $params['fields'] ); $i++ )
|
| 61 |
-
$params['fields'][$i] = sanitize_text_field( $params['fields'][$i] );
|
|
|
|
| 62 |
|
| 63 |
// prepare our search args
|
| 64 |
$args = array(
|
|
@@ -74,11 +79,13 @@ class AttachmentsSearch extends Attachments
|
|
| 74 |
);
|
| 75 |
|
| 76 |
// append any applicable parameters that got passed to the original method call
|
| 77 |
-
if( $params['post_type'] )
|
| 78 |
$args['post_type'] = $params['post_type'];
|
|
|
|
| 79 |
|
| 80 |
-
if( $params['post_id'] )
|
| 81 |
$args['post__in'] = array( $params['post_id'] ); // avoid using 'p' or 'page_id'
|
|
|
|
| 82 |
|
| 83 |
// we haven't utilized all parameters yet because they're meta-value based so we need to
|
| 84 |
// do some parsing on our end to validate the returned results
|
|
@@ -86,71 +93,76 @@ class AttachmentsSearch extends Attachments
|
|
| 86 |
$possible_posts = new WP_Query( $args );
|
| 87 |
$potential_attachments = false; // stores valid attachments as restrictions are added
|
| 88 |
|
| 89 |
-
if( $possible_posts->found_posts )
|
| 90 |
-
{
|
| 91 |
// we have results from the reliminary search, we need to quantify them
|
| 92 |
-
while( $possible_posts->have_posts() )
|
| 93 |
-
{
|
| 94 |
$possible_posts->next_post();
|
| 95 |
$possible_post_ids[] = $possible_posts->post->ID;
|
| 96 |
}
|
| 97 |
|
| 98 |
// now that we have our possible post IDs we can grab all Attachments for all of those posts
|
| 99 |
-
foreach( $possible_post_ids as $possible_post_id )
|
| 100 |
-
{
|
| 101 |
$possible_attachments = parent::get_attachments( $params['instance'], $possible_post_id );
|
| 102 |
|
| 103 |
-
foreach( $possible_attachments as $possible_attachment )
|
| 104 |
$potential_attachments[] = $possible_attachment;
|
|
|
|
| 105 |
}
|
| 106 |
|
| 107 |
}
|
| 108 |
|
| 109 |
// if there aren't even any potential attachments, we'll just short circuit
|
| 110 |
-
if(
|
| 111 |
return;
|
|
|
|
| 112 |
|
| 113 |
// first we need to make sure that our query matches each attachment
|
| 114 |
// we need to do this because the LIKE query returned the entire meta record,
|
| 115 |
// not necessarily tied to any specific Attachment
|
| 116 |
$total_potentials = count( $potential_attachments );
|
| 117 |
-
for( $i = 0; $i < $total_potentials; $i++ )
|
| 118 |
-
{
|
| 119 |
$valid = false;
|
| 120 |
|
| 121 |
// if we need to limit our search to specific fields, we'll do that here
|
| 122 |
-
if( $params['fields'] )
|
| 123 |
-
{
|
| 124 |
// we only want to check certain fields
|
| 125 |
-
foreach( $params['fields'] as $field )
|
| 126 |
-
if( isset( $potential_attachments[$i]->fields->$field ) )
|
| 127 |
if( empty( $query ) || strpos( strtolower( $potential_attachments[$i]->fields->$field ),
|
| 128 |
-
strtolower( $query ) ) !== false ) // does the value match?
|
| 129 |
-
if( is_null( $params['filetype'] ) || ( !is_null( $params['filetype'] ) && in_array( parent::get_mime_type( $potential_attachments[$i]->id ), $params['filetype'] ) ) )
|
| 130 |
$valid = true;
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
|
|
|
|
|
|
| 134 |
// we want to check all fields
|
| 135 |
-
|
| 136 |
-
foreach( $potential_attachments[$i]->fields as $field_name => $field_value )
|
| 137 |
-
if( empty( $query ) || strpos( strtolower( $field_value) , strtolower( $query ) ) !== false )
|
| 138 |
-
if( is_null( $params['filetype'] ) || ( !is_null( $params['filetype'] ) && in_array( parent::get_mime_type( $potential_attachments[$i]->id ), $params['filetype'] ) ) )
|
| 139 |
$valid = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 140 |
}
|
| 141 |
|
| 142 |
-
if(
|
| 143 |
-
unset( $potential_attachments[$i] );
|
|
|
|
| 144 |
|
| 145 |
// now our potentials have been limited to each match the query based on any field
|
| 146 |
}
|
| 147 |
|
| 148 |
// limit to attachment ID if applicable
|
| 149 |
-
if( $params['attachment_id'] )
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
if( $potential_attachments[$key]->id != $params['attachment_id'] )
|
| 153 |
unset( $potential_attachments[$key] );
|
|
|
|
|
|
|
| 154 |
}
|
| 155 |
|
| 156 |
$this->results = array_values( $potential_attachments );
|
| 1 |
<?php
|
| 2 |
|
| 3 |
// exit if accessed directly
|
| 4 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
| 5 |
+
exit;
|
| 6 |
+
}
|
| 7 |
|
| 8 |
// exit if we can't extend Attachments
|
| 9 |
+
if ( ! class_exists( 'Attachments' ) ) {
|
| 10 |
+
exit;
|
| 11 |
+
}
|
| 12 |
|
| 13 |
|
| 14 |
|
| 18 |
*
|
| 19 |
* @since 3.4.1
|
| 20 |
*/
|
| 21 |
+
class AttachmentsSearch extends Attachments {
|
|
|
|
| 22 |
|
| 23 |
public $results;
|
| 24 |
|
| 27 |
*
|
| 28 |
* @since 3.3
|
| 29 |
*/
|
| 30 |
+
function __construct( $query = null, $params = array() ) {
|
|
|
|
| 31 |
parent::__construct();
|
| 32 |
$this->apply_init_filters();
|
| 33 |
|
| 52 |
|
| 53 |
$params['post_status'] = sanitize_text_field( $params['post_status'] );
|
| 54 |
|
| 55 |
+
if( is_string( $params['fields'] ) ) {
|
| 56 |
$params['fields'] = array( $params['fields'] ); // we always want an array
|
| 57 |
+
}
|
| 58 |
|
| 59 |
+
if( is_string( $params['filetype'] ) ) {
|
| 60 |
$params['filetype'] = array( $params['filetype'] ); // we always want an array
|
| 61 |
+
}
|
| 62 |
|
| 63 |
// since we have an array for our fields, we need to loop through and sanitize
|
| 64 |
+
for ( $i = 0; $i < count( $params['fields'] ); $i++ ) {
|
| 65 |
+
$params['fields'][ $i ] = sanitize_text_field( $params['fields'][ $i ] );
|
| 66 |
+
}
|
| 67 |
|
| 68 |
// prepare our search args
|
| 69 |
$args = array(
|
| 79 |
);
|
| 80 |
|
| 81 |
// append any applicable parameters that got passed to the original method call
|
| 82 |
+
if( $params['post_type'] ) {
|
| 83 |
$args['post_type'] = $params['post_type'];
|
| 84 |
+
}
|
| 85 |
|
| 86 |
+
if( $params['post_id'] ) {
|
| 87 |
$args['post__in'] = array( $params['post_id'] ); // avoid using 'p' or 'page_id'
|
| 88 |
+
}
|
| 89 |
|
| 90 |
// we haven't utilized all parameters yet because they're meta-value based so we need to
|
| 91 |
// do some parsing on our end to validate the returned results
|
| 93 |
$possible_posts = new WP_Query( $args );
|
| 94 |
$potential_attachments = false; // stores valid attachments as restrictions are added
|
| 95 |
|
| 96 |
+
if ( $possible_posts->found_posts ) {
|
|
|
|
| 97 |
// we have results from the reliminary search, we need to quantify them
|
| 98 |
+
while ( $possible_posts->have_posts() ) {
|
|
|
|
| 99 |
$possible_posts->next_post();
|
| 100 |
$possible_post_ids[] = $possible_posts->post->ID;
|
| 101 |
}
|
| 102 |
|
| 103 |
// now that we have our possible post IDs we can grab all Attachments for all of those posts
|
| 104 |
+
foreach ( $possible_post_ids as $possible_post_id ) {
|
|
|
|
| 105 |
$possible_attachments = parent::get_attachments( $params['instance'], $possible_post_id );
|
| 106 |
|
| 107 |
+
foreach ( $possible_attachments as $possible_attachment ) {
|
| 108 |
$potential_attachments[] = $possible_attachment;
|
| 109 |
+
}
|
| 110 |
}
|
| 111 |
|
| 112 |
}
|
| 113 |
|
| 114 |
// if there aren't even any potential attachments, we'll just short circuit
|
| 115 |
+
if ( ! $potential_attachments ) {
|
| 116 |
return;
|
| 117 |
+
}
|
| 118 |
|
| 119 |
// first we need to make sure that our query matches each attachment
|
| 120 |
// we need to do this because the LIKE query returned the entire meta record,
|
| 121 |
// not necessarily tied to any specific Attachment
|
| 122 |
$total_potentials = count( $potential_attachments );
|
| 123 |
+
for( $i = 0; $i < $total_potentials; $i++ ) {
|
|
|
|
| 124 |
$valid = false;
|
| 125 |
|
| 126 |
// if we need to limit our search to specific fields, we'll do that here
|
| 127 |
+
if ( $params['fields'] ) {
|
|
|
|
| 128 |
// we only want to check certain fields
|
| 129 |
+
foreach ( $params['fields'] as $field ) {
|
| 130 |
+
if( isset( $potential_attachments[$i]->fields->$field ) ) { // does the field exist?
|
| 131 |
if( empty( $query ) || strpos( strtolower( $potential_attachments[$i]->fields->$field ),
|
| 132 |
+
strtolower( $query ) ) !== false ) { // does the value match?
|
| 133 |
+
if( is_null( $params['filetype'] ) || ( !is_null( $params['filetype'] ) && in_array( parent::get_mime_type( $potential_attachments[ $i ]->id ), $params['filetype'] ) ) ) {
|
| 134 |
$valid = true;
|
| 135 |
+
}
|
| 136 |
+
}
|
| 137 |
+
}
|
| 138 |
+
}
|
| 139 |
+
} else {
|
| 140 |
// we want to check all fields
|
| 141 |
+
if ( isset( $potential_attachments[$i]->fields ) ) {
|
| 142 |
+
foreach ( $potential_attachments[$i]->fields as $field_name => $field_value ) {
|
| 143 |
+
if ( empty( $query ) || strpos( strtolower( $field_value) , strtolower( $query ) ) !== false ) {
|
| 144 |
+
if ( is_null( $params['filetype'] ) || ( !is_null( $params['filetype'] ) && in_array( parent::get_mime_type( $potential_attachments[ $i ]->id ), $params['filetype'] ) ) ) {
|
| 145 |
$valid = true;
|
| 146 |
+
}
|
| 147 |
+
}
|
| 148 |
+
}
|
| 149 |
+
}
|
| 150 |
}
|
| 151 |
|
| 152 |
+
if ( ! $valid ) {
|
| 153 |
+
unset( $potential_attachments[ $i ] );
|
| 154 |
+
}
|
| 155 |
|
| 156 |
// now our potentials have been limited to each match the query based on any field
|
| 157 |
}
|
| 158 |
|
| 159 |
// limit to attachment ID if applicable
|
| 160 |
+
if ( $params['attachment_id'] ) {
|
| 161 |
+
foreach ( $potential_attachments as $key => $value ) {
|
| 162 |
+
if ( $potential_attachments[ $key ]->id != $params['attachment_id'] ) {
|
|
|
|
| 163 |
unset( $potential_attachments[$key] );
|
| 164 |
+
}
|
| 165 |
+
}
|
| 166 |
}
|
| 167 |
|
| 168 |
$this->results = array_values( $potential_attachments );
|
classes/class.field.php
CHANGED
|
@@ -7,14 +7,19 @@
|
|
| 7 |
* @subpackage Main
|
| 8 |
*/
|
| 9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
// Declare our class
|
| 11 |
-
if ( !class_exists( 'Attachments_Field' ) ) :
|
| 12 |
|
| 13 |
/**
|
| 14 |
* Attachments_Field
|
| 15 |
*/
|
| 16 |
-
abstract class Attachments_Field
|
| 17 |
-
|
| 18 |
public $instance; // the instance this field is used within
|
| 19 |
public $name; // the user-defined field name
|
| 20 |
public $field_name; // the name attribute to be used
|
|
@@ -35,8 +40,7 @@ if ( !class_exists( 'Attachments_Field' ) ) :
|
|
| 35 |
* @param string $label Field label
|
| 36 |
* @param mixed $value Field value
|
| 37 |
*/
|
| 38 |
-
function __construct( $name = 'name', $label = 'Name', $value = null, $meta = array() )
|
| 39 |
-
{
|
| 40 |
$this->name = sanitize_title( $name );
|
| 41 |
$this->label = __( esc_attr( $label) );
|
| 42 |
$this->value = $value;
|
|
@@ -53,8 +57,7 @@ if ( !class_exists( 'Attachments_Field' ) ) :
|
|
| 53 |
* @param string $instance The instance name
|
| 54 |
* @param Attachments_Field $field The field object
|
| 55 |
*/
|
| 56 |
-
function set_field_instance( $instance, $field )
|
| 57 |
-
{
|
| 58 |
$field->instance = $instance;
|
| 59 |
}
|
| 60 |
|
|
@@ -65,16 +68,16 @@ if ( !class_exists( 'Attachments_Field' ) ) :
|
|
| 65 |
* @param Attachments_Field $field The field object
|
| 66 |
* @param string $uid Existing UID if applicable
|
| 67 |
*/
|
| 68 |
-
function set_field_identifiers( $field, $uid = null )
|
| 69 |
-
{
|
| 70 |
// we MUST have an instance
|
| 71 |
-
if( empty( $field->instance ) )
|
| 72 |
return false;
|
|
|
|
| 73 |
|
| 74 |
// if we're pulling an existing Attachment (field has a value) we're going to use
|
| 75 |
// a PHP uniqid to set up our array flags but if we're setting up our Underscore
|
| 76 |
// template we need to use a variable flag to be processed later
|
| 77 |
-
$this->uid = !is_null( $uid ) ? $uid : '{{ attachments.attachment_uid }}';
|
| 78 |
|
| 79 |
// set the name
|
| 80 |
$field->field_name = "attachments[$field->instance][$this->uid][fields][$field->name]";
|
|
@@ -89,8 +92,7 @@ if ( !class_exists( 'Attachments_Field' ) ) :
|
|
| 89 |
* Sets the field type of the field
|
| 90 |
* @param string $field_type Registered field type name
|
| 91 |
*/
|
| 92 |
-
function set_field_type( $field_type )
|
| 93 |
-
{
|
| 94 |
$this->type = $field_type;
|
| 95 |
}
|
| 96 |
|
|
@@ -100,10 +102,10 @@ if ( !class_exists( 'Attachments_Field' ) ) :
|
|
| 100 |
* Sets the WordPress meta attribute to be used as the default
|
| 101 |
* @param string $default One of the approved defauls (title, caption, alt, description)
|
| 102 |
*/
|
| 103 |
-
function set_field_default( $default = '' )
|
| 104 |
-
|
| 105 |
-
if( is_string( $default ) && !empty( $default ) && in_array( strtolower( $default ), $this->defaults ) )
|
| 106 |
$this->default = strtolower( $default );
|
|
|
|
| 107 |
}
|
| 108 |
|
| 109 |
|
| 7 |
* @subpackage Main
|
| 8 |
*/
|
| 9 |
|
| 10 |
+
// exit if accessed directly
|
| 11 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
| 12 |
+
exit;
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
// Declare our class
|
| 16 |
+
if ( ! class_exists( 'Attachments_Field' ) ) :
|
| 17 |
|
| 18 |
/**
|
| 19 |
* Attachments_Field
|
| 20 |
*/
|
| 21 |
+
abstract class Attachments_Field {
|
| 22 |
+
|
| 23 |
public $instance; // the instance this field is used within
|
| 24 |
public $name; // the user-defined field name
|
| 25 |
public $field_name; // the name attribute to be used
|
| 40 |
* @param string $label Field label
|
| 41 |
* @param mixed $value Field value
|
| 42 |
*/
|
| 43 |
+
function __construct( $name = 'name', $label = 'Name', $value = null, $meta = array() ) {
|
|
|
|
| 44 |
$this->name = sanitize_title( $name );
|
| 45 |
$this->label = __( esc_attr( $label) );
|
| 46 |
$this->value = $value;
|
| 57 |
* @param string $instance The instance name
|
| 58 |
* @param Attachments_Field $field The field object
|
| 59 |
*/
|
| 60 |
+
function set_field_instance( $instance, $field ) {
|
|
|
|
| 61 |
$field->instance = $instance;
|
| 62 |
}
|
| 63 |
|
| 68 |
* @param Attachments_Field $field The field object
|
| 69 |
* @param string $uid Existing UID if applicable
|
| 70 |
*/
|
| 71 |
+
function set_field_identifiers( $field, $uid = null ) {
|
|
|
|
| 72 |
// we MUST have an instance
|
| 73 |
+
if ( empty( $field->instance ) ) {
|
| 74 |
return false;
|
| 75 |
+
}
|
| 76 |
|
| 77 |
// if we're pulling an existing Attachment (field has a value) we're going to use
|
| 78 |
// a PHP uniqid to set up our array flags but if we're setting up our Underscore
|
| 79 |
// template we need to use a variable flag to be processed later
|
| 80 |
+
$this->uid = ! is_null( $uid ) ? $uid : '{{ attachments.attachment_uid }}';
|
| 81 |
|
| 82 |
// set the name
|
| 83 |
$field->field_name = "attachments[$field->instance][$this->uid][fields][$field->name]";
|
| 92 |
* Sets the field type of the field
|
| 93 |
* @param string $field_type Registered field type name
|
| 94 |
*/
|
| 95 |
+
function set_field_type( $field_type ) {
|
|
|
|
| 96 |
$this->type = $field_type;
|
| 97 |
}
|
| 98 |
|
| 102 |
* Sets the WordPress meta attribute to be used as the default
|
| 103 |
* @param string $default One of the approved defauls (title, caption, alt, description)
|
| 104 |
*/
|
| 105 |
+
function set_field_default( $default = '' ) {
|
| 106 |
+
if ( is_string( $default ) && ! empty( $default ) && in_array( strtolower( $default ), $this->defaults ) ) {
|
|
|
|
| 107 |
$this->default = strtolower( $default );
|
| 108 |
+
}
|
| 109 |
}
|
| 110 |
|
| 111 |
|
classes/fields/class.field.select.php
CHANGED
|
@@ -7,8 +7,7 @@
|
|
| 7 |
* @subpackage Main
|
| 8 |
*/
|
| 9 |
|
| 10 |
-
class Attachments_Field_Select extends Attachments_Field
|
| 11 |
-
{
|
| 12 |
|
| 13 |
private $allow_null; // whether null is allowed
|
| 14 |
private $multiple; // whether it's a multiple <select>
|
|
@@ -21,8 +20,7 @@ class Attachments_Field_Select extends Attachments_Field
|
|
| 21 |
* @param string $label Field label
|
| 22 |
* @param mixed $value Field value
|
| 23 |
*/
|
| 24 |
-
function __construct( $name = 'name', $label = 'Name', $value = null, $meta = array() )
|
| 25 |
-
{
|
| 26 |
$defaults = array(
|
| 27 |
'options' => array(), // no <option>s by default
|
| 28 |
'allow_null' => false,
|
|
@@ -45,8 +43,7 @@ class Attachments_Field_Select extends Attachments_Field
|
|
| 45 |
* @param Attachments_Field $field The field object
|
| 46 |
* @return void
|
| 47 |
*/
|
| 48 |
-
function html( $field )
|
| 49 |
-
{
|
| 50 |
?>
|
| 51 |
<select name="<?php esc_attr_e( $field->field_name ); ?><?php if( $this->multiple ) : ?>[]<?php endif; ?>" id="<?php esc_attr_e( $field->field_id ); ?>" class="attachments attachments-field attachments-field-<?php esc_attr_e( $field->field_name ); ?> attachments-field-<?php esc_attr_e( $field->field_id ); ?>"<?php if( $this->multiple ) : ?> multiple<?php endif; ?>>
|
| 52 |
<?php if( $this->allow_null && !$this->multiple ) : ?><option value="">—</option><?php endif; ?>
|
|
@@ -54,18 +51,18 @@ class Attachments_Field_Select extends Attachments_Field
|
|
| 54 |
<?php
|
| 55 |
$selected = selected( $field->value, $option_value ) ? ' selected' : '';
|
| 56 |
|
| 57 |
-
if( is_array( $field->value ) )
|
| 58 |
$selected = in_array( $option_value, $field->value ) ? ' selected' : '';
|
|
|
|
| 59 |
|
| 60 |
-
if( is_object( $field->value ) )
|
| 61 |
-
{
|
| 62 |
$values = get_object_vars( $field->value );
|
| 63 |
$selected = in_array( $option_value, $values ) ? ' selected' : '';
|
| 64 |
}
|
| 65 |
|
| 66 |
?>
|
| 67 |
<option value="<?php esc_attr_e( $option_value ); ?>"<?php echo $selected; ?>>
|
| 68 |
-
<?php echo $option_label; ?>
|
| 69 |
</option>
|
| 70 |
<?php endforeach; ?>
|
| 71 |
</select>
|
|
@@ -80,8 +77,7 @@ class Attachments_Field_Select extends Attachments_Field
|
|
| 80 |
* @param Attachments_field $field The field object
|
| 81 |
* @return string The formatted value
|
| 82 |
*/
|
| 83 |
-
function format_value_for_input( $value, $field = null )
|
| 84 |
-
{
|
| 85 |
return $value;
|
| 86 |
}
|
| 87 |
|
|
@@ -91,8 +87,7 @@ class Attachments_Field_Select extends Attachments_Field
|
|
| 91 |
* Fires once per field type per instance and outputs any additional assets (e.g. external JavaScript)
|
| 92 |
* @return void
|
| 93 |
*/
|
| 94 |
-
public function assets()
|
| 95 |
-
{
|
| 96 |
return;
|
| 97 |
}
|
| 98 |
|
|
@@ -102,9 +97,8 @@ class Attachments_Field_Select extends Attachments_Field
|
|
| 102 |
* Hook into WordPress' init action
|
| 103 |
* @return void
|
| 104 |
*/
|
| 105 |
-
function init()
|
| 106 |
-
{
|
| 107 |
return;
|
| 108 |
}
|
| 109 |
|
| 110 |
-
}
|
| 7 |
* @subpackage Main
|
| 8 |
*/
|
| 9 |
|
| 10 |
+
class Attachments_Field_Select extends Attachments_Field {
|
|
|
|
| 11 |
|
| 12 |
private $allow_null; // whether null is allowed
|
| 13 |
private $multiple; // whether it's a multiple <select>
|
| 20 |
* @param string $label Field label
|
| 21 |
* @param mixed $value Field value
|
| 22 |
*/
|
| 23 |
+
function __construct( $name = 'name', $label = 'Name', $value = null, $meta = array() ) {
|
|
|
|
| 24 |
$defaults = array(
|
| 25 |
'options' => array(), // no <option>s by default
|
| 26 |
'allow_null' => false,
|
| 43 |
* @param Attachments_Field $field The field object
|
| 44 |
* @return void
|
| 45 |
*/
|
| 46 |
+
function html( $field ) {
|
|
|
|
| 47 |
?>
|
| 48 |
<select name="<?php esc_attr_e( $field->field_name ); ?><?php if( $this->multiple ) : ?>[]<?php endif; ?>" id="<?php esc_attr_e( $field->field_id ); ?>" class="attachments attachments-field attachments-field-<?php esc_attr_e( $field->field_name ); ?> attachments-field-<?php esc_attr_e( $field->field_id ); ?>"<?php if( $this->multiple ) : ?> multiple<?php endif; ?>>
|
| 49 |
<?php if( $this->allow_null && !$this->multiple ) : ?><option value="">—</option><?php endif; ?>
|
| 51 |
<?php
|
| 52 |
$selected = selected( $field->value, $option_value ) ? ' selected' : '';
|
| 53 |
|
| 54 |
+
if( is_array( $field->value ) ) {
|
| 55 |
$selected = in_array( $option_value, $field->value ) ? ' selected' : '';
|
| 56 |
+
}
|
| 57 |
|
| 58 |
+
if ( is_object( $field->value ) ) {
|
|
|
|
| 59 |
$values = get_object_vars( $field->value );
|
| 60 |
$selected = in_array( $option_value, $values ) ? ' selected' : '';
|
| 61 |
}
|
| 62 |
|
| 63 |
?>
|
| 64 |
<option value="<?php esc_attr_e( $option_value ); ?>"<?php echo $selected; ?>>
|
| 65 |
+
<?php echo esc_html( $option_label ); ?>
|
| 66 |
</option>
|
| 67 |
<?php endforeach; ?>
|
| 68 |
</select>
|
| 77 |
* @param Attachments_field $field The field object
|
| 78 |
* @return string The formatted value
|
| 79 |
*/
|
| 80 |
+
function format_value_for_input( $value, $field = null ) {
|
|
|
|
| 81 |
return $value;
|
| 82 |
}
|
| 83 |
|
| 87 |
* Fires once per field type per instance and outputs any additional assets (e.g. external JavaScript)
|
| 88 |
* @return void
|
| 89 |
*/
|
| 90 |
+
public function assets() {
|
|
|
|
| 91 |
return;
|
| 92 |
}
|
| 93 |
|
| 97 |
* Hook into WordPress' init action
|
| 98 |
* @return void
|
| 99 |
*/
|
| 100 |
+
function init() {
|
|
|
|
| 101 |
return;
|
| 102 |
}
|
| 103 |
|
| 104 |
+
}
|
classes/fields/class.field.text.php
CHANGED
|
@@ -7,8 +7,7 @@
|
|
| 7 |
* @subpackage Main
|
| 8 |
*/
|
| 9 |
|
| 10 |
-
class Attachments_Field_Text extends Attachments_Field
|
| 11 |
-
{
|
| 12 |
|
| 13 |
/**
|
| 14 |
* Constructor
|
|
@@ -16,8 +15,7 @@ class Attachments_Field_Text extends Attachments_Field
|
|
| 16 |
* @param string $label Field label
|
| 17 |
* @param mixed $value Field value
|
| 18 |
*/
|
| 19 |
-
function __construct( $name = 'name', $label = 'Name', $value = null, $meta = array() )
|
| 20 |
-
{
|
| 21 |
parent::__construct( $name, $label, $value, $meta );
|
| 22 |
}
|
| 23 |
|
|
@@ -28,8 +26,7 @@ class Attachments_Field_Text extends Attachments_Field
|
|
| 28 |
* @param Attachments_Field $field The field object
|
| 29 |
* @return void
|
| 30 |
*/
|
| 31 |
-
function html( $field )
|
| 32 |
-
{
|
| 33 |
?>
|
| 34 |
<input type="text" name="<?php esc_attr_e( $field->field_name ); ?>" id="<?php esc_attr_e( $field->field_id ); ?>" class="attachments attachments-field attachments-field-<?php esc_attr_e( $field->field_name ); ?> attachments-field-<?php esc_attr_e( $field->field_id ); ?>" value="<?php esc_attr_e( $field->value ); ?>" data-default="<?php esc_attr_e( $field->default ); ?>" />
|
| 35 |
<?php
|
|
@@ -43,8 +40,7 @@ class Attachments_Field_Text extends Attachments_Field
|
|
| 43 |
* @param Attachments_field $field The field object
|
| 44 |
* @return string The formatted value
|
| 45 |
*/
|
| 46 |
-
function format_value_for_input( $value, $field = null )
|
| 47 |
-
{
|
| 48 |
return htmlspecialchars( $value, ENT_QUOTES );
|
| 49 |
}
|
| 50 |
|
|
@@ -54,8 +50,7 @@ class Attachments_Field_Text extends Attachments_Field
|
|
| 54 |
* Fires once per field type per instance and outputs any additional assets (e.g. external JavaScript)
|
| 55 |
* @return void
|
| 56 |
*/
|
| 57 |
-
public function assets()
|
| 58 |
-
{
|
| 59 |
return;
|
| 60 |
}
|
| 61 |
|
|
@@ -65,8 +60,7 @@ class Attachments_Field_Text extends Attachments_Field
|
|
| 65 |
* Hook into WordPress' init action
|
| 66 |
* @return void
|
| 67 |
*/
|
| 68 |
-
function init()
|
| 69 |
-
{
|
| 70 |
return;
|
| 71 |
}
|
| 72 |
|
| 7 |
* @subpackage Main
|
| 8 |
*/
|
| 9 |
|
| 10 |
+
class Attachments_Field_Text extends Attachments_Field {
|
|
|
|
| 11 |
|
| 12 |
/**
|
| 13 |
* Constructor
|
| 15 |
* @param string $label Field label
|
| 16 |
* @param mixed $value Field value
|
| 17 |
*/
|
| 18 |
+
function __construct( $name = 'name', $label = 'Name', $value = null, $meta = array() ) {
|
|
|
|
| 19 |
parent::__construct( $name, $label, $value, $meta );
|
| 20 |
}
|
| 21 |
|
| 26 |
* @param Attachments_Field $field The field object
|
| 27 |
* @return void
|
| 28 |
*/
|
| 29 |
+
function html( $field ) {
|
|
|
|
| 30 |
?>
|
| 31 |
<input type="text" name="<?php esc_attr_e( $field->field_name ); ?>" id="<?php esc_attr_e( $field->field_id ); ?>" class="attachments attachments-field attachments-field-<?php esc_attr_e( $field->field_name ); ?> attachments-field-<?php esc_attr_e( $field->field_id ); ?>" value="<?php esc_attr_e( $field->value ); ?>" data-default="<?php esc_attr_e( $field->default ); ?>" />
|
| 32 |
<?php
|
| 40 |
* @param Attachments_field $field The field object
|
| 41 |
* @return string The formatted value
|
| 42 |
*/
|
| 43 |
+
function format_value_for_input( $value, $field = null ) {
|
|
|
|
| 44 |
return htmlspecialchars( $value, ENT_QUOTES );
|
| 45 |
}
|
| 46 |
|
| 50 |
* Fires once per field type per instance and outputs any additional assets (e.g. external JavaScript)
|
| 51 |
* @return void
|
| 52 |
*/
|
| 53 |
+
public function assets() {
|
|
|
|
| 54 |
return;
|
| 55 |
}
|
| 56 |
|
| 60 |
* Hook into WordPress' init action
|
| 61 |
* @return void
|
| 62 |
*/
|
| 63 |
+
function init() {
|
|
|
|
| 64 |
return;
|
| 65 |
}
|
| 66 |
|
classes/fields/class.field.textarea.php
CHANGED
|
@@ -7,8 +7,7 @@
|
|
| 7 |
* @subpackage Main
|
| 8 |
*/
|
| 9 |
|
| 10 |
-
class Attachments_Field_Textarea extends Attachments_Field
|
| 11 |
-
{
|
| 12 |
|
| 13 |
/**
|
| 14 |
* Constructor
|
|
@@ -16,8 +15,7 @@ class Attachments_Field_Textarea extends Attachments_Field
|
|
| 16 |
* @param string $label Field label
|
| 17 |
* @param mixed $value Field value
|
| 18 |
*/
|
| 19 |
-
function __construct( $name = 'name', $label = 'Name', $value = null, $meta = array() )
|
| 20 |
-
{
|
| 21 |
parent::__construct( $name, $label, $value, $meta );
|
| 22 |
}
|
| 23 |
|
|
@@ -28,8 +26,7 @@ class Attachments_Field_Textarea extends Attachments_Field
|
|
| 28 |
* @param Attachments_Field $field The field object
|
| 29 |
* @return void
|
| 30 |
*/
|
| 31 |
-
function html( $field )
|
| 32 |
-
{
|
| 33 |
?>
|
| 34 |
<textarea type="text" name="<?php esc_attr_e( $field->field_name ); ?>" id="<?php esc_attr_e( $field->field_id ); ?>" class="attachments attachments-field attachments-field-<?php esc_attr_e( $field->field_name ); ?> attachments-field-<?php esc_attr_e( $field->field_id ); ?>" data-default="<?php esc_attr_e( $field->default ); ?>"><?php echo esc_textarea( $field->value ); ?></textarea>
|
| 35 |
<?php
|
|
@@ -43,8 +40,7 @@ class Attachments_Field_Textarea extends Attachments_Field
|
|
| 43 |
* @param Attachments_field $field The field object
|
| 44 |
* @return string The formatted value
|
| 45 |
*/
|
| 46 |
-
function format_value_for_input( $value, $field = null )
|
| 47 |
-
{
|
| 48 |
return $value;
|
| 49 |
}
|
| 50 |
|
|
@@ -54,8 +50,7 @@ class Attachments_Field_Textarea extends Attachments_Field
|
|
| 54 |
* Fires once per field type per instance and outputs any additional assets (e.g. external JavaScript)
|
| 55 |
* @return void
|
| 56 |
*/
|
| 57 |
-
public function assets()
|
| 58 |
-
{
|
| 59 |
return;
|
| 60 |
}
|
| 61 |
|
|
@@ -65,8 +60,7 @@ class Attachments_Field_Textarea extends Attachments_Field
|
|
| 65 |
* Hook into WordPress' init action
|
| 66 |
* @return void
|
| 67 |
*/
|
| 68 |
-
function init()
|
| 69 |
-
{
|
| 70 |
return;
|
| 71 |
}
|
| 72 |
|
| 7 |
* @subpackage Main
|
| 8 |
*/
|
| 9 |
|
| 10 |
+
class Attachments_Field_Textarea extends Attachments_Field {
|
|
|
|
| 11 |
|
| 12 |
/**
|
| 13 |
* Constructor
|
| 15 |
* @param string $label Field label
|
| 16 |
* @param mixed $value Field value
|
| 17 |
*/
|
| 18 |
+
function __construct( $name = 'name', $label = 'Name', $value = null, $meta = array() ) {
|
|
|
|
| 19 |
parent::__construct( $name, $label, $value, $meta );
|
| 20 |
}
|
| 21 |
|
| 26 |
* @param Attachments_Field $field The field object
|
| 27 |
* @return void
|
| 28 |
*/
|
| 29 |
+
function html( $field ) {
|
|
|
|
| 30 |
?>
|
| 31 |
<textarea type="text" name="<?php esc_attr_e( $field->field_name ); ?>" id="<?php esc_attr_e( $field->field_id ); ?>" class="attachments attachments-field attachments-field-<?php esc_attr_e( $field->field_name ); ?> attachments-field-<?php esc_attr_e( $field->field_id ); ?>" data-default="<?php esc_attr_e( $field->default ); ?>"><?php echo esc_textarea( $field->value ); ?></textarea>
|
| 32 |
<?php
|
| 40 |
* @param Attachments_field $field The field object
|
| 41 |
* @return string The formatted value
|
| 42 |
*/
|
| 43 |
+
function format_value_for_input( $value, $field = null ) {
|
|
|
|
| 44 |
return $value;
|
| 45 |
}
|
| 46 |
|
| 50 |
* Fires once per field type per instance and outputs any additional assets (e.g. external JavaScript)
|
| 51 |
* @return void
|
| 52 |
*/
|
| 53 |
+
public function assets() {
|
|
|
|
| 54 |
return;
|
| 55 |
}
|
| 56 |
|
| 60 |
* Hook into WordPress' init action
|
| 61 |
* @return void
|
| 62 |
*/
|
| 63 |
+
function init() {
|
|
|
|
| 64 |
return;
|
| 65 |
}
|
| 66 |
|
classes/fields/class.field.wysiwyg.php
CHANGED
|
@@ -7,8 +7,7 @@
|
|
| 7 |
* @subpackage Main
|
| 8 |
*/
|
| 9 |
|
| 10 |
-
class Attachments_Field_WYSIWYG extends Attachments_Field
|
| 11 |
-
{
|
| 12 |
|
| 13 |
/**
|
| 14 |
* Constructor
|
|
@@ -16,8 +15,7 @@ class Attachments_Field_WYSIWYG extends Attachments_Field
|
|
| 16 |
* @param string $label Field label
|
| 17 |
* @param mixed $value Field value
|
| 18 |
*/
|
| 19 |
-
function __construct( $name = 'name', $label = 'Name', $value = null, $meta = array() )
|
| 20 |
-
{
|
| 21 |
parent::__construct( $name, $label, $value, $meta );
|
| 22 |
|
| 23 |
add_filter( 'wp_default_editor', array( $this, 'wp_default_editor' ) );
|
|
@@ -29,16 +27,16 @@ class Attachments_Field_WYSIWYG extends Attachments_Field
|
|
| 29 |
* Hook into WordPress' init action
|
| 30 |
* @return void
|
| 31 |
*/
|
| 32 |
-
function init()
|
| 33 |
-
{
|
| 34 |
global $post;
|
| 35 |
|
| 36 |
// ensure we've got TinyMCE to work with
|
| 37 |
$has_editor = post_type_supports( $post->post_type, 'editor' );
|
| 38 |
add_post_type_support( $post->post_type, 'editor' );
|
| 39 |
|
| 40 |
-
if(
|
| 41 |
echo '<style type="text/css">#poststuff .postarea { display:none; }</style>';
|
|
|
|
| 42 |
}
|
| 43 |
|
| 44 |
|
|
@@ -48,8 +46,7 @@ class Attachments_Field_WYSIWYG extends Attachments_Field
|
|
| 48 |
* @param Attachments_Field $field The field object
|
| 49 |
* @return void
|
| 50 |
*/
|
| 51 |
-
function html( $field )
|
| 52 |
-
{
|
| 53 |
?>
|
| 54 |
<div class="wp-editor-wrap attachments-field-wysiwyg-editor-wrap">
|
| 55 |
<div class="wp-editor-container">
|
|
@@ -65,9 +62,8 @@ class Attachments_Field_WYSIWYG extends Attachments_Field
|
|
| 65 |
* Fires once per field type per instance and outputs any additional assets (e.g. external JavaScript)
|
| 66 |
* @return void
|
| 67 |
*/
|
| 68 |
-
function assets()
|
| 69 |
-
|
| 70 |
-
if( 'true' == get_user_meta( get_current_user_id(), 'rich_editing', true ) ) :
|
| 71 |
?>
|
| 72 |
<style type="text/css">
|
| 73 |
.attachments-field-wysiwyg-editor-wrap { background:#fff; }
|
|
@@ -138,8 +134,7 @@ class Attachments_Field_WYSIWYG extends Attachments_Field
|
|
| 138 |
* @param Attachments_field $field The field object
|
| 139 |
* @return string The formatted value
|
| 140 |
*/
|
| 141 |
-
function format_value_for_input( $value, $field = null )
|
| 142 |
-
{
|
| 143 |
return wp_richedit_pre( $value );
|
| 144 |
}
|
| 145 |
|
|
@@ -149,8 +144,7 @@ class Attachments_Field_WYSIWYG extends Attachments_Field
|
|
| 149 |
* Callback for 'wp_default_editor' action in constructor. Sets the default editor to TinyMCE.
|
| 150 |
* @return string Editor name
|
| 151 |
*/
|
| 152 |
-
function wp_default_editor()
|
| 153 |
-
{
|
| 154 |
return 'tinymce'; // html or tinymce
|
| 155 |
}
|
| 156 |
|
| 7 |
* @subpackage Main
|
| 8 |
*/
|
| 9 |
|
| 10 |
+
class Attachments_Field_WYSIWYG extends Attachments_Field {
|
|
|
|
| 11 |
|
| 12 |
/**
|
| 13 |
* Constructor
|
| 15 |
* @param string $label Field label
|
| 16 |
* @param mixed $value Field value
|
| 17 |
*/
|
| 18 |
+
function __construct( $name = 'name', $label = 'Name', $value = null, $meta = array() ) {
|
|
|
|
| 19 |
parent::__construct( $name, $label, $value, $meta );
|
| 20 |
|
| 21 |
add_filter( 'wp_default_editor', array( $this, 'wp_default_editor' ) );
|
| 27 |
* Hook into WordPress' init action
|
| 28 |
* @return void
|
| 29 |
*/
|
| 30 |
+
function init() {
|
|
|
|
| 31 |
global $post;
|
| 32 |
|
| 33 |
// ensure we've got TinyMCE to work with
|
| 34 |
$has_editor = post_type_supports( $post->post_type, 'editor' );
|
| 35 |
add_post_type_support( $post->post_type, 'editor' );
|
| 36 |
|
| 37 |
+
if ( ! $has_editor ) {
|
| 38 |
echo '<style type="text/css">#poststuff .postarea { display:none; }</style>';
|
| 39 |
+
}
|
| 40 |
}
|
| 41 |
|
| 42 |
|
| 46 |
* @param Attachments_Field $field The field object
|
| 47 |
* @return void
|
| 48 |
*/
|
| 49 |
+
function html( $field ) {
|
|
|
|
| 50 |
?>
|
| 51 |
<div class="wp-editor-wrap attachments-field-wysiwyg-editor-wrap">
|
| 52 |
<div class="wp-editor-container">
|
| 62 |
* Fires once per field type per instance and outputs any additional assets (e.g. external JavaScript)
|
| 63 |
* @return void
|
| 64 |
*/
|
| 65 |
+
function assets() {
|
| 66 |
+
if ( 'true' == get_user_meta( get_current_user_id(), 'rich_editing', true ) ) :
|
|
|
|
| 67 |
?>
|
| 68 |
<style type="text/css">
|
| 69 |
.attachments-field-wysiwyg-editor-wrap { background:#fff; }
|
| 134 |
* @param Attachments_field $field The field object
|
| 135 |
* @return string The formatted value
|
| 136 |
*/
|
| 137 |
+
function format_value_for_input( $value, $field = null ) {
|
|
|
|
| 138 |
return wp_richedit_pre( $value );
|
| 139 |
}
|
| 140 |
|
| 144 |
* Callback for 'wp_default_editor' action in constructor. Sets the default editor to TinyMCE.
|
| 145 |
* @return string Editor name
|
| 146 |
*/
|
| 147 |
+
function wp_default_editor() {
|
|
|
|
| 148 |
return 'tinymce'; // html or tinymce
|
| 149 |
}
|
| 150 |
|
deprecated/attachments.php
CHANGED
|
@@ -21,12 +21,15 @@
|
|
| 21 |
*/
|
| 22 |
|
| 23 |
// Exit if accessed directly
|
| 24 |
-
if( !defined( 'ABSPATH' ) )
|
|
|
|
|
|
|
| 25 |
|
| 26 |
|
| 27 |
// constant definition
|
| 28 |
-
if( !defined( 'IS_ADMIN' ) )
|
| 29 |
define( 'IS_ADMIN', is_admin() );
|
|
|
|
| 30 |
|
| 31 |
define( 'ATTACHMENTS_PREFIX', 'attachments_' );
|
| 32 |
define( 'ATTACHMENTS_VERSION', '1.6.2.1' );
|
|
@@ -42,31 +45,26 @@ global $wpdb;
|
|
| 42 |
|
| 43 |
// environment check
|
| 44 |
$wp_version = get_bloginfo( 'version' );
|
| 45 |
-
if( !version_compare( PHP_VERSION, '5.2', '>=' ) || !version_compare( $wp_version, '3.0', '>=' ) )
|
| 46 |
-
{
|
| 47 |
-
if( IS_ADMIN && ( !defined( 'DOING_AJAX' ) || !DOING_AJAX ) )
|
| 48 |
-
{
|
| 49 |
require_once ABSPATH.'/wp-admin/includes/plugin.php';
|
| 50 |
deactivate_plugins( __FILE__ );
|
| 51 |
wp_die( __('Attachments requires PHP 5.2 or higher, as does WordPress 3.2+. Attachments has been automatically deactivated.') );
|
| 52 |
-
}
|
| 53 |
-
else
|
| 54 |
-
{
|
| 55 |
return;
|
| 56 |
}
|
| 57 |
}
|
| 58 |
|
| 59 |
|
| 60 |
// we moved all attachments_get_attachments() functions to an external file in version 3.0
|
| 61 |
-
include_once 'get-attachments.php';
|
| 62 |
|
| 63 |
|
| 64 |
// =========
|
| 65 |
// = HOOKS =
|
| 66 |
// =========
|
| 67 |
|
| 68 |
-
if(
|
| 69 |
-
{
|
| 70 |
|
| 71 |
// pre-flight check
|
| 72 |
add_action( 'init', 'attachments_pre_init' );
|
|
@@ -93,20 +91,19 @@ if( IS_ADMIN )
|
|
| 93 |
}
|
| 94 |
|
| 95 |
|
| 96 |
-
function attachments_localization()
|
| 97 |
-
{
|
| 98 |
load_plugin_textdomain( 'attachments', false, ATTACHMENTS_DIR . '/languages/' );
|
| 99 |
}
|
| 100 |
|
| 101 |
|
| 102 |
|
| 103 |
-
function attachments_enqueues( $hook )
|
| 104 |
-
{
|
| 105 |
|
| 106 |
wp_enqueue_style( 'attachments', trailingslashit( ATTACHMENTS_URL ) . 'css/attachments.css' );
|
| 107 |
|
| 108 |
-
if( 'edit.php' != $hook && 'post.php' != $hook && 'post-new.php' != $hook )
|
| 109 |
return;
|
|
|
|
| 110 |
|
| 111 |
wp_enqueue_script( 'handlebars', trailingslashit( ATTACHMENTS_URL ) . 'js/handlebars.js', null, '1.0.beta.6', false );
|
| 112 |
wp_enqueue_script( 'attachments', trailingslashit( ATTACHMENTS_URL ) . 'js/attachments.js', array( 'handlebars', 'jquery', 'thickbox' ), ATTACHMENTS_VERSION, true );
|
|
@@ -121,11 +118,9 @@ function attachments_enqueues( $hook )
|
|
| 121 |
// = FUNCTIONS =
|
| 122 |
// =============
|
| 123 |
|
| 124 |
-
function attachments_pre_init()
|
| 125 |
-
{
|
| 126 |
// as of version 1.6 we'll be storing a proper settings array
|
| 127 |
-
if( !get_option( ATTACHMENTS_PREFIX . 'settings' ) )
|
| 128 |
-
{
|
| 129 |
$settings = array();
|
| 130 |
|
| 131 |
// we've got a version < 1.6 and therefore no real settings
|
|
@@ -133,13 +128,10 @@ function attachments_pre_init()
|
|
| 133 |
|
| 134 |
$post_parent = get_option( 'attachments_store_native' );
|
| 135 |
|
| 136 |
-
if( $post_parent === false )
|
| 137 |
-
{
|
| 138 |
// it wasn't set
|
| 139 |
$settings['post_parent'] = false;
|
| 140 |
-
}
|
| 141 |
-
else
|
| 142 |
-
{
|
| 143 |
$settings['post_parent'] = true;
|
| 144 |
}
|
| 145 |
|
|
@@ -159,19 +151,14 @@ function attachments_pre_init()
|
|
| 159 |
$post_types['page']->labels->name = 'Pages';
|
| 160 |
$post_types['page']->name = 'page';
|
| 161 |
|
| 162 |
-
if( count( $post_types ) )
|
| 163 |
-
|
| 164 |
-
foreach( $post_types as $post_type )
|
| 165 |
-
{
|
| 166 |
$post_parent = get_option( 'attachments_cpt_' . $post_type->name );
|
| 167 |
|
| 168 |
-
if( $post_parent === false )
|
| 169 |
-
{
|
| 170 |
// it wasn't set
|
| 171 |
$settings['post_types'][$post_type->name] = false;
|
| 172 |
-
}
|
| 173 |
-
else
|
| 174 |
-
{
|
| 175 |
$settings['post_types'][$post_type->name] = true;
|
| 176 |
}
|
| 177 |
}
|
|
@@ -183,8 +170,7 @@ function attachments_pre_init()
|
|
| 183 |
}
|
| 184 |
|
| 185 |
|
| 186 |
-
function attachments_register_settings()
|
| 187 |
-
{
|
| 188 |
// flag our settings
|
| 189 |
register_setting(
|
| 190 |
ATTACHMENTS_PREFIX . 'settings',
|
|
@@ -218,17 +204,15 @@ function attachments_register_settings()
|
|
| 218 |
);
|
| 219 |
}
|
| 220 |
|
| 221 |
-
function attachments_edit_options()
|
| 222 |
-
{ }
|
| 223 |
|
| 224 |
-
function attachments_validate_settings($input)
|
| 225 |
-
{
|
| 226 |
$input['version'] = ATTACHMENTS_VERSION;
|
|
|
|
| 227 |
return $input;
|
| 228 |
}
|
| 229 |
|
| 230 |
-
function attachments_edit_post_parent()
|
| 231 |
-
{
|
| 232 |
$settings = get_option( ATTACHMENTS_PREFIX . 'settings' );
|
| 233 |
?>
|
| 234 |
<div>
|
|
@@ -238,8 +222,7 @@ function attachments_edit_post_parent()
|
|
| 238 |
</div>
|
| 239 |
<?php }
|
| 240 |
|
| 241 |
-
function attachments_edit_post_types()
|
| 242 |
-
{
|
| 243 |
$settings = get_option( ATTACHMENTS_PREFIX . 'settings' );
|
| 244 |
$args = array(
|
| 245 |
'public' => true,
|
|
@@ -256,10 +239,10 @@ function attachments_edit_post_types()
|
|
| 256 |
$post_types['page']->labels->name = 'Pages';
|
| 257 |
$post_types['page']->name = 'page';
|
| 258 |
|
| 259 |
-
if( count( $post_types ) ) : foreach($post_types as $post_type) : ?>
|
| 260 |
<div>
|
| 261 |
<label for="<?php echo ATTACHMENTS_PREFIX; ?>settings[post_types][<?php echo $post_type->name; ?>]">
|
| 262 |
-
<input name="<?php echo ATTACHMENTS_PREFIX; ?>settings[post_types][<?php echo $post_type->name; ?>]" type="checkbox" id="<?php echo ATTACHMENTS_PREFIX; ?>settings[post_types][<?php echo $post_type->name; ?>]" value="1"<?php if( isset( $settings['post_types'][$post_type->name] ) && $settings['post_types'][$post_type->name] ) : ?> checked="checked"<?php endif; ?> /> <?php echo $post_type->labels->name; ?>
|
| 263 |
</label>
|
| 264 |
</div>
|
| 265 |
<?php endforeach; endif; ?>
|
|
@@ -272,9 +255,8 @@ function attachments_edit_post_types()
|
|
| 272 |
* @return void
|
| 273 |
* @author Jonathan Christopher
|
| 274 |
*/
|
| 275 |
-
function attachments_options()
|
| 276 |
-
|
| 277 |
-
include 'attachments.options.php';
|
| 278 |
}
|
| 279 |
|
| 280 |
|
|
@@ -284,8 +266,7 @@ function attachments_options()
|
|
| 284 |
* @return void
|
| 285 |
* @author Jonathan Christopher
|
| 286 |
*/
|
| 287 |
-
function attachments_menu()
|
| 288 |
-
{
|
| 289 |
add_options_page('Settings', 'Attachments', 'manage_options', __FILE__, 'attachments_options');
|
| 290 |
}
|
| 291 |
|
|
@@ -296,8 +277,7 @@ function attachments_menu()
|
|
| 296 |
* @return void
|
| 297 |
* @author Jonathan Christopher
|
| 298 |
*/
|
| 299 |
-
function attachments_add()
|
| 300 |
-
{ ?>
|
| 301 |
|
| 302 |
<div id="attachments-inner">
|
| 303 |
|
|
@@ -315,25 +295,20 @@ function attachments_add()
|
|
| 315 |
</ul>
|
| 316 |
|
| 317 |
<div id="attachments-list">
|
| 318 |
-
<input type="hidden" name="attachments_nonce" id="attachments_nonce" value="<?php echo wp_create_nonce( plugin_basename(__FILE__) ); ?>" />
|
| 319 |
<ul>
|
| 320 |
<?php
|
| 321 |
-
if( !empty($_GET['post']) )
|
| 322 |
-
{
|
| 323 |
// get all attachments
|
| 324 |
$existing_attachments = attachments_get_attachments( intval( $_GET['post'] ) );
|
| 325 |
|
| 326 |
-
if( is_array($existing_attachments) && !empty($existing_attachments) )
|
| 327 |
-
|
| 328 |
-
foreach ($existing_attachments as $attachment)
|
| 329 |
-
{
|
| 330 |
// TODO: Better handle this when examining Handlebars template
|
| 331 |
-
if( empty( $attachment['title'] ) )
|
| 332 |
-
{
|
| 333 |
$attachment['title'] = ' ';
|
| 334 |
}
|
| 335 |
-
if( empty( $attachment['caption'] ) )
|
| 336 |
-
{
|
| 337 |
$attachment['caption'] = ' ';
|
| 338 |
}
|
| 339 |
attachments_attachment_markup( $attachment['name'], $attachment['title'], $attachment['caption'], $attachment['id'], $attachment['order'] );
|
|
@@ -350,15 +325,20 @@ function attachments_add()
|
|
| 350 |
<?php }
|
| 351 |
|
| 352 |
|
| 353 |
-
function attachments_attachment_markup( $name = null, $title = null, $caption = null, $id = null, $order = null )
|
| 354 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 355 |
<li class="attachments-file">
|
| 356 |
<h2>
|
| 357 |
<a href="#" class="attachment-handle">
|
| 358 |
-
<span class="attachment-handle-icon"><img src="<?php echo WP_PLUGIN_URL; ?>/attachments/deprecated/images/handle.gif" alt="Drag" /></span>
|
| 359 |
</a>
|
| 360 |
-
<span class="attachment-name"><?php echo empty( $name ) ? '{{name}}' : $name; ?></span>
|
| 361 |
-
<span class="attachment-delete"><a href="#"><?php _e("Delete", "attachments")?></a></span>
|
| 362 |
</h2>
|
| 363 |
<div class="attachments-fields">
|
| 364 |
<div class="textfield" id="field_attachment_title_<?php echo empty( $id ) ? '{{id}}' : $id; ?>">
|
|
@@ -395,11 +375,9 @@ function attachments_attachment_markup( $name = null, $title = null, $caption =
|
|
| 395 |
* @return void
|
| 396 |
* @author Jonathan Christopher
|
| 397 |
*/
|
| 398 |
-
function attachments_meta_box()
|
| 399 |
-
{
|
| 400 |
// for custom post types
|
| 401 |
-
if( function_exists( 'get_post_types' ) )
|
| 402 |
-
{
|
| 403 |
$settings = get_option( ATTACHMENTS_PREFIX . 'settings' );
|
| 404 |
|
| 405 |
$args = array(
|
|
@@ -410,10 +388,8 @@ function attachments_meta_box()
|
|
| 410 |
$operator = 'and';
|
| 411 |
$post_types = get_post_types( $args, $output, $operator );
|
| 412 |
|
| 413 |
-
foreach($post_types as $post_type)
|
| 414 |
-
|
| 415 |
-
if( isset( $settings['post_types'][$post_type->name] ) && $settings['post_types'][$post_type->name] )
|
| 416 |
-
{
|
| 417 |
add_meta_box( 'attachments_list', __( 'Attachments', 'attachments' ), 'attachments_add', $post_type->name, 'normal' );
|
| 418 |
}
|
| 419 |
}
|
|
@@ -430,7 +406,7 @@ function attachments_meta_box()
|
|
| 430 |
function attachments_init_js()
|
| 431 |
{
|
| 432 |
echo '<script type="text/javascript" charset="utf-8">';
|
| 433 |
-
echo ' var attachments_base = "' . WP_PLUGIN_URL . '/attachments"; ';
|
| 434 |
echo ' var attachments_media = ""; ';
|
| 435 |
echo '</script>';
|
| 436 |
}
|
|
@@ -444,39 +420,30 @@ function attachments_init_js()
|
|
| 444 |
* @author Jonathan Christopher
|
| 445 |
* @author JR Tashjian
|
| 446 |
*/
|
| 447 |
-
function attachments_save($post_id)
|
| 448 |
-
{
|
| 449 |
// verify this came from the our screen and with proper authorization,
|
| 450 |
// because save_post can be triggered at other times
|
| 451 |
-
if( !isset( $_POST['attachments_nonce'] ) )
|
| 452 |
-
{
|
| 453 |
return $post_id;
|
| 454 |
}
|
| 455 |
|
| 456 |
-
if( !wp_verify_nonce( $_POST['attachments_nonce'], plugin_basename(__FILE__) ) )
|
| 457 |
-
{
|
| 458 |
return $post_id;
|
| 459 |
}
|
| 460 |
|
| 461 |
// verify if this is an auto save routine. If it is our form has not been submitted, so we dont want
|
| 462 |
// to do anything
|
| 463 |
-
if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
|
| 464 |
-
{
|
| 465 |
return $post_id;
|
| 466 |
}
|
| 467 |
|
| 468 |
// Check permissions
|
| 469 |
-
if( 'page' == $_POST['post_type'] )
|
| 470 |
-
|
| 471 |
-
if( !current_user_can( 'edit_page', $post_id ) )
|
| 472 |
-
{
|
| 473 |
return $post_id;
|
| 474 |
}
|
| 475 |
-
}
|
| 476 |
-
|
| 477 |
-
{
|
| 478 |
-
if( !current_user_can( 'edit_post', $post_id ) )
|
| 479 |
-
{
|
| 480 |
return $post_id;
|
| 481 |
}
|
| 482 |
}
|
|
@@ -492,25 +459,19 @@ function attachments_save($post_id)
|
|
| 492 |
$attachment_ids = array();
|
| 493 |
|
| 494 |
// We'll build our array of attachments
|
| 495 |
-
foreach( $_POST as $key => $data )
|
| 496 |
-
{
|
| 497 |
// Arbitrarily using the id
|
| 498 |
-
if( substr($key, 0, 14) == 'attachment_id_' )
|
| 499 |
-
{
|
| 500 |
array_push( $attachment_ids, substr( $key, 14, strlen( $key ) ) );
|
| 501 |
}
|
| 502 |
|
| 503 |
}
|
| 504 |
|
| 505 |
// If we have attachments, there's work to do
|
| 506 |
-
if( !empty( $attachment_ids ) )
|
| 507 |
-
|
| 508 |
-
|
| 509 |
-
|
| 510 |
-
{
|
| 511 |
-
if( !empty( $_POST['attachment_id_' . $i] ) )
|
| 512 |
-
{
|
| 513 |
-
$attachment_id = intval( $_POST['attachment_id_' . $i] );
|
| 514 |
|
| 515 |
$attachment_details = array(
|
| 516 |
'id' => $attachment_id,
|
|
@@ -527,13 +488,11 @@ function attachments_save($post_id)
|
|
| 527 |
|
| 528 |
// save native Attach
|
| 529 |
$settings = get_option( ATTACHMENTS_PREFIX . 'settings' );
|
| 530 |
-
if( isset( $settings['post_parent'] ) && $settings['post_parent'] )
|
| 531 |
-
{
|
| 532 |
// need to first check to make sure we're not overwriting a native Attach
|
| 533 |
$attach_post_ref = get_post( $attachment_id );
|
| 534 |
|
| 535 |
-
if( $attach_post_ref->post_parent == 0 )
|
| 536 |
-
{
|
| 537 |
// no current Attach, we can add ours
|
| 538 |
$attach_post = array();
|
| 539 |
$attach_post['ID'] = $attachment_id;
|
|
@@ -548,4 +507,4 @@ function attachments_save($post_id)
|
|
| 548 |
|
| 549 |
}
|
| 550 |
|
| 551 |
-
}
|
| 21 |
*/
|
| 22 |
|
| 23 |
// Exit if accessed directly
|
| 24 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
| 25 |
+
exit;
|
| 26 |
+
}
|
| 27 |
|
| 28 |
|
| 29 |
// constant definition
|
| 30 |
+
if ( ! defined( 'IS_ADMIN' ) ) {
|
| 31 |
define( 'IS_ADMIN', is_admin() );
|
| 32 |
+
}
|
| 33 |
|
| 34 |
define( 'ATTACHMENTS_PREFIX', 'attachments_' );
|
| 35 |
define( 'ATTACHMENTS_VERSION', '1.6.2.1' );
|
| 45 |
|
| 46 |
// environment check
|
| 47 |
$wp_version = get_bloginfo( 'version' );
|
| 48 |
+
if ( ! version_compare( PHP_VERSION, '5.2', '>=' ) || !version_compare( $wp_version, '3.0', '>=' ) ) {
|
| 49 |
+
if ( IS_ADMIN && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
|
|
|
|
|
|
|
| 50 |
require_once ABSPATH.'/wp-admin/includes/plugin.php';
|
| 51 |
deactivate_plugins( __FILE__ );
|
| 52 |
wp_die( __('Attachments requires PHP 5.2 or higher, as does WordPress 3.2+. Attachments has been automatically deactivated.') );
|
| 53 |
+
} else {
|
|
|
|
|
|
|
| 54 |
return;
|
| 55 |
}
|
| 56 |
}
|
| 57 |
|
| 58 |
|
| 59 |
// we moved all attachments_get_attachments() functions to an external file in version 3.0
|
| 60 |
+
include_once dirname( __FILE__ ) . '/get-attachments.php';
|
| 61 |
|
| 62 |
|
| 63 |
// =========
|
| 64 |
// = HOOKS =
|
| 65 |
// =========
|
| 66 |
|
| 67 |
+
if ( is_admin() ) {
|
|
|
|
| 68 |
|
| 69 |
// pre-flight check
|
| 70 |
add_action( 'init', 'attachments_pre_init' );
|
| 91 |
}
|
| 92 |
|
| 93 |
|
| 94 |
+
function attachments_localization() {
|
|
|
|
| 95 |
load_plugin_textdomain( 'attachments', false, ATTACHMENTS_DIR . '/languages/' );
|
| 96 |
}
|
| 97 |
|
| 98 |
|
| 99 |
|
| 100 |
+
function attachments_enqueues( $hook ) {
|
|
|
|
| 101 |
|
| 102 |
wp_enqueue_style( 'attachments', trailingslashit( ATTACHMENTS_URL ) . 'css/attachments.css' );
|
| 103 |
|
| 104 |
+
if ( 'edit.php' != $hook && 'post.php' != $hook && 'post-new.php' != $hook ) {
|
| 105 |
return;
|
| 106 |
+
}
|
| 107 |
|
| 108 |
wp_enqueue_script( 'handlebars', trailingslashit( ATTACHMENTS_URL ) . 'js/handlebars.js', null, '1.0.beta.6', false );
|
| 109 |
wp_enqueue_script( 'attachments', trailingslashit( ATTACHMENTS_URL ) . 'js/attachments.js', array( 'handlebars', 'jquery', 'thickbox' ), ATTACHMENTS_VERSION, true );
|
| 118 |
// = FUNCTIONS =
|
| 119 |
// =============
|
| 120 |
|
| 121 |
+
function attachments_pre_init() {
|
|
|
|
| 122 |
// as of version 1.6 we'll be storing a proper settings array
|
| 123 |
+
if ( ! get_option( ATTACHMENTS_PREFIX . 'settings' ) ) {
|
|
|
|
| 124 |
$settings = array();
|
| 125 |
|
| 126 |
// we've got a version < 1.6 and therefore no real settings
|
| 128 |
|
| 129 |
$post_parent = get_option( 'attachments_store_native' );
|
| 130 |
|
| 131 |
+
if( $post_parent === false ) {
|
|
|
|
| 132 |
// it wasn't set
|
| 133 |
$settings['post_parent'] = false;
|
| 134 |
+
} else {
|
|
|
|
|
|
|
| 135 |
$settings['post_parent'] = true;
|
| 136 |
}
|
| 137 |
|
| 151 |
$post_types['page']->labels->name = 'Pages';
|
| 152 |
$post_types['page']->name = 'page';
|
| 153 |
|
| 154 |
+
if ( count( $post_types ) ) {
|
| 155 |
+
foreach( $post_types as $post_type ) {
|
|
|
|
|
|
|
| 156 |
$post_parent = get_option( 'attachments_cpt_' . $post_type->name );
|
| 157 |
|
| 158 |
+
if( $post_parent === false ) {
|
|
|
|
| 159 |
// it wasn't set
|
| 160 |
$settings['post_types'][$post_type->name] = false;
|
| 161 |
+
} else {
|
|
|
|
|
|
|
| 162 |
$settings['post_types'][$post_type->name] = true;
|
| 163 |
}
|
| 164 |
}
|
| 170 |
}
|
| 171 |
|
| 172 |
|
| 173 |
+
function attachments_register_settings() {
|
|
|
|
| 174 |
// flag our settings
|
| 175 |
register_setting(
|
| 176 |
ATTACHMENTS_PREFIX . 'settings',
|
| 204 |
);
|
| 205 |
}
|
| 206 |
|
| 207 |
+
function attachments_edit_options() {}
|
|
|
|
| 208 |
|
| 209 |
+
function attachments_validate_settings($input) {
|
|
|
|
| 210 |
$input['version'] = ATTACHMENTS_VERSION;
|
| 211 |
+
|
| 212 |
return $input;
|
| 213 |
}
|
| 214 |
|
| 215 |
+
function attachments_edit_post_parent() {
|
|
|
|
| 216 |
$settings = get_option( ATTACHMENTS_PREFIX . 'settings' );
|
| 217 |
?>
|
| 218 |
<div>
|
| 222 |
</div>
|
| 223 |
<?php }
|
| 224 |
|
| 225 |
+
function attachments_edit_post_types() {
|
|
|
|
| 226 |
$settings = get_option( ATTACHMENTS_PREFIX . 'settings' );
|
| 227 |
$args = array(
|
| 228 |
'public' => true,
|
| 239 |
$post_types['page']->labels->name = 'Pages';
|
| 240 |
$post_types['page']->name = 'page';
|
| 241 |
|
| 242 |
+
if ( count( $post_types ) ) : foreach( $post_types as $post_type ) : ?>
|
| 243 |
<div>
|
| 244 |
<label for="<?php echo ATTACHMENTS_PREFIX; ?>settings[post_types][<?php echo $post_type->name; ?>]">
|
| 245 |
+
<input name="<?php echo ATTACHMENTS_PREFIX; ?>settings[post_types][<?php echo $post_type->name; ?>]" type="checkbox" id="<?php echo ATTACHMENTS_PREFIX; ?>settings[post_types][<?php echo $post_type->name; ?>]" value="1"<?php if( isset( $settings['post_types'][$post_type->name] ) && $settings['post_types'][$post_type->name] ) : ?> checked="checked"<?php endif; ?> /> <?php echo esc_html( $post_type->labels->name ); ?>
|
| 246 |
</label>
|
| 247 |
</div>
|
| 248 |
<?php endforeach; endif; ?>
|
| 255 |
* @return void
|
| 256 |
* @author Jonathan Christopher
|
| 257 |
*/
|
| 258 |
+
function attachments_options() {
|
| 259 |
+
include dirname( __FILE__ ) . '/attachments.options.php';
|
|
|
|
| 260 |
}
|
| 261 |
|
| 262 |
|
| 266 |
* @return void
|
| 267 |
* @author Jonathan Christopher
|
| 268 |
*/
|
| 269 |
+
function attachments_menu() {
|
|
|
|
| 270 |
add_options_page('Settings', 'Attachments', 'manage_options', __FILE__, 'attachments_options');
|
| 271 |
}
|
| 272 |
|
| 277 |
* @return void
|
| 278 |
* @author Jonathan Christopher
|
| 279 |
*/
|
| 280 |
+
function attachments_add() { ?>
|
|
|
|
| 281 |
|
| 282 |
<div id="attachments-inner">
|
| 283 |
|
| 295 |
</ul>
|
| 296 |
|
| 297 |
<div id="attachments-list">
|
| 298 |
+
<input type="hidden" name="attachments_nonce" id="attachments_nonce" value="<?php echo esc_attr( wp_create_nonce( plugin_basename(__FILE__) ) ); ?>" />
|
| 299 |
<ul>
|
| 300 |
<?php
|
| 301 |
+
if ( ! empty( $_GET['post'] ) ) {
|
|
|
|
| 302 |
// get all attachments
|
| 303 |
$existing_attachments = attachments_get_attachments( intval( $_GET['post'] ) );
|
| 304 |
|
| 305 |
+
if ( is_array( $existing_attachments ) && ! empty( $existing_attachments ) ) {
|
| 306 |
+
foreach ( $existing_attachments as $attachment ) {
|
|
|
|
|
|
|
| 307 |
// TODO: Better handle this when examining Handlebars template
|
| 308 |
+
if ( empty( $attachment['title'] ) ) {
|
|
|
|
| 309 |
$attachment['title'] = ' ';
|
| 310 |
}
|
| 311 |
+
if ( empty( $attachment['caption'] ) ) {
|
|
|
|
| 312 |
$attachment['caption'] = ' ';
|
| 313 |
}
|
| 314 |
attachments_attachment_markup( $attachment['name'], $attachment['title'], $attachment['caption'], $attachment['id'], $attachment['order'] );
|
| 325 |
<?php }
|
| 326 |
|
| 327 |
|
| 328 |
+
function attachments_attachment_markup( $name = null, $title = null, $caption = null, $id = null, $order = null ) { ?>
|
| 329 |
+
<?php
|
| 330 |
+
$name = esc_attr( $name );
|
| 331 |
+
$title = esc_attr( $title );
|
| 332 |
+
$id = esc_attr( $id );
|
| 333 |
+
$order = absint( $order );
|
| 334 |
+
?>
|
| 335 |
<li class="attachments-file">
|
| 336 |
<h2>
|
| 337 |
<a href="#" class="attachment-handle">
|
| 338 |
+
<span class="attachment-handle-icon"><img src="<?php echo esc_url( WP_PLUGIN_URL ); ?>/attachments/deprecated/images/handle.gif" alt="Drag" /></span>
|
| 339 |
</a>
|
| 340 |
+
<span class="attachment-name"><?php echo empty( $name ) ? '{{name}}' : esc_html( $name ); ?></span>
|
| 341 |
+
<span class="attachment-delete"><a href="#"><?php _e( "Delete", "attachments" )?></a></span>
|
| 342 |
</h2>
|
| 343 |
<div class="attachments-fields">
|
| 344 |
<div class="textfield" id="field_attachment_title_<?php echo empty( $id ) ? '{{id}}' : $id; ?>">
|
| 375 |
* @return void
|
| 376 |
* @author Jonathan Christopher
|
| 377 |
*/
|
| 378 |
+
function attachments_meta_box() {
|
|
|
|
| 379 |
// for custom post types
|
| 380 |
+
if ( function_exists( 'get_post_types' ) ) {
|
|
|
|
| 381 |
$settings = get_option( ATTACHMENTS_PREFIX . 'settings' );
|
| 382 |
|
| 383 |
$args = array(
|
| 388 |
$operator = 'and';
|
| 389 |
$post_types = get_post_types( $args, $output, $operator );
|
| 390 |
|
| 391 |
+
foreach( $post_types as $post_type ) {
|
| 392 |
+
if ( isset( $settings['post_types'][$post_type->name] ) && $settings['post_types'][ $post_type->name ] ) {
|
|
|
|
|
|
|
| 393 |
add_meta_box( 'attachments_list', __( 'Attachments', 'attachments' ), 'attachments_add', $post_type->name, 'normal' );
|
| 394 |
}
|
| 395 |
}
|
| 406 |
function attachments_init_js()
|
| 407 |
{
|
| 408 |
echo '<script type="text/javascript" charset="utf-8">';
|
| 409 |
+
echo ' var attachments_base = "' . esc_url( WP_PLUGIN_URL ) . '/attachments"; ';
|
| 410 |
echo ' var attachments_media = ""; ';
|
| 411 |
echo '</script>';
|
| 412 |
}
|
| 420 |
* @author Jonathan Christopher
|
| 421 |
* @author JR Tashjian
|
| 422 |
*/
|
| 423 |
+
function attachments_save($post_id) {
|
|
|
|
| 424 |
// verify this came from the our screen and with proper authorization,
|
| 425 |
// because save_post can be triggered at other times
|
| 426 |
+
if ( ! isset( $_POST['attachments_nonce'] ) ) {
|
|
|
|
| 427 |
return $post_id;
|
| 428 |
}
|
| 429 |
|
| 430 |
+
if ( ! wp_verify_nonce( $_POST['attachments_nonce'], plugin_basename(__FILE__) ) ) {
|
|
|
|
| 431 |
return $post_id;
|
| 432 |
}
|
| 433 |
|
| 434 |
// verify if this is an auto save routine. If it is our form has not been submitted, so we dont want
|
| 435 |
// to do anything
|
| 436 |
+
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
|
|
|
|
| 437 |
return $post_id;
|
| 438 |
}
|
| 439 |
|
| 440 |
// Check permissions
|
| 441 |
+
if ( 'page' == $_POST['post_type'] ) {
|
| 442 |
+
if ( ! current_user_can( 'edit_page', $post_id ) ) {
|
|
|
|
|
|
|
| 443 |
return $post_id;
|
| 444 |
}
|
| 445 |
+
} else {
|
| 446 |
+
if ( ! current_user_can( 'edit_post', $post_id ) ) {
|
|
|
|
|
|
|
|
|
|
| 447 |
return $post_id;
|
| 448 |
}
|
| 449 |
}
|
| 459 |
$attachment_ids = array();
|
| 460 |
|
| 461 |
// We'll build our array of attachments
|
| 462 |
+
foreach ( $_POST as $key => $data ) {
|
|
|
|
| 463 |
// Arbitrarily using the id
|
| 464 |
+
if( substr($key, 0, 14) == 'attachment_id_' ) {
|
|
|
|
| 465 |
array_push( $attachment_ids, substr( $key, 14, strlen( $key ) ) );
|
| 466 |
}
|
| 467 |
|
| 468 |
}
|
| 469 |
|
| 470 |
// If we have attachments, there's work to do
|
| 471 |
+
if ( !empty( $attachment_ids ) ) {
|
| 472 |
+
foreach ( $attachment_ids as $i ) {
|
| 473 |
+
if ( ! empty( $_POST['attachment_id_' . $i] ) ) {
|
| 474 |
+
$attachment_id = intval( $_POST['attachment_id_' . $i] );
|
|
|
|
|
|
|
|
|
|
|
|
|
| 475 |
|
| 476 |
$attachment_details = array(
|
| 477 |
'id' => $attachment_id,
|
| 488 |
|
| 489 |
// save native Attach
|
| 490 |
$settings = get_option( ATTACHMENTS_PREFIX . 'settings' );
|
| 491 |
+
if ( isset( $settings['post_parent'] ) && $settings['post_parent'] ) {
|
|
|
|
| 492 |
// need to first check to make sure we're not overwriting a native Attach
|
| 493 |
$attach_post_ref = get_post( $attachment_id );
|
| 494 |
|
| 495 |
+
if ( $attach_post_ref->post_parent == 0 ) {
|
|
|
|
| 496 |
// no current Attach, we can add ours
|
| 497 |
$attach_post = array();
|
| 498 |
$attach_post['ID'] = $attachment_id;
|
| 507 |
|
| 508 |
}
|
| 509 |
|
| 510 |
+
}
|
deprecated/get-attachments.php
CHANGED
|
@@ -1,7 +1,9 @@
|
|
| 1 |
<?php
|
| 2 |
|
| 3 |
// Exit if accessed directly
|
| 4 |
-
if( !defined( 'ABSPATH' ) )
|
|
|
|
|
|
|
| 5 |
|
| 6 |
/**
|
| 7 |
* Compares two array values with the same key "order"
|
|
@@ -11,21 +13,15 @@ if( !defined( 'ABSPATH' ) ) exit;
|
|
| 11 |
* @return int
|
| 12 |
* @author Jonathan Christopher
|
| 13 |
*/
|
| 14 |
-
function attachments_cmp($a, $b)
|
| 15 |
-
{
|
| 16 |
$a = intval( $a['order'] );
|
| 17 |
$b = intval( $b['order'] );
|
| 18 |
|
| 19 |
-
if( $a < $b )
|
| 20 |
-
{
|
| 21 |
return -1;
|
| 22 |
-
}
|
| 23 |
-
else if( $a > $b )
|
| 24 |
-
{
|
| 25 |
return 1;
|
| 26 |
-
}
|
| 27 |
-
else
|
| 28 |
-
{
|
| 29 |
return 0;
|
| 30 |
}
|
| 31 |
}
|
|
@@ -41,10 +37,10 @@ function attachments_cmp($a, $b)
|
|
| 41 |
function attachments_get_filesize_formatted( $path = NULL )
|
| 42 |
{
|
| 43 |
$formatted = '0 bytes';
|
| 44 |
-
if( file_exists( $path ) )
|
| 45 |
-
{
|
| 46 |
$formatted = size_format( @filesize( $path ) );
|
| 47 |
}
|
|
|
|
| 48 |
return $formatted;
|
| 49 |
}
|
| 50 |
|
|
@@ -58,27 +54,22 @@ function attachments_get_filesize_formatted( $path = NULL )
|
|
| 58 |
* @author JR Tashjian
|
| 59 |
*/
|
| 60 |
|
| 61 |
-
function attachments_get_attachments( $post_id=null )
|
| 62 |
-
{
|
| 63 |
global $post;
|
| 64 |
|
| 65 |
-
if( $post_id==null )
|
| 66 |
-
{
|
| 67 |
$post_id = $post->ID;
|
| 68 |
}
|
| 69 |
|
| 70 |
// get all attachments
|
| 71 |
-
$existing_attachments = get_post_meta( $post_id, '_attachments', false );
|
| 72 |
|
| 73 |
// We can now proceed as normal, all legacy data should now be upgraded
|
| 74 |
|
| 75 |
$post_attachments = array();
|
| 76 |
|
| 77 |
-
if( is_array( $existing_attachments ) && count( $existing_attachments ) > 0 )
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
foreach ($existing_attachments as $attachment)
|
| 81 |
-
{
|
| 82 |
// decode and unserialize the data
|
| 83 |
$data = unserialize( base64_decode( $attachment ) );
|
| 84 |
|
|
@@ -95,11 +86,10 @@ function attachments_get_attachments( $post_id=null )
|
|
| 95 |
}
|
| 96 |
|
| 97 |
// sort attachments
|
| 98 |
-
if( count( $post_attachments ) > 1 )
|
| 99 |
-
{
|
| 100 |
usort( $post_attachments, "attachments_cmp" );
|
| 101 |
}
|
| 102 |
}
|
| 103 |
|
| 104 |
return $post_attachments;
|
| 105 |
-
}
|
| 1 |
<?php
|
| 2 |
|
| 3 |
// Exit if accessed directly
|
| 4 |
+
if ( !defined( 'ABSPATH' ) ) {
|
| 5 |
+
exit;
|
| 6 |
+
}
|
| 7 |
|
| 8 |
/**
|
| 9 |
* Compares two array values with the same key "order"
|
| 13 |
* @return int
|
| 14 |
* @author Jonathan Christopher
|
| 15 |
*/
|
| 16 |
+
function attachments_cmp($a, $b) {
|
|
|
|
| 17 |
$a = intval( $a['order'] );
|
| 18 |
$b = intval( $b['order'] );
|
| 19 |
|
| 20 |
+
if ( $a < $b ) {
|
|
|
|
| 21 |
return -1;
|
| 22 |
+
} else if( $a > $b ) {
|
|
|
|
|
|
|
| 23 |
return 1;
|
| 24 |
+
} else {
|
|
|
|
|
|
|
| 25 |
return 0;
|
| 26 |
}
|
| 27 |
}
|
| 37 |
function attachments_get_filesize_formatted( $path = NULL )
|
| 38 |
{
|
| 39 |
$formatted = '0 bytes';
|
| 40 |
+
if ( file_exists( $path ) ) {
|
|
|
|
| 41 |
$formatted = size_format( @filesize( $path ) );
|
| 42 |
}
|
| 43 |
+
|
| 44 |
return $formatted;
|
| 45 |
}
|
| 46 |
|
| 54 |
* @author JR Tashjian
|
| 55 |
*/
|
| 56 |
|
| 57 |
+
function attachments_get_attachments( $post_id = null ) {
|
|
|
|
| 58 |
global $post;
|
| 59 |
|
| 60 |
+
if ( $post_id == null ) {
|
|
|
|
| 61 |
$post_id = $post->ID;
|
| 62 |
}
|
| 63 |
|
| 64 |
// get all attachments
|
| 65 |
+
$existing_attachments = get_post_meta( absint( $post_id ), '_attachments', false );
|
| 66 |
|
| 67 |
// We can now proceed as normal, all legacy data should now be upgraded
|
| 68 |
|
| 69 |
$post_attachments = array();
|
| 70 |
|
| 71 |
+
if ( is_array( $existing_attachments ) && count( $existing_attachments ) > 0 ) {
|
| 72 |
+
foreach ( $existing_attachments as $attachment ) {
|
|
|
|
|
|
|
|
|
|
| 73 |
// decode and unserialize the data
|
| 74 |
$data = unserialize( base64_decode( $attachment ) );
|
| 75 |
|
| 86 |
}
|
| 87 |
|
| 88 |
// sort attachments
|
| 89 |
+
if ( count( $post_attachments ) > 1 ) {
|
|
|
|
| 90 |
usort( $post_attachments, "attachments_cmp" );
|
| 91 |
}
|
| 92 |
}
|
| 93 |
|
| 94 |
return $post_attachments;
|
| 95 |
+
}
|
deprecated/index.php
CHANGED
|
@@ -1 +1,3 @@
|
|
| 1 |
-
<?php
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
// silence is golden
|
deprecated/js/index.php
CHANGED
|
@@ -1 +1,3 @@
|
|
| 1 |
<?php
|
|
|
|
|
|
| 1 |
<?php
|
| 2 |
+
|
| 3 |
+
// silence is golden
|
index.php
CHANGED
|
@@ -6,7 +6,7 @@
|
|
| 6 |
* Description: Attachments gives the ability to append any number of Media Library items to Pages, Posts, and Custom Post Types
|
| 7 |
* Author: Jonathan Christopher
|
| 8 |
* Author URI: http://mondaybynoon.com/
|
| 9 |
-
* Version: 3.5.
|
| 10 |
* Text Domain: attachments
|
| 11 |
* Domain Path: /languages/
|
| 12 |
* License: GPLv2 or later
|
|
@@ -14,34 +14,17 @@
|
|
| 14 |
*/
|
| 15 |
|
| 16 |
// Exit if accessed directly
|
| 17 |
-
if( !defined( 'ABSPATH' ) )
|
| 18 |
-
|
| 19 |
-
// Store whether or not we're in the admin
|
| 20 |
-
if( !defined( 'IS_ADMIN' ) ) define( 'IS_ADMIN', is_admin() );
|
| 21 |
-
|
| 22 |
-
// Environment check
|
| 23 |
-
$wp_version = get_bloginfo( 'version' );
|
| 24 |
-
|
| 25 |
-
if( !version_compare( PHP_VERSION, '5.2', '>=' ) && IS_ADMIN && ( !defined( 'DOING_AJAX' ) || !DOING_AJAX ) )
|
| 26 |
-
{
|
| 27 |
-
// failed PHP requirement
|
| 28 |
-
require_once ABSPATH . '/wp-admin/includes/plugin.php';
|
| 29 |
-
deactivate_plugins( __FILE__ );
|
| 30 |
-
wp_die( esc_attr( __( 'Attachments requires PHP 5.2+. Attachments has been automatically deactivated.' ) ) );
|
| 31 |
}
|
| 32 |
-
else
|
| 33 |
-
{
|
| 34 |
-
if( ( defined( 'ATTACHMENTS_LEGACY' ) && ATTACHMENTS_LEGACY === true ) || version_compare( $wp_version, '3.5', '<' ) )
|
| 35 |
-
{
|
| 36 |
-
// load deprecated version of Attachments
|
| 37 |
-
require_once 'deprecated/attachments.php';
|
| 38 |
-
}
|
| 39 |
-
else
|
| 40 |
-
{
|
| 41 |
-
define( 'ATTACHMENTS_DIR', plugin_dir_path( __FILE__ ) );
|
| 42 |
-
define( 'ATTACHMENTS_URL', plugin_dir_url( __FILE__ ) );
|
| 43 |
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
}
|
| 6 |
* Description: Attachments gives the ability to append any number of Media Library items to Pages, Posts, and Custom Post Types
|
| 7 |
* Author: Jonathan Christopher
|
| 8 |
* Author URI: http://mondaybynoon.com/
|
| 9 |
+
* Version: 3.5.5
|
| 10 |
* Text Domain: attachments
|
| 11 |
* Domain Path: /languages/
|
| 12 |
* License: GPLv2 or later
|
| 14 |
*/
|
| 15 |
|
| 16 |
// Exit if accessed directly
|
| 17 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
| 18 |
+
exit;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
+
if( ( defined( 'ATTACHMENTS_LEGACY' ) && ATTACHMENTS_LEGACY === true ) || version_compare( $wp_version, '3.5', '<' ) ) {
|
| 22 |
+
// load deprecated version of Attachments
|
| 23 |
+
require_once dirname( __FILE__ ) . '/deprecated/attachments.php';
|
| 24 |
+
} else {
|
| 25 |
+
define( 'ATTACHMENTS_DIR', plugin_dir_path( __FILE__ ) );
|
| 26 |
+
define( 'ATTACHMENTS_URL', plugin_dir_url( __FILE__ ) );
|
| 27 |
+
|
| 28 |
+
// load current version of Attachments
|
| 29 |
+
require_once dirname( __FILE__ ) . '/classes/class.attachments.php';
|
| 30 |
}
|
readme.txt
CHANGED
|
@@ -3,8 +3,8 @@ Contributors: jchristopher
|
|
| 3 |
Donate link: http://mondaybynoon.com/donate/
|
| 4 |
Tags: post, page, posts, pages, images, PDF, doc, Word, image, jpg, jpeg, picture, pictures, photos, attachment
|
| 5 |
Requires at least: 3.0
|
| 6 |
-
Tested up to:
|
| 7 |
-
Stable tag: 3.5.
|
| 8 |
License: GPLv2 or later
|
| 9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 10 |
|
|
@@ -91,6 +91,9 @@ Please see [Issues on GitHub](https://github.com/jchristopher/attachments/issues
|
|
| 91 |
|
| 92 |
Please see [Attachments' changelog on GitHub](https://github.com/jchristopher/attachments/docs/changelog.md)
|
| 93 |
|
|
|
|
|
|
|
|
|
|
| 94 |
= 3.5.4 =
|
| 95 |
* Fixed assumption of field keys (props bukka)
|
| 96 |
* Improved documentation (props Lane Goldberg, Roman Kokarev, Ore Landau)
|
| 3 |
Donate link: http://mondaybynoon.com/donate/
|
| 4 |
Tags: post, page, posts, pages, images, PDF, doc, Word, image, jpg, jpeg, picture, pictures, photos, attachment
|
| 5 |
Requires at least: 3.0
|
| 6 |
+
Tested up to: 4.2
|
| 7 |
+
Stable tag: 3.5.5
|
| 8 |
License: GPLv2 or later
|
| 9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 10 |
|
| 91 |
|
| 92 |
Please see [Attachments' changelog on GitHub](https://github.com/jchristopher/attachments/docs/changelog.md)
|
| 93 |
|
| 94 |
+
= 3.5.5 =
|
| 95 |
+
* Fixed an issue where field values were improperly overwritten when the instance was set to prepend in some cases
|
| 96 |
+
|
| 97 |
= 3.5.4 =
|
| 98 |
* Fixed assumption of field keys (props bukka)
|
| 99 |
* Improved documentation (props Lane Goldberg, Roman Kokarev, Ore Landau)
|
views/options.php
CHANGED
|
@@ -7,19 +7,19 @@
|
|
| 7 |
include_once( ATTACHMENTS_DIR . '/classes/class.attachments.legacy.php' );
|
| 8 |
$legacy = new AttachmentsLegacyHandler();
|
| 9 |
|
| 10 |
-
if( isset( $_GET['dismiss'] ) )
|
| 11 |
-
|
| 12 |
-
if( !wp_verify_nonce( $_GET['nonce'], 'attachments-dismiss') )
|
| 13 |
wp_die( __( 'Invalid request', 'attachments' ) );
|
|
|
|
| 14 |
|
| 15 |
// set our flag that the user wants to ignore the migration message
|
| 16 |
add_option( 'attachments_ignore_migration', true, '', 'no' );
|
| 17 |
}
|
| 18 |
|
| 19 |
-
if( isset( $_GET['dismiss-pro'] ) )
|
| 20 |
-
|
| 21 |
-
if( !wp_verify_nonce( $_GET['nonce'], 'attachments-pro-dismiss') )
|
| 22 |
wp_die( __( 'Invalid request', 'attachments' ) );
|
|
|
|
| 23 |
|
| 24 |
// set our flag that the user wants to ignore the migration message
|
| 25 |
add_option( 'attachments_pro_ignore_migration', true, '', 'no' );
|
|
@@ -32,7 +32,7 @@
|
|
| 32 |
|
| 33 |
<h2><?php _e( 'Attachments', 'attachments' ); ?></h2>
|
| 34 |
|
| 35 |
-
<?php if( isset( $_GET['overview'] ) ) : ?>
|
| 36 |
|
| 37 |
<div class="message updated" id="message">
|
| 38 |
<p><?php _e( "<strong>Attachments has changed significantly since it's last update.</strong> These changes <em>will affect your themes and plugins</em>.", 'attachments' ); ?></p>
|
|
@@ -74,10 +74,8 @@
|
|
| 74 |
|
| 75 |
<?php
|
| 76 |
// check to see if we're migrating
|
| 77 |
-
if( isset( $_GET['migrate'] ) )
|
| 78 |
-
|
| 79 |
-
switch( intval( $_GET['migrate'] ) )
|
| 80 |
-
{
|
| 81 |
case 1:
|
| 82 |
$migrator->prepare_migration();
|
| 83 |
break;
|
|
@@ -86,11 +84,8 @@
|
|
| 86 |
$migrator->init_migration();
|
| 87 |
break;
|
| 88 |
}
|
| 89 |
-
}
|
| 90 |
-
|
| 91 |
-
{
|
| 92 |
-
switch( intval( $_GET['migrate-pro'] ) )
|
| 93 |
-
{
|
| 94 |
case 1:
|
| 95 |
$migrator->prepare_pro_migration();
|
| 96 |
break;
|
|
@@ -99,15 +94,13 @@
|
|
| 99 |
$migrator->init_pro_migration();
|
| 100 |
break;
|
| 101 |
}
|
| 102 |
-
}
|
| 103 |
-
else
|
| 104 |
-
{ ?>
|
| 105 |
|
| 106 |
-
<?php if( false == get_option( 'attachments_migrated' ) && $legacy->legacy ) : ?>
|
| 107 |
<h2><?php _e( 'Migrate legacy Attachments data', 'attachments' ); ?></h2>
|
| 108 |
<p><?php _e( 'Attachments has found records from version 1.x. Would you like to migrate them to version 3?', 'attachments' ); ?></p>
|
| 109 |
<p><a href="?page=attachments&migrate=1&nonce=<?php echo wp_create_nonce( 'attachments-migrate-1' ); ?>" class="button-primary button"><?php _e( 'Migrate legacy data', 'attachments' ); ?></a></p>
|
| 110 |
-
<?php elseif( true == get_option( 'attachments_migrated' ) ) : ?>
|
| 111 |
<p>
|
| 112 |
<?php _e( 'You have already migrated your legacy Attachments data.', 'attachments' ); ?>
|
| 113 |
<a class="attachments-toggle-trigger" href="#migrated-legacy"><?php _e( 'View more', 'attachments' ); ?></a>
|
|
@@ -117,20 +110,20 @@
|
|
| 117 |
</div>
|
| 118 |
<?php endif; ?>
|
| 119 |
|
| 120 |
-
<?php if( false == get_option( 'attachments_pro_migrated' ) && $legacy->legacy_pro ) : ?>
|
| 121 |
<h2><?php _e( 'Migrate Attachments Pro data', 'attachments' ); ?></h2>
|
| 122 |
<p><?php _e( 'Attachments has found records stored in Attachments Pro. Would you like to migrate them to Attachments?', 'attachments' ); ?></p>
|
| 123 |
<p><a href="?page=attachments&migrate-pro=1&nonce=<?php echo wp_create_nonce( 'attachments-pro-migrate-1' ); ?>" class="button-primary button"><?php _e( 'Migrate Attachments Pro data', 'attachments' ); ?></a></p>
|
| 124 |
-
<?php elseif( true == get_option( 'attachments_pro_migrated' ) ) : ?>
|
| 125 |
<p>
|
| 126 |
<?php _e( 'You have already migrated your Attachments Pro data.', 'attachments' ); ?>
|
| 127 |
<a class="attachments-toggle-trigger" href="#migrated-legacy-pro"><?php _e( 'View more', 'attachments' ); ?></a>
|
| 128 |
</p>
|
| 129 |
<div id="migrated-legacy-pro" class="attachments-toggle-target" style="display:none;">
|
| 130 |
<h2><?php _e( 'Moving from Attachments Pro: required code for your functions.php', 'attachments' ); ?></h2>
|
| 131 |
-
<textarea style="display:block; width:100%; font-family:monospace; height:300px;"><?php echo get_option( 'attachments_pro_functions
|
| 132 |
<h2><?php _e( 'Moving from Attachments Pro: starter code for your theme templates', 'attachments' ); ?></h2>
|
| 133 |
-
<textarea style="display:block; width:100%; font-family:monospace; height:200px;"><?php echo get_option( 'attachments_pro_template
|
| 134 |
</div>
|
| 135 |
<?php endif; ?>
|
| 136 |
|
| 7 |
include_once( ATTACHMENTS_DIR . '/classes/class.attachments.legacy.php' );
|
| 8 |
$legacy = new AttachmentsLegacyHandler();
|
| 9 |
|
| 10 |
+
if ( isset( $_GET['dismiss'] ) ) {
|
| 11 |
+
if ( ! wp_verify_nonce( $_GET['nonce'], 'attachments-dismiss') ) {
|
|
|
|
| 12 |
wp_die( __( 'Invalid request', 'attachments' ) );
|
| 13 |
+
}
|
| 14 |
|
| 15 |
// set our flag that the user wants to ignore the migration message
|
| 16 |
add_option( 'attachments_ignore_migration', true, '', 'no' );
|
| 17 |
}
|
| 18 |
|
| 19 |
+
if ( isset( $_GET['dismiss-pro'] ) ) {
|
| 20 |
+
if ( ! wp_verify_nonce( $_GET['nonce'], 'attachments-pro-dismiss') ) {
|
|
|
|
| 21 |
wp_die( __( 'Invalid request', 'attachments' ) );
|
| 22 |
+
}
|
| 23 |
|
| 24 |
// set our flag that the user wants to ignore the migration message
|
| 25 |
add_option( 'attachments_pro_ignore_migration', true, '', 'no' );
|
| 32 |
|
| 33 |
<h2><?php _e( 'Attachments', 'attachments' ); ?></h2>
|
| 34 |
|
| 35 |
+
<?php if ( isset( $_GET['overview'] ) ) : ?>
|
| 36 |
|
| 37 |
<div class="message updated" id="message">
|
| 38 |
<p><?php _e( "<strong>Attachments has changed significantly since it's last update.</strong> These changes <em>will affect your themes and plugins</em>.", 'attachments' ); ?></p>
|
| 74 |
|
| 75 |
<?php
|
| 76 |
// check to see if we're migrating
|
| 77 |
+
if ( isset( $_GET['migrate'] ) ) {
|
| 78 |
+
switch( intval( $_GET['migrate'] ) ) {
|
|
|
|
|
|
|
| 79 |
case 1:
|
| 80 |
$migrator->prepare_migration();
|
| 81 |
break;
|
| 84 |
$migrator->init_migration();
|
| 85 |
break;
|
| 86 |
}
|
| 87 |
+
} elseif( isset( $_GET['migrate-pro'] ) ) {
|
| 88 |
+
switch( intval( $_GET['migrate-pro'] ) ) {
|
|
|
|
|
|
|
|
|
|
| 89 |
case 1:
|
| 90 |
$migrator->prepare_pro_migration();
|
| 91 |
break;
|
| 94 |
$migrator->init_pro_migration();
|
| 95 |
break;
|
| 96 |
}
|
| 97 |
+
} else { ?>
|
|
|
|
|
|
|
| 98 |
|
| 99 |
+
<?php if ( false == get_option( 'attachments_migrated' ) && $legacy->legacy ) : ?>
|
| 100 |
<h2><?php _e( 'Migrate legacy Attachments data', 'attachments' ); ?></h2>
|
| 101 |
<p><?php _e( 'Attachments has found records from version 1.x. Would you like to migrate them to version 3?', 'attachments' ); ?></p>
|
| 102 |
<p><a href="?page=attachments&migrate=1&nonce=<?php echo wp_create_nonce( 'attachments-migrate-1' ); ?>" class="button-primary button"><?php _e( 'Migrate legacy data', 'attachments' ); ?></a></p>
|
| 103 |
+
<?php elseif ( true == get_option( 'attachments_migrated' ) ) : ?>
|
| 104 |
<p>
|
| 105 |
<?php _e( 'You have already migrated your legacy Attachments data.', 'attachments' ); ?>
|
| 106 |
<a class="attachments-toggle-trigger" href="#migrated-legacy"><?php _e( 'View more', 'attachments' ); ?></a>
|
| 110 |
</div>
|
| 111 |
<?php endif; ?>
|
| 112 |
|
| 113 |
+
<?php if ( false == get_option( 'attachments_pro_migrated' ) && $legacy->legacy_pro ) : ?>
|
| 114 |
<h2><?php _e( 'Migrate Attachments Pro data', 'attachments' ); ?></h2>
|
| 115 |
<p><?php _e( 'Attachments has found records stored in Attachments Pro. Would you like to migrate them to Attachments?', 'attachments' ); ?></p>
|
| 116 |
<p><a href="?page=attachments&migrate-pro=1&nonce=<?php echo wp_create_nonce( 'attachments-pro-migrate-1' ); ?>" class="button-primary button"><?php _e( 'Migrate Attachments Pro data', 'attachments' ); ?></a></p>
|
| 117 |
+
<?php elseif ( true == get_option( 'attachments_pro_migrated' ) ) : ?>
|
| 118 |
<p>
|
| 119 |
<?php _e( 'You have already migrated your Attachments Pro data.', 'attachments' ); ?>
|
| 120 |
<a class="attachments-toggle-trigger" href="#migrated-legacy-pro"><?php _e( 'View more', 'attachments' ); ?></a>
|
| 121 |
</p>
|
| 122 |
<div id="migrated-legacy-pro" class="attachments-toggle-target" style="display:none;">
|
| 123 |
<h2><?php _e( 'Moving from Attachments Pro: required code for your functions.php', 'attachments' ); ?></h2>
|
| 124 |
+
<textarea style="display:block; width:100%; font-family:monospace; height:300px;"><?php echo esc_textarea( get_option( 'attachments_pro_functions' ) ); ?></textarea>
|
| 125 |
<h2><?php _e( 'Moving from Attachments Pro: starter code for your theme templates', 'attachments' ); ?></h2>
|
| 126 |
+
<textarea style="display:block; width:100%; font-family:monospace; height:200px;"><?php echo esc_textarea( get_option( 'attachments_pro_template' ) ); ?></textarea>
|
| 127 |
</div>
|
| 128 |
<?php endif; ?>
|
| 129 |
|
