Overview
  • Namespace
  • Class

Namespaces

  • MatthiasWeb
    • RealMediaLibrary
      • api
      • attachment
      • base
      • comp
        • complexquery
      • folder
      • general
      • metadata
      • order
      • rest
      • usersettings
  • None

Classes

  • MatthiasWeb\RealMediaLibrary\attachment\CountCache
  • MatthiasWeb\RealMediaLibrary\attachment\CustomField
  • MatthiasWeb\RealMediaLibrary\attachment\Filter
  • MatthiasWeb\RealMediaLibrary\attachment\Permissions
  • MatthiasWeb\RealMediaLibrary\attachment\Shortcut
  • MatthiasWeb\RealMediaLibrary\attachment\Structure
  • MatthiasWeb\RealMediaLibrary\attachment\Upload
  • MatthiasWeb\RealMediaLibrary\base\Assets
  • MatthiasWeb\RealMediaLibrary\base\Base
  • MatthiasWeb\RealMediaLibrary\base\Core
  • MatthiasWeb\RealMediaLibrary\comp\complexquery\ComplexQuery
  • MatthiasWeb\RealMediaLibrary\comp\complexquery\ResetNames
  • MatthiasWeb\RealMediaLibrary\comp\ExImport
  • MatthiasWeb\RealMediaLibrary\comp\PageBuilders
  • MatthiasWeb\RealMediaLibrary\comp\PolyLang
  • MatthiasWeb\RealMediaLibrary\comp\WPML
  • MatthiasWeb\RealMediaLibrary\folder\BaseFolder
  • MatthiasWeb\RealMediaLibrary\folder\Collection
  • MatthiasWeb\RealMediaLibrary\folder\Creatable
  • MatthiasWeb\RealMediaLibrary\folder\CRUD
  • MatthiasWeb\RealMediaLibrary\folder\Folder
  • MatthiasWeb\RealMediaLibrary\folder\Gallery
  • MatthiasWeb\RealMediaLibrary\folder\Root
  • MatthiasWeb\RealMediaLibrary\general\Activator
  • MatthiasWeb\RealMediaLibrary\general\Assets
  • MatthiasWeb\RealMediaLibrary\general\Core
  • MatthiasWeb\RealMediaLibrary\general\FolderShortcode
  • MatthiasWeb\RealMediaLibrary\general\Lang
  • MatthiasWeb\RealMediaLibrary\general\Migration
  • MatthiasWeb\RealMediaLibrary\general\Options
  • MatthiasWeb\RealMediaLibrary\general\QueryCount
  • MatthiasWeb\RealMediaLibrary\general\Util
  • MatthiasWeb\RealMediaLibrary\general\View
  • MatthiasWeb\RealMediaLibrary\metadata\CoverImage
  • MatthiasWeb\RealMediaLibrary\metadata\Description
  • MatthiasWeb\RealMediaLibrary\metadata\Meta
  • MatthiasWeb\RealMediaLibrary\order\GalleryOrder
  • MatthiasWeb\RealMediaLibrary\order\Sortable
  • MatthiasWeb\RealMediaLibrary\rest\Attachment
  • MatthiasWeb\RealMediaLibrary\rest\Folder
  • MatthiasWeb\RealMediaLibrary\rest\Reset
  • MatthiasWeb\RealMediaLibrary\rest\Service
  • MatthiasWeb\RealMediaLibrary\usersettings\Demo

Interfaces

  • MatthiasWeb\RealMediaLibrary\api\IFolder
  • MatthiasWeb\RealMediaLibrary\api\IFolderActions
  • MatthiasWeb\RealMediaLibrary\api\IFolderContent
  • MatthiasWeb\RealMediaLibrary\api\IMetadata
  • MatthiasWeb\RealMediaLibrary\api\IStructure
  • MatthiasWeb\RealMediaLibrary\api\IUserSettings

Exceptions

  • MatthiasWeb\RealMediaLibrary\general\FolderAlreadyExistsException

