349 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			349 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace WpAssetCleanUp;
 | |
| 
 | |
| /**
 | |
|  * Class MetaBoxes
 | |
|  * @package WpAssetCleanUp
 | |
|  */
 | |
| class MetaBoxes
 | |
| {
 | |
| 	/**
 | |
| 	 * @var array
 | |
| 	 */
 | |
| 	public static $noMetaBoxesForPostTypes = array(
 | |
| 		// Oxygen Page Builder
 | |
| 		'ct_template',
 | |
| 		'oxy_user_library',
 | |
| 
 | |
| 		// Themify Page Builder (Layout & Layout Part)
 | |
| 		'tbuilder_layout',
 | |
| 		'tbuilder_layout_part',
 | |
| 
 | |
| 		// "Popup Maker" plugin
 | |
| 		'popup',
 | |
| 		'popup_theme',
 | |
| 
 | |
| 		// "Popup Builder" plugin
 | |
| 		'popupbuilder',
 | |
| 
 | |
| 		// "Datafeedr Product Sets" plugin
 | |
| 		'datafeedr-productset',
 | |
| 
 | |
| 		// Elementor
 | |
| 		'elementor_library'
 | |
| 	);
 | |
| 
 | |
| 	/**
 | |
| 	 *
 | |
| 	 */
 | |
| 	public function initMetaBox($type)
 | |
| 	{
 | |
| 		if ( ! Menu::userCanManageAssets() ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		if ( Main::instance()->settings['allow_manage_assets_to'] === 'chosen' && ! empty(Main::instance()->settings['allow_manage_assets_to_list']) ) {
 | |
| 			$wpacuCurrentUserId = get_current_user_id();
 | |
| 
 | |
| 			if ( ! in_array( $wpacuCurrentUserId, Main::instance()->settings['allow_manage_assets_to_list'] ) ) {
 | |
| 				return; // the current logged-in admin is not in the list of "Allow managing assets to:"
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ($type === 'manage_page_assets') {
 | |
| 			add_action( 'add_meta_boxes', array( $this, 'addAssetManagerMetaBox' ), 11 );
 | |
| 			add_action( 'add_meta_boxes', array( $this, 'keepAssetManagerMetaBoxOnTheLeftSide' ), 1 );
 | |
| 		}
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param $postType
 | |
| 	 */
 | |
| 	public function addAssetManagerMetaBox($postType)
 | |
| 	{
 | |
| 		$obj = $this->showMetaBoxes($postType);
 | |
| 
 | |
| 		if (isset($obj->public) && $obj->public > 0) {
 | |
| 			add_meta_box(
 | |
| 				WPACU_PLUGIN_ID . '_asset_list',
 | |
| 				WPACU_PLUGIN_TITLE.': '.__('CSS & JavaScript Manager / Page Options', 'wp-asset-clean-up'),
 | |
| 				array($this, 'renderAssetManagerMetaBoxContent'),
 | |
| 				$postType,
 | |
| 				apply_filters('wpacu_asset_list_meta_box_context',  'normal'),
 | |
| 				apply_filters('wpacu_asset_list_meta_box_priority', 'high')
 | |
| 			);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Sometimes, users are moving by mistake the meta box to the right side which is not desirable
 | |
| 	 * and have difficulties moving it back, thus, this method moves it back to the left (normal) side
 | |
| 	 *
 | |
| 	 * @param $postType
 | |
| 	 */
 | |
| 	public function keepAssetManagerMetaBoxOnTheLeftSide($postType)
 | |
| 	{
 | |
| 		$user = wp_get_current_user();
 | |
| 
 | |
| 		if (isset($user->ID) && $user->ID) {
 | |
| 			$userMetaBoxOption = get_user_option('meta-box-order_'.$postType,  $user->ID );
 | |
| 
 | |
| 			if (isset($userMetaBoxOption['side'], $userMetaBoxOption['normal']) && strpos($userMetaBoxOption['side'], WPACU_PLUGIN_ID . '_asset_list') !== false) {
 | |
| 				// Remove it from the side list
 | |
| 				if (strpos($userMetaBoxOption['side'], ',') !== false) {
 | |
| 					$allSideMetaBoxes = explode(',', $userMetaBoxOption['side']);
 | |
| 
 | |
| 					foreach ($allSideMetaBoxes as $sideMetaBoxIndex => $sideMetaBoxName) {
 | |
| 						if ($sideMetaBoxName === WPACU_PLUGIN_ID . '_asset_list') {
 | |
| 							unset($allSideMetaBoxes[$sideMetaBoxIndex]);
 | |
| 						}
 | |
| 					}
 | |
| 
 | |
| 					$userMetaBoxOption['side'] = implode(',', array_unique($allSideMetaBoxes));
 | |
| 				} else {
 | |
| 					$userMetaBoxOption['side'] = str_replace(WPACU_PLUGIN_ID . '_asset_list', '', $userMetaBoxOption['side']);
 | |
| 				}
 | |
| 
 | |
| 				// Move it back to the normal one
 | |
| 				if (strpos($userMetaBoxOption['normal'], ',') !== false) {
 | |
| 					$allNormalMetaBoxes = explode( ',', $userMetaBoxOption['normal'] );
 | |
| 					$allNormalMetaBoxes[] = WPACU_PLUGIN_ID . '_asset_list';
 | |
| 					$userMetaBoxOption['normal'] = implode(',', array_unique($allNormalMetaBoxes));
 | |
| 				} elseif ($userMetaBoxOption['normal'] !== '') {
 | |
| 					$userMetaBoxOption['normal'] .= ','.WPACU_PLUGIN_ID . '_asset_list';
 | |
| 				} elseif ($userMetaBoxOption['normal'] === '') {
 | |
| 					$userMetaBoxOption['normal'] .= WPACU_PLUGIN_ID . '_asset_list';
 | |
| 				}
 | |
| 
 | |
| 				update_user_option($user->ID, 'meta-box-order_'.$postType, $userMetaBoxOption, true);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param $postType
 | |
| 	 */
 | |
| 	public function addPageOptionsMetaBox($postType)
 | |
| 	{
 | |
| 		global $post;
 | |
| 
 | |
| 		if (self::isMediaWithPermalinkDeactivated($post)) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$obj = $this->showMetaBoxes($postType);
 | |
| 
 | |
| 		if (isset($obj->public) && $obj->public > 0) {
 | |
| 			add_meta_box(
 | |
| 				WPACU_PLUGIN_ID . '_page_options',
 | |
| 				WPACU_PLUGIN_TITLE.': '.__('Options', 'wp-asset-clean-up'),
 | |
| 				array($this, 'renderPageOptionsMetaBoxContent'),
 | |
| 				$postType,
 | |
| 				apply_filters('wpacu_page_options_meta_box_context',  'side'),
 | |
| 				apply_filters('wpacu_page_options_meta_box_priority', 'high')
 | |
| 			);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * This is triggered only in the Edit Mode Dashboard View
 | |
| 	 */
 | |
| 	public function renderAssetManagerMetaBoxContent()
 | |
| 	{
 | |
| 		global $post;
 | |
| 
 | |
| 		if ($post->ID === null) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$data = array('status' => 1);
 | |
| 
 | |
| 		$postId = (isset($post->ID) && $post->ID > 0) ? $post->ID : 0;
 | |
| 
 | |
| 		$isListFetchable = true;
 | |
| 
 | |
| 		if (! Main::instance()->settings['dashboard_show']) {
 | |
| 			$isListFetchable = false;
 | |
| 			$data['status'] = 2; // "Manage within Dashboard" is disabled in plugin's settings
 | |
| 		} elseif ($postId < 1 || ! in_array(get_post_status($postId), array('publish', 'private'))) {
 | |
| 			$data['status'] = 3; // "draft", "auto-draft" post (it has to be published)
 | |
| 			$isListFetchable = false;
 | |
| 		}
 | |
| 
 | |
| 		if (self::isMediaWithPermalinkDeactivated($post)) {
 | |
| 			$isListFetchable = false;
 | |
| 			$data['status'] = 4; // "Redirect attachment URLs to the attachment itself?" is enabled in "Yoast SEO" -> "Media"
 | |
| 		}
 | |
| 
 | |
| 		if ($isListFetchable) {
 | |
| 			$data['fetch_url'] = Misc::getPageUrl($postId);
 | |
| 
 | |
| 			switch (assetCleanUpHasNoLoadMatches($data['fetch_url'])) {
 | |
| 				case 'is_set_in_settings':
 | |
| 					// The rules from "Settings" -> "Plugin Usage Preferences" -> "Do not load the plugin on certain pages" will be checked
 | |
| 					$data['status']  = 5;
 | |
| 					$isListFetchable = false;
 | |
| 					break;
 | |
| 
 | |
| 				case 'is_set_in_page':
 | |
| 					// The following option from "Page Options" (within the CSS/JS manager of the targeted page) is set: "Do not load Asset CleanUp Pro on this page (this will disable any functionality of the plugin)"
 | |
| 					$data['status']  = 6;
 | |
| 					$isListFetchable = false;
 | |
| 					break;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$data['is_list_fetchable']     = $isListFetchable;
 | |
| 		$data['fetch_assets_on_click'] = false;
 | |
| 
 | |
| 		if ($isListFetchable) {
 | |
| 			if (Main::instance()->settings['assets_list_show_status'] === 'fetch_on_click') {
 | |
| 				$data['fetch_assets_on_click'] = true;
 | |
| 			}
 | |
| 
 | |
| 			$data['dom_get_type'] = Main::instance()->settings['dom_get_type'];
 | |
| 		}
 | |
| 
 | |
| 		$data['post_id'] = $postId;
 | |
| 
 | |
| 		Main::instance()->parseTemplate('meta-box', $data, true);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * This is triggered only in the Edit Mode Dashboard View
 | |
| 	 * Valid for posts, pages (a page can also be set as the homepage), custom post types
 | |
| 	 */
 | |
| 	public function renderPageOptionsMetaBoxContent()
 | |
| 	{
 | |
| 		$data = array('page_options' => self::getPageOptions());
 | |
| 
 | |
| 		Main::instance()->parseTemplate('meta-box-side-page-options', $data, true);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param int $postId
 | |
| 	 * @param string $type
 | |
| 	 * @return array|mixed|object
 | |
| 	 */
 | |
| 	public static function getPageOptions($postId = 0, $type = 'post')
 | |
| 	{
 | |
| 		if ($type === 'post' || $postId > 0) {
 | |
| 			if ( $postId < 1 ) {
 | |
| 				global $post;
 | |
| 				$postId = (int) $post->ID;
 | |
| 			}
 | |
| 
 | |
| 			if ( $postId > 1 ) {
 | |
| 				$metaPageOptionsJson = get_post_meta( $postId, '_' . WPACU_PLUGIN_ID . '_page_options', true );
 | |
| 				return @json_decode( $metaPageOptionsJson, ARRAY_A );
 | |
| 			}
 | |
| 		} elseif ($type === 'front_page') { // e.g. the latest posts, not a chosen page ID (that's when $type as 'post' is used)
 | |
| 			$globalPageOptions = get_option(WPACU_PLUGIN_ID . '_global_data');
 | |
| 
 | |
| 			if ($globalPageOptions) {
 | |
| 				$globalPageOptionsList = @json_decode( $globalPageOptions, true );
 | |
| 
 | |
| 				if ( isset( $globalPageOptionsList['page_options']['homepage'] ) && ! empty( $globalPageOptionsList['page_options']['homepage'] ) ) {
 | |
| 					return $globalPageOptionsList['page_options']['homepage'];
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return array();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	public static function hasNoFrontendOptimizationPageOption()
 | |
| 	{
 | |
| 		$isSingularPage = defined('WPACU_CURRENT_PAGE_ID') && WPACU_CURRENT_PAGE_ID > 0 && is_singular();
 | |
| 
 | |
| 		if ($isSingularPage || Misc::isHomePage()) {
 | |
| 			if ($isSingularPage) {
 | |
| 				$pageOptions = self::getPageOptions( WPACU_CURRENT_PAGE_ID ); // Singular page
 | |
| 			} else {
 | |
| 				$pageOptions = self::getPageOptions(0, 'front_page'); // Home page
 | |
| 			}
 | |
| 
 | |
| 			if (isset($pageOptions['no_assets_settings']) && $pageOptions['no_assets_settings']) {
 | |
| 				return true;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public static function hideMetaBoxesForPostTypes()
 | |
| 	{
 | |
| 		$allValues = self::$noMetaBoxesForPostTypes;
 | |
| 
 | |
| 		$hideForChosenPostTypes = Main::instance()->settings['hide_meta_boxes_for_post_types'];
 | |
| 
 | |
| 		if (! empty($hideForChosenPostTypes)) {
 | |
| 			foreach ($hideForChosenPostTypes as $chosenPostType) {
 | |
| 				$allValues[] = trim($chosenPostType);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return $allValues;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Determine whether to show any Asset CleanUp (Pro) meta boxes, depending on the post type
 | |
| 	 *
 | |
| 	 * @param $postType
 | |
| 	 * @return bool|object
 | |
| 	 */
 | |
| 	public function showMetaBoxes($postType)
 | |
| 	{
 | |
| 		$obj = get_post_type_object($postType);
 | |
| 
 | |
| 		// These are not public pages that are loading CSS/JS
 | |
| 		// e.g. URI request ending in '/ct_template/inner-content/'
 | |
| 		if (isset($obj->name) && $obj->name && in_array($obj->name, self::hideMetaBoxesForPostTypes())) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		if (isset($_GET['post'], $obj->name) && $_GET['post'] && $obj->name) {
 | |
| 			$permalinkStructure = get_option( 'permalink_structure' );
 | |
| 			$postPermalink      = get_permalink( $_GET['post'] );
 | |
| 
 | |
| 			if (strpos($permalinkStructure, '%postname%') !== false && strpos($postPermalink, '/?'.$obj->name.'=')) {
 | |
| 				// Doesn't have the right permalink; Showing any Asset CleanUp (Lite or Pro) options is not relevant
 | |
| 				return false;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return $obj;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param string $post
 | |
| 	 *
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	public static function isMediaWithPermalinkDeactivated($post = '')
 | |
| 	{
 | |
| 		if ($post === '') {
 | |
| 			$postTypeToCheck = 'attachment';
 | |
| 		} else {
 | |
| 			$postTypeToCheck = get_post_type($post->ID);
 | |
| 		}
 | |
| 
 | |
| 		if ('attachment' === $postTypeToCheck && method_exists('WPSEO_Options', 'get')) {
 | |
| 			try {
 | |
| 				if (\WPSEO_Options::get( 'disable-attachment' ) === true) {
 | |
| 					return true;
 | |
| 				}
 | |
| 			} catch (\Exception $e) {}
 | |
| 		}
 | |
| 
 | |
| 		return false;
 | |
| 	}
 | |
| }
 |