Functions

  • _wp_rml_active
  • _wp_rml_root
  • _wp_rml_sanitize
  • _wp_rml_sanitize_filename
  • add_media_folder_meta
  • add_rml_meta_box
  • add_rml_user_settings_box
  • delete_media_folder_meta
  • delete_media_folder_meta_by_key
  • get_media_folder_meta
  • is_rml_folder
  • rml_skip_php_admin_notice
  • rml_skip_rest_admin_notice
  • rml_skip_wp_admin_notice
  • truncate_media_folder_meta
  • update_media_folder_meta
  • wp_attachment_ensure_source_file
  • wp_attachment_folder
  • wp_attachment_get_shortcuts
  • wp_attachment_has_shortcuts
  • wp_attachment_is_shortcut
  • wp_attachment_order_update
  • wp_rml_create
  • wp_rml_create_all_children_sql
  • wp_rml_create_all_parents_sql
  • wp_rml_create_or_return_existing_id
  • wp_rml_create_shortcuts
  • wp_rml_created_shortcuts_last_ids
  • wp_rml_delete
  • wp_rml_dropdown
  • wp_rml_dropdown_collection
  • wp_rml_dropdown_gallery
  • wp_rml_dropdown_gallery_or_collection
  • wp_rml_get_attachments
  • wp_rml_get_by_absolute_path
  • wp_rml_get_by_id
  • wp_rml_get_object_by_id
  • wp_rml_get_parent_id
  • wp_rml_is_type
  • wp_rml_move
  • wp_rml_objects
  • wp_rml_register_creatable
  • wp_rml_rename
  • wp_rml_root_childs
  • wp_rml_structure
  • wp_rml_structure_reset
  • wp_rml_update_count
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 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 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 
<?php
namespace MatthiasWeb\RealMediaLibrary\attachment;
use MatthiasWeb\RealMediaLibrary\general;
use MatthiasWeb\RealMediaLibrary\base;

defined( 'ABSPATH' ) or die( 'No script kiddies please!' );

/**
 * Handle the metadata and attached file for shortcuts.
 */
class Shortcut extends base\Base {
    private static $me = null;
    
    /**
     * @see Shortcut::create()
     */
    private $lockCreate = false;
    
    /**
     * @see this::create()
     * @see this::getLastIds()
     * @see this::_resetLastIds()
     */
    private $lastIds = false;
    
    private function __construct() {
        // Silence is golden.
    }
    
    /**
     * Creates a shortcut.
     * 
     * @see wp_rml_create_shortcuts
     * @see _wp_rml_synchronize_attachment
     */
    public function create($postId, $fid, $isShortcut = false) {
        global $wpdb;
        
        // Is locked?
        if ($this->lockCreate === true) {
            $this->lockCreate = false;
            return false;
        }
        
        // Collect data
        $table_name = $this->getTableName("posts");
        $oldFolder = wp_attachment_folder($postId);
        $isShortcut = $isShortcut ? 1 : 0;
        $attachmentId = $postId; // The id for the realmedialibrary_posts table
        
        // Check if attachment exists
        if (get_post_type($postId) !== "attachment") {
            return false;
        }
        
        // Process
        if ($isShortcut > 0) {
            // Ensure, that we are working with the source file and not create a shortcut from a shortcut...
            $postId = wp_attachment_ensure_source_file($postId);

            // Prepare the new post
            $wp_post = get_post($postId);
            $new_post = array(
                "guid" => $wp_post->guid . "?sc=" . $postId,
                "post_mime_type" => $wp_post->post_mime_type,
                "post_title" => $wp_post->post_title,
                "post_content" => "",
                "post_excerpt" => $wp_post->post_excerpt, // Caption
                "post_content" => $wp_post->post_content, // Description
                "post_status" => "inherit"
            );
            $attachedFile = get_attached_file($postId);
            
            // Create new post
            $this->lockCreate = true;
            try {
                $scId = wp_insert_attachment($new_post, $attachedFile);
                
                // Copy alt text if present
                $altText = get_post_meta($postId, '_wp_attachment_image_alt', true);
                if (!empty($altText)) {
                    update_post_meta($scId, '_wp_attachment_image_alt', $altText);
                }
                
                $this->debug("Shortcut for " . $postId . " created in posts table with id " . $scId, __METHOD__);
                $this->lockCreate = false;
            }catch (\Exception $e) {
                $this->lockCreate = false;
                return false;
            }
            $attachmentId = $scId;
            $this->lastIds[] = $attachmentId;
            $isShortcut = $postId;
        }else{
            $isShortcut = wp_attachment_is_shortcut($postId, true);
        }
        
        // Insert or update the new attachment relationship
        $sql = $wpdb->prepare("INSERT INTO $table_name (`attachment`, `fid`, `isShortcut`)
            VALUES (%d, %d, %d) ON DUPLICATE KEY UPDATE fid=VALUES(fid), isShortcut=VALUES(isShortcut), nr=0, oldCustomNr=0",
            $attachmentId, $fid, $isShortcut);
        $wpdb->query($sql);
        
        /**
         * An attachment is moved to a specific folder.
         * 
         * @param {int} $postId The post id of the attachment
         * @param {int} $oldFolder The old folder id of the attachment
         * @param {int} $fid The new folder id of the attachment
         * @param {boolean} $isShortcut If true the attachment was copied to a folder
         * @hook RML/Item/Moved
         */
        do_action("RML/Item/Moved", $postId, $oldFolder, $fid, $isShortcut);
        return true;
    }
    
    /**
     * Check if a meta key is inheritable.
     * 
     * @returns boolean
     */
    private function isInheritableMetaKey($meta_key, $withAttached = true) {
        return $meta_key === "_wp_attachment_metadata" || ($meta_key === "_wp_attached_file" && $withAttached) || $meta_key === "_wp_attachment_backup_sizes";
    }
    
    /**
     * If it is a shortcut, read the metadata from the source file.
     * It also handles the wp_delete_attachment process to avoid to delete
     * the source files if shortcut.
     */
    public function get_post_metadata($check, $object_id, $meta_key, $single) {
        if ($this->isInheritableMetaKey($meta_key) && ($source_id = wp_attachment_is_shortcut($object_id, true))) {
            // Check if we want to delete the attachment
            $backtrace = debug_backtrace();
            foreach ($backtrace as $value) {
                if ($value["function"] === "wp_delete_attachment") {
                    $this->debug("Tried to delete an attachment shortcut... Avoid to delete the physical files (" . $meta_key . ")", __METHOD__);
                    return $single ? "" : array(array());
                }
            }
            
            // Return main file data
            $meta = get_post_meta($source_id, $meta_key, $single);
            return $single ? array($meta) : $meta;
        }
        return $check;
    }
    
    /**
     * Avoids to generate own meta data for shortcuts.
     */
    public function add_post_metadata($check, $object_id, $meta_key, $meta_value, $unique) {
        if ($this->isInheritableMetaKey($meta_key) && ($source_id = wp_attachment_is_shortcut($object_id, true))) {
            $add = add_post_meta($source_id, $meta_key, $meta_value, $unique);
            return is_bool($add) ? $add : $add > 0;
        }
        return $check;
    }
    
    /**
     * Avoids to generate own meta data for shortcuts.
     */
    public function update_post_metadata($check, $object_id, $meta_key, $meta_value, $prev_value) {
        if ($this->isInheritableMetaKey($meta_key) && ($source_id = wp_attachment_is_shortcut($object_id, true))) {
            $this->debug("Probably the image gets regenerated, save the new metadata to the source file...", __METHOD__);
            $update = update_post_meta($source_id, $meta_key, $meta_value, $prev_value);
            return is_bool($update) ? $update : $update > 0;
        }
        return $check;
    }
    
    /**
     * @see wp_rml_created_shortcuts_last_ids()
     */
    public function getLastIds() {
        return is_array($this->lastIds) ? $this->lastIds : ( $this->lastIds = array() );
    }
    
    /**
     * Delete all associated shortcuts.
     */
    public function delete_attachment($postId) {
        $shortcuts = wp_attachment_get_shortcuts($postId);
        if (count($shortcuts) > 0) {
            $this->debug("Found shortcuts for this postid (" . $postId . "): " . json_encode($shortcuts), __METHOD__);
            foreach ($shortcuts as $value) {
                wp_delete_attachment($value, true);
            }
        }
    }
    
    /**
     * This function should only be used in the Creatable::insert() function.
     */
    public function _resetLastIds() {
        $this->lastIds = array();
    }
    
    public static function getInstance() {
        if (self::$me == null) {
            self::$me = new Shortcut();
        }
        return self::$me;
    }
}

?>
API documentation generated by ApiGen