dvadf
File manager - Edit - /home/centroca/public_html/IGW.zip
Back
PK *P0]�y�q�. �. BlockManager.phpnu �[��� <?php namespace Imagely\NGG\IGW; use Imagely\NGG\DataStorage\Manager as StorageManager; use Imagely\NGG\Display\StaticAssets; use Imagely\NGG\Util\URL; /** * Handles the NextGEN block and post thumbnail */ class BlockManager { /** * Instance cache. * * @var BlockManager|null */ protected static $instance = null; /** * Gets the BlockManager instance. * * @return BlockManager */ public static function get_instance() { if ( ! isset( self::$instance ) ) { self::$instance = new BlockManager(); } return self::$instance; } /** * Register the hooks for the BlockManager. * * @return void */ public function register_hooks() { add_action( 'init', [ $this, 'register_blocks' ] ); add_action( 'enqueue_block_editor_assets', [ $this, 'enqueue_post_thumbnails' ], 1 ); add_action( 'enqueue_block_editor_assets', [ $this, 'enqueue_gallery_conversion' ], 10 ); add_action( 'enqueue_block_assets', [ $this, 'ngg_enqueue_block_assets' ] ); // Adds NextGEN thumbnail support to all posts with 'thumbnail' support by adding a field for posts/pages to // set the ngg_post_thumbnail via REST API. add_action( 'init', function () { array_map( function ( $post_type ) { add_post_type_support( $post_type, 'custom-fields' ); register_meta( $post_type, 'ngg_post_thumbnail', [ 'type' => 'integer', 'single' => true, 'show_in_rest' => true, ] ); add_action( 'rest_insert_' . $post_type, [ $this, 'set_or_remove_ngg_post_thumbnail' ], PHP_INT_MAX - 1, 2 ); }, get_post_types_by_support( 'thumbnail' ) ); }, 11 ); } /** * Register blocks from block.json metadata. * * @return void */ public function register_blocks() { // Register editor styles (shared by blocks) wp_register_style( 'imagely-nextgen-gallery-editor-style', StaticAssets::get_url( 'IGW/Block/editor.css', 'photocrati-nextgen_block#editor.css' ), [ 'wp-edit-blocks' ], NGG_SCRIPT_VERSION ); // Add imagelyApp global data needed by adminApp components // Use centralized static method from App class $imagely_app_data = \Imagely\NGG\Admin\App::get_imagely_app_data(); // Register unified media block (Gallery + Album) $media_block_asset_file = NGG_PLUGIN_DIR . '/static/IGW/Block/build/block-imagely-block.asset.php'; $media_block_asset = file_exists( $media_block_asset_file ) ? include $media_block_asset_file : [ 'dependencies' => [], 'version' => NGG_SCRIPT_VERSION, ]; \wp_register_script( 'imagely-main-block-simple-editor-script', StaticAssets::get_url( 'IGW/Block/build/block-imagely-block.min.js', 'photocrati-nextgen_block#build/block-imagely-block.min.js' ), $media_block_asset['dependencies'], $media_block_asset['version'], true ); // Register the adminApp styles (shared by unified block) wp_register_style( 'imagely-nextgen-block-styles', StaticAssets::get_url( 'IGW/Block/build/block-imagely-block.min.css', 'photocrati-nextgen_block#build/block-imagely-block.min.css' ), [], $media_block_asset['version'] ); // Localize script with imagelyApp data wp_localize_script( 'imagely-main-block-simple-editor-script', 'imagelyApp', $imagely_app_data ); // Load translations for the block script wp_set_script_translations( 'imagely-main-block-simple-editor-script', 'nggallery', NGG_PLUGIN_DIR . 'static/I18N' ); // Add inline script for i18n \wp_add_inline_script( 'imagely-main-block-simple-editor-script', 'window.add_ngg_gallery_block_i18n = ' . wp_json_encode( [ 'edit' => \__( 'Edit', 'nggallery' ), 'delete' => \__( 'Delete', 'nggallery' ), 'create' => \__( 'Add Imagely', 'nggallery' ), 'h3' => \__( 'Imagely', 'nggallery' ), 'nonce' => \wp_create_nonce( 'ngg_attach_to_post_iframe' ), 'restNonce' => \wp_create_nonce( 'wp_rest' ), 'adminUrl' => \admin_url( 'admin.php' ), ] ) . ';', 'before' ); // Read block.json and register block $media_block_json_file = NGG_PLUGIN_DIR . '/static/IGW/Block/build/block-imagely-block.block.json'; $media_metadata = file_exists( $media_block_json_file ) ? json_decode( file_get_contents( $media_block_json_file ), true ) : []; $media_metadata['editor_script_handles'] = [ 'imagely-main-block-simple-editor-script' ]; $media_metadata['editor_style_handles'] = [ 'imagely-nextgen-gallery-editor-style', 'imagely-nextgen-block-styles' ]; register_block_type( 'imagely/main-block', $media_metadata ); // Register legacy block only for existing installations if ( $this->is_existing_installation() ) { $legacy_block_asset_file = NGG_PLUGIN_DIR . '/static/IGW/Block/build/block.asset.php'; $legacy_block_asset = file_exists( $legacy_block_asset_file ) ? include $legacy_block_asset_file : [ 'dependencies' => [], 'version' => NGG_SCRIPT_VERSION, ]; \wp_register_script( 'imagely-nextgen-gallery-legacy-editor-script', StaticAssets::get_url( 'IGW/Block/build/block.min.js', 'photocrati-nextgen_block#build/block.min.js' ), $legacy_block_asset['dependencies'], $legacy_block_asset['version'], true ); // Localize script for legacy block \wp_add_inline_script( 'imagely-nextgen-gallery-legacy-editor-script', 'window.add_ngg_gallery_block_i18n = ' . wp_json_encode( [ 'edit' => \__( 'Edit', 'nggallery' ), 'delete' => \__( 'Delete', 'nggallery' ), 'create' => \__( 'Add NextGEN Gallery', 'nggallery' ), 'h3' => \__( 'NextGEN Gallery', 'nggallery' ), 'nonce' => \wp_create_nonce( 'ngg_attach_to_post_iframe' ), 'restNonce' => \wp_create_nonce( 'wp_rest' ), 'adminUrl' => \admin_url( 'admin.php' ), ] ) . ';', 'before' ); $legacy_block_json_file = NGG_PLUGIN_DIR . '/static/IGW/Block/build/block.block.json'; $legacy_metadata = file_exists( $legacy_block_json_file ) ? json_decode( file_get_contents( $legacy_block_json_file ), true ) : []; $legacy_metadata['editor_script_handles'] = [ 'imagely-nextgen-gallery-legacy-editor-script' ]; $legacy_metadata['editor_style_handles'] = [ 'imagely-nextgen-gallery-editor-style' ]; register_block_type( 'imagely/nextgen-gallery', $legacy_metadata ); } } /** * Check if this is an existing installation (not fresh). * * This method reads the 'ngg_installation_type' setting which is: * - Set to 'fresh' by default for new installations * - Set to 'existing' by the AddGalleryDates migration when it migrates data from existing galleries/albums * * @return bool True if existing installation, false if fresh install. */ private function is_existing_installation() { $settings = \Imagely\NGG\Settings\Settings::get_instance(); $installation_type = $settings->get( 'ngg_installation_type', 'fresh' ); return 'existing' === $installation_type; } /** * Enqueue the block assets. * * This method is now primarily a placeholder. Block registration is handled * in register_blocks() via block.json metadata. Legacy block conditionally * registered only for existing installations. * * @return void */ public function ngg_enqueue_block_assets() { // All block registration now handled in register_blocks() method // This method is kept for backward compatibility and potential future enqueue hooks } /** * Set or remove the ngg_post_thumbnail for a post. * * @param \WP_Post $post The post object. * @param \WP_REST_Request $request The REST request object. * @return void */ public function set_or_remove_ngg_post_thumbnail( $post, $request ) { // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged $json = @json_decode( $request->get_body() ); $target = null; if ( ! is_object( $json ) ) { return; } // WordPress 5.3 changed how the featured-image metadata was submitted to the server. if ( isset( $json->meta ) && property_exists( $json->meta, 'ngg_post_thumbnail' ) ) { $target = $json->meta; } elseif ( property_exists( $json, 'ngg_post_thumbnail' ) ) { $target = $json; } if ( ! $target ) { return; } if ( 0 === $target->ngg_post_thumbnail ) { // Thumbnail ID is zero, skip deleting. return; } $storage = StorageManager::get_instance(); // Was the post thumbnail removed? if ( ! $target->ngg_post_thumbnail ) { \delete_post_thumbnail( $post->ID ); $storage->delete_from_media_library( $target->ngg_post_thumbnail ); } else { // Was it added? $storage->set_post_thumbnail( $post->ID, $target->ngg_post_thumbnail ); } } /** * Enqueue the gallery conversion script. * * This script extends the WordPress Gallery block with a "Convert to Imagely" button. * * @return void */ public function enqueue_gallery_conversion() { $asset_file = NGG_PLUGIN_DIR . '/static/IGW/Block/build/gallery-conversion.asset.php'; $asset = file_exists( $asset_file ) ? include $asset_file : [ 'dependencies' => [], 'version' => NGG_SCRIPT_VERSION, ]; \wp_enqueue_script( 'imagely-gallery-conversion', StaticAssets::get_url( 'IGW/Block/build/gallery-conversion.min.js', 'photocrati-nextgen_block#build/gallery-conversion.min.js' ), $asset['dependencies'], $asset['version'], true ); // Localize script with conversion data. \wp_localize_script( 'imagely-gallery-conversion', 'imagelyConvertData', [ 'convertApiUrl' => '/imagely/v1/convert-gallery/single', 'convertRestNonce' => \wp_create_nonce( 'wp_rest' ), 'postId' => \get_the_ID(), 'panelTitle' => \__( 'Imagely Gallery', 'nggallery' ), 'contentHeading' => \__( 'Convert to Imagely', 'nggallery' ), 'contentDescription' => \__( 'Convert this WordPress Gallery to an Imagely Gallery for more features and customization options.', 'nggallery' ), 'contentButtonText' => \__( 'Convert to Imagely Gallery', 'nggallery' ), 'convertLoading' => \__( 'Converting...', 'nggallery' ), 'confirmationMessage' => \__( 'Are you sure you want to convert this WordPress Gallery to an Imagely Gallery? This action cannot be undone.', 'nggallery' ), 'invalidBlockMessage' => \__( 'Invalid block. Please select a WordPress Gallery block.', 'nggallery' ), 'noImagesMessage' => \__( 'No images found in the gallery. Please add images before converting.', 'nggallery' ), 'errorMessage' => \__( 'An error occurred while converting the gallery.', 'nggallery' ), ] ); // Load translations for the gallery conversion script. \wp_set_script_translations( 'imagely-gallery-conversion', 'nggallery', NGG_PLUGIN_DIR . 'static/I18N' ); } /** * Enqueue the post thumbnails. * * @return void */ public function enqueue_post_thumbnails() { // Load new TypeScript build from adminApp $asset_file = NGG_PLUGIN_DIR . '/static/IGW/Block/build/post-thumbnail.asset.php'; $asset = file_exists( $asset_file ) ? include $asset_file : [ 'dependencies' => [], 'version' => NGG_SCRIPT_VERSION, ]; \wp_enqueue_script( 'ngg-post-thumbnails', StaticAssets::get_url( 'IGW/Block/build/post-thumbnail.min.js', 'photocrati-nextgen_block#build/post-thumbnail.min.js' ), $asset['dependencies'], $asset['version'], true ); // Localize with REST URLs for the new component-based picker \wp_localize_script( 'ngg-post-thumbnails', 'nggFeaturedImage', [ 'restUrl' => \rest_url( 'ngg/v1/admin/attach_to_post/' ), 'imageRestUrl' => \rest_url( 'ngg/v1/admin/block/image/' ), 'restNonce' => \wp_create_nonce( 'wp_rest' ), ] ); // Load translations for the post-thumbnail script \wp_set_script_translations( 'ngg-post-thumbnails', 'nggallery', NGG_PLUGIN_DIR . 'static/I18N' ); } } PK *P0]�!Hҭh �h Controller.phpnu �[��� <?php namespace Imagely\NGG\IGW; use Imagely\NGG\DataMappers\Album as AlbumMapper; use Imagely\NGG\DataMappers\DisplayType as DisplayTypeMapper; use Imagely\NGG\DataMappers\DisplayedGallery as DisplayedGalleryMapper; use Imagely\NGG\DataMappers\Gallery as GalleryMapper; use Imagely\NGG\DataMappers\Image as ImageMapper; use Imagely\NGG\Admin\FormManager; use Imagely\NGG\DisplayType\ControllerFactory; use Imagely\NGG\Display\StaticAssets; use Imagely\NGG\Display\StaticPopeAssets; use Imagely\NGG\Display\View; use Imagely\NGG\DisplayedGallery\Renderer; use Imagely\NGG\DisplayedGallery\SourceManager; use Imagely\NGG\Settings\Settings; use Imagely\NGG\Util\Router; use Imagely\NGG\Util\Security; use Imagely\NGG\Util\URL; /** * IGW controller. */ class Controller { /** * Instances cache. * * @var array */ public static $_instances = []; /** * Displayed gallery instance. * * @var object|null */ protected $displayed_gallery; /** * Parent controller instance. * * @var \C_NextGen_Admin_Page_Controller|null */ protected $parent = null; /** * Attach to post scripts. * * @var array */ protected $attach_to_post_scripts = []; /** * Attach to post styles. * * @var array */ protected $attach_to_post_styles = []; public function __construct() { $this->parent = \C_NextGen_Admin_Page_Controller::get_instance(); $this->_load_displayed_gallery(); if ( ! has_action( 'wp_print_scripts', [ $this, 'filter_scripts' ] ) ) { add_action( 'wp_print_scripts', [ $this, 'filter_scripts' ] ); } if ( ! has_action( 'wp_print_scripts', [ $this, 'filter_styles' ] ) ) { add_action( 'wp_print_scripts', [ $this, 'filter_styles' ] ); } } public static function get_instance( string $context = 'all' ): Controller { if ( ! isset( self::$_instances[ $context ] ) ) { self::$_instances[ $context ] = new Controller( $context ); } return self::$_instances[ $context ]; } /** * Necessary for compatibility with Pro. * * @TODO Remove when use of this method has been removed from Pro */ public static function has_method(): bool { return false; } public function _load_displayed_gallery() { $mapper = DisplayedGalleryMapper::get_instance(); // Fetch the displayed gallery by ID. $id = $this->parent->param( 'id' ); if ( $id ) { $this->displayed_gallery = $mapper->find( $id ); } elseif ( isset( $_REQUEST['shortcode'] ) && isset( $_REQUEST['nonce'] ) && \wp_verify_nonce( sanitize_text_field( wp_unslash( $_REQUEST['nonce'] ) ), 'ngg_attach_to_post_iframe' ) ) { // Fetch the displayed gallery by shortcode. $shortcode = base64_decode( isset( $_REQUEST['shortcode'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['shortcode'] ) ) : '' ); // $shortcode lacks the opening and closing brackets but still begins with 'ngg ' or 'ngg_images ' which are not parameters. $params = preg_replace( '/^(ngg|ngg_images) /i', '', $shortcode, 1 ); $params = stripslashes( $params ); $params = str_replace( [ '[', ']' ], [ '[', ']' ], $params ); $params = shortcode_parse_atts( $params ); $this->displayed_gallery = Renderer::get_instance()->params_to_displayed_gallery( $params ); } // If all else fails, then create fresh with a new displayed gallery. if ( empty( $this->displayed_gallery ) ) { $this->displayed_gallery = $mapper->create(); } } /** * Gets all dependencies for a particular resource that has been registered using wp_register_style/wp_register_script * * @param $handle * @param $type * * @return array */ public function get_resource_dependencies( $handle, $type ) { $retval = []; $wp_resources = $GLOBALS[ $type ]; // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict $index = array_search( $handle, $wp_resources->registered ); if ( $index !== false ) { $registered_script = $wp_resources->registered[ $index ]; if ( $registered_script->deps ) { foreach ( $registered_script->deps as $dep ) { $retval[] = $dep; $retval = array_merge( $retval, $this->get_script_dependencies( $handle ) ); } } } return $retval; } public function get_script_dependencies( $handle ) { return $this->get_resource_dependencies( $handle, 'wp_scripts' ); } public function get_style_dependencies( $handle ) { return $this->get_resource_dependencies( $handle, 'wp_styles' ); } public function get_ngg_provided_resources( $type ) { $wp_resources = $GLOBALS[ $type ]; $retval = []; foreach ( $wp_resources->queue as $handle ) { $script = $wp_resources->registered[ $handle ]; if ( strpos( $script->src, plugin_dir_url( NGG_PLUGIN_BASENAME ) ) !== false ) { $retval[] = $handle; } if ( defined( 'NGG_PRO_PLUGIN_BASENAME' ) && strpos( $script->src, plugin_dir_url( NGG_PRO_PLUGIN_BASENAME ) ) !== false ) { $retval[] = $handle; } if ( defined( 'NGG_PLUS_PLUGIN_BASENAME' ) && strpos( $script->src, plugin_dir_url( NGG_PLUS_PLUGIN_BASENAME ) ) !== false ) { $retval[] = $handle; } } return array_unique( $retval ); } public function get_ngg_provided_scripts() { return $this->get_ngg_provided_resources( 'wp_scripts' ); } public function get_ngg_provided_styles() { return $this->get_ngg_provided_resources( 'wp_styles' ); } public function get_igw_allowed_scripts() { $retval = []; foreach ( $this->get_ngg_provided_scripts() as $handle ) { $retval[] = $handle; $retval = array_merge( $retval, $this->get_script_dependencies( $handle ) ); } foreach ( $this->get_display_type_scripts() as $handle ) { $retval[] = $handle; $retval = array_merge( $retval, $this->get_script_dependencies( $handle ) ); } foreach ( $this->attach_to_post_scripts as $handle ) { $retval[] = $handle; $retval = array_merge( $retval, $this->get_script_dependencies( $handle ) ); } return array_unique( apply_filters( 'ngg_igw_approved_scripts', $retval ) ); } public function get_display_type_scripts() { global $wp_scripts; $wp_scripts->old_queue = $wp_scripts->queue; $wp_scripts->queue = []; $mapper = DisplayTypeMapper::get_instance(); foreach ( $mapper->find_all() as $display_type ) { $form = \C_Form::get_instance( $display_type->name ); $form->enqueue_static_resources(); } $retval = $wp_scripts->queue; $wp_scripts->queue = $wp_scripts->old_queue; unset( $wp_scripts->old_queue ); return $retval; } public function get_display_type_styles() { global $wp_styles; $wp_styles->old_queue = $wp_styles->queue; $wp_styles->queue = []; $mapper = DisplayTypeMapper::get_instance(); foreach ( $mapper->find_all() as $display_type ) { $form = \C_Form::get_instance( $display_type->name ); $form->enqueue_static_resources(); } $retval = $wp_styles->queue; $wp_styles->queue = $wp_styles->old_queue; unset( $wp_styles->old_queue ); return $retval; } public function get_igw_allowed_styles() { $retval = []; foreach ( $this->get_ngg_provided_styles() as $handle ) { $retval[] = $handle; $retval = array_merge( $retval, $this->get_style_dependencies( $handle ) ); } foreach ( $this->get_display_type_styles() as $handle ) { $retval[] = $handle; $retval = array_merge( $retval, $this->get_style_dependencies( $handle ) ); } foreach ( $this->attach_to_post_styles as $handle ) { $retval[] = $handle; $retval = array_merge( $retval, $this->get_style_dependencies( $handle ) ); } return array_unique( apply_filters( 'ngg_igw_approved_styles', $retval ) ); } public function filter_scripts() { global $wp_scripts; $new_queue = []; $current_queue = $wp_scripts->queue; $approved = $this->get_igw_allowed_scripts(); foreach ( $current_queue as $handle ) { // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict if ( in_array( $handle, $approved ) ) { $new_queue[] = $handle; } } $wp_scripts->queue = $new_queue; } public function filter_styles() { global $wp_styles; $new_queue = []; $current_queue = $wp_styles->queue; $approved = $this->get_igw_allowed_styles(); foreach ( $current_queue as $handle ) { // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict if ( in_array( $handle, $approved ) ) { $new_queue[] = $handle; } } $wp_styles->queue = $new_queue; } /** * Necessary for compatibility with Pro. * * @TODO Remove when use of this method has been removed from Pro * @return false */ public function mark_script( $handle ) { return false; } public function enqueue_display_tab_js() { // Enqueue backbone.js library, required by the Attach to Post display tab. wp_enqueue_script( 'backbone' ); // provided by WP. // Enqueue the backbone app for the display tab. Get all entities used by the display tab. $context = 'attach_to_post'; $gallery_mapper = GalleryMapper::get_instance(); $album_mapper = AlbumMapper::get_instance(); $image_mapper = ImageMapper::get_instance(); $display_type_mapper = DisplayTypeMapper::get_instance(); $sources = SourceManager::get_instance(); $router = Router::get_instance(); $settings = Settings::get_instance(); // Get the nextgen tags. global $wpdb; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery $tags = $wpdb->get_results( "SELECT DISTINCT name AS 'id', name FROM {$wpdb->terms} WHERE term_id IN ( SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'ngg_tag' )" ); $all_tags = new \stdClass(); $all_tags->name = 'All'; $all_tags->id = 'All'; array_unshift( $tags, $all_tags ); $display_types = []; $display_type_mapper->flush_query_cache(); $all_display_types = $display_type_mapper->find_all(); if ( \C_NextGEN_Bootstrap::get_pro_api_version() >= 4.0 ) { foreach ( $all_display_types as $display_type ) { $available = ControllerFactory::has_controller( $display_type->name ); if ( ! \apply_filters( 'ngg_atp_show_display_type', $available, $display_type ) ) { continue; } if ( ! ControllerFactory::has_controller( $display_type->name ) ) { continue; } $controller = ControllerFactory::get_controller( $display_type->name ); if ( $controller->is_hidden_from_igw() ) { continue; } $display_type->preview_image_url = $controller->get_preview_image_url(); $display_types[] = $display_type; } } else { foreach ( $all_display_types as $display_type ) { if ( ( isset( $display_type->hidden_from_igw ) && $display_type->hidden_from_igw ) || ( isset( $display_type->hidden_from_ui ) && $display_type->hidden_from_ui ) ) { continue; } $available = ControllerFactory::has_controller( $display_type->name ); if ( ! $available && class_exists( '\C_Component_Registry' ) ) { $available = \C_Component_Registry::get_instance()->is_module_loaded( $display_type->name ); if ( ! $available && defined( 'NGG_PRO_ALBUMS' ) // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict && in_array( $display_type->name, [ \NGG_PRO_LIST_ALBUM, \NGG_PRO_GRID_ALBUM ] ) ) { $available = true; } } if ( ! \apply_filters( 'ngg_atp_show_display_type', $available, $display_type ) ) { continue; } if ( ControllerFactory::has_controller( $display_type->name ) ) { $controller = ControllerFactory::get_controller( $display_type->name ); $display_type->preview_image_url = $controller->get_preview_image_url(); } else { $display_type->preview_image_url = StaticPopeAssets::get_url( $display_type->preview_image_relpath ); } $display_types[] = $display_type; } } usort( $display_types, [ $this, '_display_type_list_sort' ] ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter \wp_enqueue_script( 'ngg_display_tab', StaticAssets::get_url( 'AttachToPost/display_tab.js', 'photocrati-attach_to_post#display_tab.js' ), [ 'jquery', 'backbone', 'photocrati_ajax' ], NGG_SCRIPT_VERSION ); \wp_localize_script( 'ngg_display_tab', 'igw_data', [ 'displayed_gallery_preview_url' => $router->get_url( '/' . NGG_ATTACH_TO_POST_SLUG . '/preview', false ), 'displayed_gallery' => $this->displayed_gallery->get_entity(), 'sources' => $sources->get_all(), 'gallery_primary_key' => $gallery_mapper->get_primary_key_column(), 'galleries' => $gallery_mapper->find_all(), 'albums' => $album_mapper->find_all(), 'tags' => $tags, 'display_types' => $display_types, 'nonce' => wp_create_nonce( 'wp_rest' ), 'image_primary_key' => $image_mapper->get_primary_key_column(), 'display_type_priority_base' => NGG_DISPLAY_PRIORITY_BASE, 'display_type_priority_step' => NGG_DISPLAY_PRIORITY_STEP, // Nonce verification has already been performed by the methods that invoke this method. // phpcs:ignore WordPress.Security.NonceVerification.Recommended 'shortcode_ref' => isset( $_REQUEST['ref'] ) ? floatval( sanitize_text_field( wp_unslash( $_REQUEST['ref'] ) ) ) : null, 'shortcode_defaults' => [ 'order_by' => $settings->get( 'galSort' ), 'order_direction' => $settings->get( 'galSortDir' ), 'returns' => 'included', 'maximum_entity_count' => $settings->get( 'maximum_entity_count' ), ], 'shortcode_attr_replacements' => [ 'source' => 'src', 'container_ids' => 'ids', 'display_type' => 'display', ], 'i18n' => [ 'sources' => \__( 'Are you inserting a Gallery (default), an Album, or images based on Tags?', 'nggallery' ), 'optional' => \__( '(optional)', 'nggallery' ), 'slug_tooltip' => \__( 'Sets an SEO-friendly name to this gallery for URLs. Currently only in use by the Pro Lightbox', 'nggallery' ), 'slug_label' => \__( 'Slug', 'nggallery' ), 'no_entities' => \__( 'No entities to display for this source', 'nggallery' ), 'exclude_question' => \__( 'Exclude?', 'nggallery' ), 'select_gallery' => \__( 'Select a Gallery', 'nggallery' ), 'galleries' => \__( 'Select one or more galleries (click in box to see available galleries).', 'nggallery' ), 'albums' => \__( 'Select one album (click in box to see available albums).', 'nggallery' ), ], ] ); } public function start_resource_monitoring() { global $wp_scripts, $wp_styles; $this->attach_to_post_scripts = []; $this->attach_to_post_styles = []; $wp_styles->before_monitoring = $wp_styles->queue; $wp_scripts->before_monitoring = $wp_styles->queue; } public function stop_resource_monitoring() { global $wp_scripts, $wp_styles; $this->attach_to_post_scripts = array_diff( $wp_scripts->queue, $wp_scripts->before_monitoring ); $this->attach_to_post_styles = array_diff( $wp_styles->queue, $wp_styles->before_monitoring ); } public function enqueue_backend_resources() { $this->start_resource_monitoring(); // Enqueue frame event publishing. \wp_enqueue_script( 'frame_event_publisher' ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter \wp_enqueue_script( 'ngg_tabs', StaticAssets::get_url( 'AttachToPost/ngg_tabs.js', 'photocrati-attach_to_post#ngg_tabs.js' ), [ 'jquery-ui-tabs', 'jquery-ui-sortable', 'jquery-ui-tooltip', 'jquery-ui-accordion' ], NGG_SCRIPT_VERSION ); \wp_enqueue_style( 'buttons' ); // Ensure select2. \wp_enqueue_style( 'ngg_select2' ); \wp_enqueue_script( 'ngg_select2' ); // Ensure that the Photocrati AJAX library is loaded. \wp_enqueue_script( 'photocrati_ajax' ); // Enqueue logic for the Attach to Post interface as a whole. // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter \wp_enqueue_script( 'ngg_attach_to_post_js', StaticAssets::get_url( 'AttachToPost/attach_to_post.js', 'photocrati-attach_to_post#attach_to_post.js' ), [], NGG_SCRIPT_VERSION ); \wp_enqueue_style( 'ngg_attach_to_post', StaticAssets::get_url( 'AttachToPost/attach_to_post.css', 'photocrati-attach_to_post#attach_to_post.css' ), [], NGG_SCRIPT_VERSION ); \wp_dequeue_script( 'debug-bar-js' ); \wp_dequeue_style( 'debug-bar-css' ); $this->enqueue_display_tab_js(); if ( ! \M_Marketing::is_plus_or_pro_enabled() ) { $marketing = new Marketing(); $marketing->enqueue_display_tab_js(); } \do_action( 'ngg_igw_enqueue_scripts' ); \do_action( 'ngg_igw_enqueue_styles' ); $this->stop_resource_monitoring(); } /** * Renders the interface * * @param bool $return_output * @return string */ public function index_action( $return_output = true ) { $parent = \C_NextGen_Admin_Page_Controller::get_instance(); $parent->enqueue_backend_resources(); $parent->do_not_cache(); $this->enqueue_backend_resources(); \wp_enqueue_style( 'nggadmin', NGGALLERY_URLPATH . 'admin/css/nggadmin.css', [], NGG_SCRIPT_VERSION, 'screen' ); \do_action( 'admin_enqueue_scripts' ); // If Elementor is also active a fatal error is generated due to this method not existing. if ( ! function_exists( 'wp_print_media_templates' ) ) { require_once ABSPATH . WPINC . '/media-template.php'; } $view = new View( 'AttachToPost/attach_to_post', [ 'page_title' => $this->_get_page_title(), 'tabs' => $this->_get_main_tabs(), 'logo' => StaticPopeAssets::get_url( 'photocrati-nextgen_admin#imagely_icon.png' ), ], 'photocrati-attach_to_post#attach_to_post' ); return $view->render( $return_output ); } /** * Returns the page title of the Attach to Post interface * * @return string */ public function _get_page_title() { return \__( 'NextGEN Gallery - Attach To Post', 'nggallery' ); } /** * Returns the main tabs displayed on the Attach to Post interface * * @return array */ public function _get_main_tabs() { $retval = []; if ( Security::is_allowed( 'NextGEN Manage gallery' ) ) { $retval['displayed_tab'] = [ 'content' => $this->_render_display_tab(), 'title' => \__( 'Insert Into Page', 'nggallery' ), ]; } if ( Security::is_allowed( 'NextGEN Upload images' ) ) { $retval['create_tab'] = [ 'content' => $this->_render_create_tab(), 'title' => \__( 'Upload Images', 'nggallery' ), ]; } if ( Security::is_allowed( 'NextGEN Manage others gallery' ) && Security::is_allowed( 'NextGEN Manage gallery' ) ) { $retval['galleries_tab'] = [ 'content' => $this->_render_galleries_tab(), 'title' => \__( 'Manage Galleries', 'nggallery' ), ]; } if ( Security::is_allowed( 'NextGEN Edit album' ) ) { $retval['albums_tab'] = [ 'content' => $this->_render_albums_tab(), 'title' => \__( 'Manage Albums', 'nggallery' ), ]; } return apply_filters( 'ngg_attach_to_post_main_tabs', $retval ); } /** * Renders a NextGen Gallery page in an iframe, suited for the attach to post * interface * * @param string $page * @param null|int $tab_id (optional) * @return string */ public function _render_ngg_page_in_frame( $page, $tab_id = null ) { $frame_url = \admin_url( "/admin.php?page={$page}&attach_to_post" ); $frame_url = Router::esc_url( $frame_url ); if ( $tab_id ) { $tab_id = " id='ngg-iframe-{$tab_id}'"; } return "<iframe name='{$page}' frameBorder='0'{$tab_id} class='ngg-attach-to-post ngg-iframe-page-{$page}' scrolling='yes' src='{$frame_url}'></iframe>"; } /** * Renders the display tab for adjusting how images/galleries will be displayed * * @return string */ public function _render_display_tab() { $view = new View( 'AttachToPost/display_tab', [ 'messages' => [], 'displayed_gallery' => $this->displayed_gallery, 'tabs' => $this->_get_display_tabs(), ], 'photocrati-attach_to_post#display_tab' ); return $view->render( true ); } /** * Renders the tab used primarily for Gallery and Image creation * * @return string */ public function _render_create_tab() { return $this->_render_ngg_page_in_frame( 'ngg_addgallery', 'create_tab' ); } /** * Renders the tab used for Managing Galleries * * @return string */ public function _render_galleries_tab() { return $this->_render_ngg_page_in_frame( 'nggallery-manage-gallery', 'galleries_tab' ); } /** * Renders the tab used for Managing Albums. */ public function _render_albums_tab() { return $this->_render_ngg_page_in_frame( 'nggallery-manage-album', 'albums_tab' ); } public function _display_type_list_sort( $type_1, $type_2 ) { $order_1 = $type_1->view_order; $order_2 = $type_2->view_order; if ( $order_1 == null ) { $order_1 = NGG_DISPLAY_PRIORITY_BASE; } if ( $order_2 == null ) { $order_2 = NGG_DISPLAY_PRIORITY_BASE; } if ( $order_1 > $order_2 ) { return 1; } if ( $order_1 < $order_2 ) { return -1; } return 0; } /** * Gets a list of tabs to render for the "Display" tab */ public function _get_display_tabs() { // The ATP requires more memmory than some applications, somewhere around 60MB. // Because it's such an important feature of NextGEN Gallery, we temporarily disable // any memory limits. if ( ! extension_loaded( 'suhosin' ) ) { wp_raise_memory_limit(); } return [ 'choose_display_tab' => $this->_render_choose_display_tab(), 'display_settings_tab' => $this->_render_display_settings_tab(), 'preview_tab' => $this->_render_preview_tab(), ]; } /** * Renders the accordion tab, "What would you like to display?" */ public function _render_choose_display_tab() { return [ 'id' => 'choose_display', 'title' => \__( 'Choose Display', 'nggallery' ), 'content' => $this->_render_display_source_tab_contents() . $this->_render_display_type_tab_contents(), ]; } /** * Renders the contents of the source tab * * @return string */ public function _render_display_source_tab_contents() { $view = new View( 'AttachToPost/display_tab_source', [ 'i18n' => [], ], 'photocrati-attach_to_post#display_tab_source' ); return $view->render( true ); } /** * Renders the contents of the display type tab */ public function _render_display_type_tab_contents() { $view = new View( 'AttachToPost/display_tab_type', [], 'photocrati-attach_to_post#display_tab_type' ); return $view->render( true ); } /** * Renders the display settings tab for the Attach to Post interface * * @return array */ public function _render_display_settings_tab() { return [ 'id' => 'display_settings_tab', 'title' => \__( 'Customize Display Settings', 'nggallery' ), 'content' => $this->_render_display_settings_contents(), ]; } /** * If editing an existing displayed gallery, retrieves the name * of the display type * * @return string */ public function _get_selected_display_type_name() { $retval = ''; if ( $this->displayed_gallery ) { $retval = $this->displayed_gallery->display_type; } return $retval; } /** * Is the displayed gallery that's being edited using the specified display * type? * * @param string $name name of the display type * @return bool */ public function is_displayed_gallery_using_display_type( $name ) { $retval = false; if ( $this->displayed_gallery ) { $retval = $this->displayed_gallery->display_type == $name; } return $retval; } /** * Renders the contents of the display settings tab * * @return string */ public function _render_display_settings_contents() { $retval = []; // Get all display setting forms. $form_manager = FormManager::get_instance(); $forms = $form_manager->get_forms( NGG_DISPLAY_SETTINGS_SLUG, true ); // Display each form. foreach ( $forms as $form ) { // Enqueue the form's static resources. $form->enqueue_static_resources(); // Determine which classes to use for the form's "class" attribute. $model = $form->get_model(); if ( null === $model ) { continue; } $current = $this->is_displayed_gallery_using_display_type( $model->name ); $css_class = $current ? 'display_settings_form' : 'display_settings_form hidden'; $defaults = $model->settings; // If this form is used to provide the display settings for the current // displayed gallery, then we need to override the forms settings // with the displayed gallery settings. if ( $current ) { $settings = $this->parent->array_merge_assoc( $model->settings, $this->displayed_gallery->display_settings, true ); $model->settings = $settings; } // Output the display settings form. $view = new View( 'AttachToPost/display_settings_form', [ 'settings' => $form->render(), 'display_type_name' => $model->name, 'css_class' => $css_class, 'defaults' => $defaults, ], 'photocrati-attach_to_post#display_settings_form' ); $retval[] = $view->render( true ); } // In addition, we'll render a form that will be displayed when no display type has been selected in the // Attach to Post interface. Render the default "no display type selected" view. $css_class = $this->_get_selected_display_type_name() ? 'display_settings_form hidden' : 'display_settings_form'; $view = new View( 'AttachToPost/no_display_type_selected', [ 'no_display_type_selected' => \__( 'No display type selected', 'nggallery' ), 'css_class' => $css_class, ], 'photocrati-attach_to_post#no_display_type_selected' ); $retval[] = $view->render( true ); // Return all display setting forms. return implode( "\n", $retval ); } /** * Renders the tab used to preview included images * * @return array */ public function _render_preview_tab() { return [ 'id' => 'preview_tab', 'title' => \__( 'Sort or Exclude Images', 'nggallery' ), 'content' => $this->_render_preview_tab_contents(), ]; } /** * Renders the contents of the "Preview" tab. * * @return string */ public function _render_preview_tab_contents() { $view = new View( 'AttachToPost/preview_tab', [], 'photocrati-attach_to_post#preview_tab' ); return $view->render( true ); } } PK *P0]����� � Marketing.phpnu �[��� <?php namespace Imagely\NGG\IGW; use Imagely\NGG\Display\StaticAssets; use Imagely\NGG\Display\View; /** * Marketing class for IGW. */ class Marketing { public function new_pro_display_type_upsell( $id, $name, $title = '', $preview_mvc_path = null ) { return [ 'ID' => $id, 'default_source' => 'galleries', 'entity_types' => [ 'image' ], 'hidden_from_igw' => false, 'hidden_from_ui' => false, 'name' => $name, 'title' => $title, 'preview_image_url' => $preview_mvc_path ? StaticAssets::get_url( $preview_mvc_path ) : '', ]; } public function get_pro_display_types() { return [ $this->new_pro_display_type_upsell( -1, 'pro-tile', __( 'Pro Tile', 'nggallery' ), 'IGW/Marketing/pro-tile-preview.jpg' ), $this->new_pro_display_type_upsell( -2, 'pro-mosaic', __( 'Pro Mosaic', 'nggallery' ), 'IGW/Marketing/pro-mosaic-preview.jpg' ), $this->new_pro_display_type_upsell( -3, 'pro-masonry', __( 'Pro Masonry', 'nggallery' ), 'IGW/Marketing/pro-masonry-preview.jpg' ), $this->new_pro_display_type_upsell( -4, 'igw-promo' ), ]; } public function get_marketing_cards() { $pro_tile = new \C_Marketing_Block_Popup( __( 'Pro Tile Gallery', 'nggallery' ), \M_Marketing::get_i18n_fragment( 'feature_not_available', __( 'the Pro Tile Gallery', 'nggallery' ) ), \M_Marketing::get_i18n_fragment( 'lite_coupon' ), StaticAssets::get_url( 'IGW/Marketing/pro-tile-preview.jpg' ), 'igw', 'tiledgallery' ); $pro_masonry = new \C_Marketing_Block_Popup( __( 'Pro Masonry Gallery', 'nggallery' ), \M_Marketing::get_i18n_fragment( 'feature_not_available', __( 'the Pro Masonry Gallery', 'nggallery' ) ), \M_Marketing::get_i18n_fragment( 'lite_coupon' ), StaticAssets::get_url( 'IGW/Marketing/pro-masonry-preview.jpg' ), 'igw', 'masonrygallery' ); $pro_mosaic = new \C_Marketing_Block_Popup( __( 'Pro Mosaic Gallery', 'nggallery' ), \M_Marketing::get_i18n_fragment( 'feature_not_available', __( 'the Pro Mosaic Gallery', 'nggallery' ) ), \M_Marketing::get_i18n_fragment( 'lite_coupon' ), StaticAssets::get_url( 'IGW/Marketing/pro-mosaic-preview.jpg' ), 'igw', 'mosaicgallery' ); return [ 'pro-tile' => '<div>' . $pro_tile->render() . '</div>', 'pro-masonry' => '<div>' . $pro_masonry->render() . '</div>', 'pro-mosaic' => '<div>' . $pro_mosaic->render() . '</div>', ]; } public function enqueue_display_tab_js() { $view = new View( 'IGW/marketing' ); $data = [ 'display_types' => $this->get_pro_display_types(), 'i18n' => [ 'get_pro' => __( 'Requires NextGEN Pro', 'nggallery' ), ], 'templates' => $this->get_marketing_cards(), 'igw_promo' => $view->render( true ), ]; \wp_enqueue_style( 'jquery-modal' ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter \wp_enqueue_script( 'igw_display_type_upsells', StaticAssets::get_url( 'IGW/Marketing/igw_display_type_upsells.js' ), [ 'ngg_display_tab', 'jquery-modal' ], NGG_SCRIPT_VERSION ); \wp_localize_script( 'igw_display_type_upsells', 'igw_display_type_upsells', $data ); \M_Marketing::enqueue_blocks_style(); \wp_add_inline_style( 'ngg_attach_to_post', '.display_type_preview:nth-child(5) {clear: both;} .ngg-marketing-block-display-type-settings label {color: darkgray !important;}' ); } } PK *P0]ϝ7� � EventPublisher.phpnu �[��� <?php namespace Imagely\NGG\IGW; use Imagely\NGG\DataMappers\Gallery as GalleryMapper; use Imagely\NGG\Display\StaticAssets; use Imagely\NGG\Settings\Settings; use Imagely\NGG\Settings\GlobalSettings; /** * Event publisher for IGW. */ class EventPublisher { /** * Instance cache. * * @var EventPublisher|null */ protected static $instance = null; /** * Setting name. * * @var string|null */ protected $setting_name = null; public function __construct() { $this->setting_name = Settings::get_instance()->get( 'frame_event_cookie_name' ); } public function register_hooks() { add_action( 'init', [ $this, 'register_script' ] ); add_filter( 'ngg_admin_script_handles', [ $this, 'add_script_to_ngg_pages' ] ); add_action( 'ngg_enqueue_frame_event_publisher_script', [ $this, 'enqueue_script' ] ); // Elementor's editor.php runs `new \WP_Scripts()` which requires we register scripts on both init and this // action if we want the attach-to-post code to function (which relies on frame_event_publisher). add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'register_script' ] ); // Emit frame communication events. if ( $this->does_request_require_frame_communication() ) { add_action( 'ngg_created_new_gallery', [ $this, 'new_gallery_event' ] ); add_action( 'ngg_after_new_images_added', [ $this, 'images_added_event' ] ); add_action( 'ngg_page_event', [ $this, 'nextgen_page_event' ] ); add_action( 'ngg_manage_tags', [ $this, 'manage_tags_event' ] ); } } public static function get_instance() { if ( ! isset( self::$instance ) ) { self::$instance = new EventPublisher(); } return self::$instance; } /** * Encodes data for a setting * * @param array $data * @return string */ // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- false positive, no user input here protected function encode( $data ) { return \rawurlencode( \wp_json_encode( $data ) ); } /** * Decodes data from a setting * * @param string $data * @return array */ protected function decode( $data ) { return (array) \json_decode( \rawurldecode( $data ) ); } /** * Adds a setting to the frame events * * @param array $data * @return array */ public function add_event( $data ) { $id = \md5( \wp_json_encode( $data ) ); $data['context'] = 'attach_to_post'; $write_cookie = true; if ( \defined( 'XMLRPC_REQUEST' ) ) { $write_cookie = XMLRPC_REQUEST == false; } if ( $write_cookie ) { \setrawcookie( $this->setting_name . '_' . $id, $this->encode( $data ), \time() + 10800, '/', \wp_parse_url( \site_url(), PHP_URL_HOST ) ); } return $data; } /* TODO: Determine if this is necessary and remove it */ public function add_script_to_ngg_pages( $scripts ) { $scripts['frame_event_publisher'] = NGG_SCRIPT_VERSION; return $scripts; } public function enqueue_script() { // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter wp_enqueue_script( 'frame_event_publisher' ); wp_localize_script( 'frame_event_publisher', 'frame_event_publisher_domain', [ wp_parse_url( site_url(), PHP_URL_HOST ) ] ); } public function register_script() { // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter wp_register_script( 'frame_event_publisher', StaticAssets::get_url( 'IGW/frame_event_publisher.js', 'photocrati-frame_communication#frame_event_publisher.js' ), [ 'jquery' ], NGG_SCRIPT_VERSION ); } public function does_request_require_frame_communication(): bool { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- $_SERVER['HTTP_REFERER'] is sanitized with wp_unslash on line 114 $http_referer = isset( $_SERVER['HTTP_REFERER'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_REFERER'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only request parameter for routing return ( strpos( $request_uri, 'attach_to_post' ) !== false || ( $http_referer !== '' && strpos( $http_referer, 'attach_to_post' ) !== false ) || array_key_exists( 'attach_to_post', $_REQUEST ) ); } /** * Notify frames that a new gallery has been created * * @param int $gallery_id */ public function new_gallery_event( $gallery_id ) { $gallery = GalleryMapper::get_instance()->find( $gallery_id ); if ( $gallery ) { $this->add_event( [ 'event' => 'new_gallery', 'gallery_id' => intval( $gallery_id ), 'gallery_title' => $gallery->title, ] ); } } /** * Notifies a frame that images have been added to a gallery * * @param int $gallery_id * @param array $image_ids */ public function images_added_event( $gallery_id, $image_ids = [] ) { $this->add_event( [ 'event' => 'images_added', 'gallery_id' => intval( $gallery_id ), ] ); } /** * Notifies a frame that an action has been performed on a particular NextGEN page * * @param array $event */ public function nextgen_page_event( $event ) { $this->add_event( $event ); } /** * Notifies a frame that the tags have changed * * @param array $tags */ public function manage_tags_event( $tags = [] ) { $this->add_event( [ 'event' => 'manage_tags', 'tags' => $tags, ] ); } } PK *P0]�[��v7 v7 ATPManager.phpnu �[��� <?php namespace Imagely\NGG\IGW; use Imagely\NGG\DataMappers\DisplayedGallery as DisplayedGalleryMapper; use Imagely\NGG\DataStorage\Manager as StorageManager; use Imagely\NGG\Display\{DisplayManager, StaticAssets, View}; use Imagely\NGG\DisplayedGallery\Renderer; use Imagely\NGG\Settings\Settings; use Imagely\NGG\Util\{Security, URL}; /** * Attach to Post manager. */ class ATPManager { /** * TinyMCE plugin name. * * @var string */ public $attach_to_post_tinymce_plugin = 'NextGEN_AttachToPost'; /** * Whether to substitute placeholders. * * @var bool */ public static $substitute_placeholders = true; /** * Instance cache. * * @var ATPManager|null */ protected static $instance = null; public static function get_instance() { if ( ! isset( self::$instance ) ) { self::$instance = new ATPManager(); } return self::$instance; } public static function is_atp_url() { return isset( $_SERVER['REQUEST_URI'] ) && strpos( strtolower( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ), NGG_ATTACH_TO_POST_SLUG ) !== false; } public function register_hooks() { add_filter( 'wpseo_opengraph_image', [ $this, 'hide_preview_image_from_yoast' ] ); add_filter( 'wpseo_twitter_image', [ $this, 'hide_preview_image_from_yoast' ] ); add_filter( 'wpseo_sitemap_urlimages', [ $this, 'remove_preview_images_from_yoast_sitemap' ], null, 2 ); // Admin-only hooks. if ( is_admin() ) { add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_static_resources' ], -100 ); // Elementor's editor.php runs `new \WP_Scripts()` which requires we enqueue scripts on both // admin_enqueue_scripts and this action if we want our resources to be used with the page builder. add_action( 'elementor/editor/after_enqueue_scripts', [ $this, 'enqueue_static_resources' ] ); add_action( 'media_buttons', [ $this, 'add_media_button' ], 15 ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_tinymce_resources' ] ); add_filter( 'mce_buttons', [ $this, 'add_attach_to_post_button' ] ); add_filter( 'mce_external_plugins', [ $this, 'add_attach_to_post_tinymce_plugin' ] ); add_filter( 'wp_mce_translation', [ $this, 'add_attach_to_post_tinymce_i18n' ] ); add_action( 'admin_print_scripts', [ $this, 'print_tinymce_placeholder_template' ] ); add_action( 'admin_init', [ $this, 'route_insert_gallery_window' ] ); } // Add hook to substitute displayed gallery placeholders. if ( ! is_admin() ) { add_filter( 'the_content', [ $this, 'substitute_placeholder_imgs' ], PHP_INT_MAX, 1 ); } } /** * Route the IGW requests using wp-admin */ public function route_insert_gallery_window() { if ( isset( $_REQUEST[ NGG_ATTACH_TO_POST_SLUG ] ) && isset( $_REQUEST['nonce'] ) && \wp_verify_nonce( sanitize_text_field( wp_unslash( $_REQUEST['nonce'] ) ), 'ngg_attach_to_post_iframe' ) ) { // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Controller()->index_action() returns safe HTML print ( new Controller() )->index_action(); exit(); } } /** * Renders the underscore template used by TinyMCE for IGW placeholders */ public function print_tinymce_placeholder_template() { // Only render on post/page/site-editor screens, not on every admin page. See #801. if ( ! $this->is_new_or_edit_post_screen() ) { return; } $view = new View( 'AttachToPost/tinymce_placeholder', [], 'photocrati-attach_to_post#tinymce_placeholder' ); $template = $view->find_template_abspath( 'AttachToPost/tinymce_placeholder', 'photocrati-attach_to_post#tinymce_placeholder' ); readfile( $template ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_readfile } /** * Prevents ATP preview image placeholders from being used as opengraph / twitter metadata * * @param string $image * @return null|string */ public function hide_preview_image_from_yoast( $image ) { if ( strpos( $image, NGG_ATTACH_TO_POST_SLUG ) !== false ) { return null; } return $image; } /** * Removes IGW preview/placeholder images from Yoast's sitemap * * @param $images * @param $post_id * @return array */ public function remove_preview_images_from_yoast_sitemap( $images, $post_id ) { $retval = []; foreach ( $images as $image ) { if ( strpos( $image['src'], NGG_ATTACH_TO_POST_SLUG ) === false ) { $retval[] = $image; } elseif ( preg_match( '/(\d+)$/', $image['src'], $match ) ) { // Lookup images for the displayed gallery. $displayed_gallery_id = $match[1]; $mapper = DisplayedGalleryMapper::get_instance(); $displayed_gallery = $mapper->find( $displayed_gallery_id, true ); if ( $displayed_gallery ) { $gallery_storage = StorageManager::get_instance(); $settings = Settings::get_instance(); $source_obj = $displayed_gallery->get_source(); // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict if ( in_array( 'image', $source_obj->returns ) ) { foreach ( $displayed_gallery->get_entities() as $image ) { $named_image_size = $settings->get( 'imgAutoResize' ) ? 'full' : 'thumb'; $sitemap_image = [ 'src' => $gallery_storage->get_image_url( $image, $named_image_size ), 'alt' => $image->alttext, 'title' => $image->description ? $image->description : $image->alttext, ]; $retval[] = $sitemap_image; } } } } } return $retval; } /** * In 2.0.66.X and earlier, ATP placeholder images used a different url than what 2.0.69 uses and must be converted. * * @param string $content * @return string */ public function fix_preview_images( $content ) { $content = str_replace( site_url( '/' . NGG_ATTACH_TO_POST_SLUG . '/preview/id--' ), admin_url( '/?' . NGG_ATTACH_TO_POST_SLUG . '=' . NGG_ATTACH_TO_POST_SLUG . '/preview/id--' ), $content ); $content = str_replace( site_url( '/index.php/' . NGG_ATTACH_TO_POST_SLUG . '/preview/id--' ), admin_url( '/?' . NGG_ATTACH_TO_POST_SLUG . '=' . NGG_ATTACH_TO_POST_SLUG . '/preview/id--' ), $content ); return $content; } public function add_media_button() { $search = [ Security::is_allowed( 'NextGEN Attach Interface' ), Security::is_allowed( 'NextGEN Use TinyMCE' ), ]; // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict if ( in_array( false, $search ) ) { return; } $button_url = StaticAssets::get_url( 'AttachToPost/igw_button.png', 'photocrati-attach_to_post#igw_button.png' ); $label = \__( 'Add Gallery', 'nggallery' ); $igw_url = admin_url( '/?' . NGG_ATTACH_TO_POST_SLUG . '=1' ); $igw_url .= '&nonce=' . \wp_create_nonce( 'ngg_attach_to_post_iframe' ); $igw_url .= '&KeepThis=true&TB_iframe=true&height=600&width=1000'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- printf with esc_url and esc_html for safe output printf( '<a href="%s" data-editor="content" class="button ngg-add-gallery thickbox" id="ngg-media-button" class="button" ><img src="%s" style="padding:0 4px 0 0; margin-left: -2px; margin-top:-3px; max-width: 20px;">%s</a>', esc_url( $igw_url ), esc_url( $button_url ), esc_html( $label ) ); } /** * Substitutes the gallery placeholder content with the gallery type frontend * view, returns a list of static resources that need to be loaded * * @param string $content */ public function substitute_placeholder_imgs( $content ) { $content = $this->fix_preview_images( $content ); // To match ATP entries we compare the stored url against a generic path; entries MUST have a gallery ID. if ( preg_match_all( '#<img.*http(s)?://(.*)?' . NGG_ATTACH_TO_POST_SLUG . '(=|/)preview(/|&|&)id(=|--)(\\d+).*?>#mi', $content, $matches, PREG_SET_ORDER ) ) { $mapper = DisplayedGalleryMapper::get_instance(); foreach ( $matches as $match ) { // Find the displayed gallery. $displayed_gallery_id = $match[6]; $displayed_gallery = $mapper->find( $displayed_gallery_id, true ); // Get the content for the displayed gallery. $retval = '<p>' . __( 'Invalid Displayed Gallery' ) . '</p>'; if ( $displayed_gallery ) { $retval = ''; $renderer = Renderer::get_instance(); if ( defined( 'NGG_SHOW_DISPLAYED_GALLERY_ERRORS' ) && NGG_SHOW_DISPLAYED_GALLERY_ERRORS && ! $displayed_gallery->is_valid() ) { $retval .= wp_json_encode( $displayed_gallery->validation() ); } if ( self::$substitute_placeholders ) { $retval .= $renderer->render( $displayed_gallery, true ); } } $content = str_replace( $match[0], $retval, $content ); } } return $content; } /** * Enqueues static resources required by the Attach-To-Post interface */ public function enqueue_static_resources() { // Enqueue resources needed at post/page level. if ( $this->is_new_or_edit_post_screen() ) { // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter \wp_enqueue_script( 'nextgen_admin_js' ); \wp_enqueue_style( 'nextgen_admin_css' ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter \wp_enqueue_script( 'frame_event_publisher' ); DisplayManager::enqueue_fontawesome(); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter \wp_register_script( 'Base64', StaticAssets::get_url( 'AttachToPost/base64.js', 'photocrati-attach_to_post#base64.js' ), [], NGG_SCRIPT_VERSION ); \wp_enqueue_style( 'ngg_attach_to_post_dialog', StaticAssets::get_url( 'AttachToPost/attach_to_post_dialog.css', 'photocrati-attach_to_post#attach_to_post_dialog.css' ), [ 'gritter' ], NGG_SCRIPT_VERSION ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter \wp_enqueue_script( 'ngg-igw', StaticAssets::get_url( 'AttachToPost/igw.js', 'photocrati-attach_to_post#igw.js' ), [ 'jquery', 'Base64', 'gritter' ], NGG_SCRIPT_VERSION ); \wp_localize_script( 'ngg-igw', 'ngg_igw_i18n', [ 'nextgen_gallery' => \__( 'NextGEN Gallery', 'nggallery' ), 'edit' => \__( 'Edit', 'nggallery' ), 'remove' => \__( 'Delete', 'nggallery' ), ] ); // Nonce verification is not necessary here: we are only enqueueing resources for the IGW iframe children. // phpcs:disable WordPress.Security.NonceVerification.Recommended } elseif ( isset( $_REQUEST['attach_to_post'] ) || isset( $_REQUEST['nextgen-attach_to_post'] ) || ( isset( $_REQUEST['page'] ) && false !== strpos( sanitize_text_field( wp_unslash( $_REQUEST['page'] ) ), 'nggallery' ) ) ) { // phpcs:enable WordPress.Security.NonceVerification.Recommended // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter \wp_enqueue_script( 'iframely', StaticAssets::get_url( 'AttachToPost/iframely.js', 'photocrati-attach_to_post#iframely.js' ), [], NGG_SCRIPT_VERSION ); \wp_enqueue_style( 'iframely', StaticAssets::get_url( 'AttachToPost/iframely.css', 'photocrati-attach_to_post#iframely.css' ), [], NGG_SCRIPT_VERSION ); \wp_enqueue_style( 'nextgen_addgallery_page' ); \wp_enqueue_style( 'ngg_marketing_blocks_style' ); \wp_enqueue_style( 'uppy' ); \wp_enqueue_script( 'nextgen_admin_js' ); \wp_enqueue_style( 'nextgen_admin_css' ); } } public function is_new_or_edit_post_screen() { return isset( $_SERVER['SCRIPT_NAME'] ) && preg_match( '/\/wp-admin\/(post|post-new|site-editor)\.php$/', sanitize_text_field( wp_unslash( $_SERVER['SCRIPT_NAME'] ) ) ); } public function can_use_tinymce() { $checks = [ Security::is_allowed( 'NextGEN Attach Interface' ), Security::is_allowed( 'NextGEN Use TinyMCE' ), \get_user_option( 'rich_editing' ) == 'true', ]; // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict return ! in_array( false, $checks ); } /** * Enqueues resources needed by the TinyMCE editor */ public function enqueue_tinymce_resources() { if ( $this->is_new_or_edit_post_screen() ) { \add_editor_style( 'https://fonts.googleapis.com/css?family=Lato' ); \add_editor_style( StaticAssets::get_url( 'AttachToPost/ngg_attach_to_post_tinymce_plugin.css', 'photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.css' ) ); \wp_enqueue_script( 'photocrati_ajax' ); \wp_localize_script( 'media-editor', 'igw', [ 'url' => \admin_url( '/?' . NGG_ATTACH_TO_POST_SLUG . '=1' ), ] ); \wp_localize_script( 'photocrati_ajax', 'ngg_tinymce_plugin', [ 'url' => add_query_arg( 'ver', NGG_SCRIPT_VERSION, StaticAssets::get_url( 'AttachToPost/ngg_attach_to_post_tinymce_plugin.js', 'photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.js' ) ), 'i18n' => [ 'button_label' => \__( 'Add NextGEN Gallery', 'nggallery' ), ], 'name' => $this->attach_to_post_tinymce_plugin, 'nonce' => \wp_create_nonce( 'ngg_attach_to_post_iframe' ), ] ); } } /** * Adds a TinyMCE button for the Attach To Post plugin * * @param array $buttons * @return array */ public function add_attach_to_post_button( $buttons ) { if ( $this->can_use_tinymce() ) { array_push( $buttons, 'separator', $this->attach_to_post_tinymce_plugin ); } return $buttons; } /** * Adds the Attach To Post TinyMCE plugin * * @param array $plugins * @return array * @uses mce_external_plugins filter */ public function add_attach_to_post_tinymce_plugin( $plugins ) { if ( $this->can_use_tinymce() ) { $plugins[ $this->attach_to_post_tinymce_plugin ] = \add_query_arg( 'ver', NGG_SCRIPT_VERSION, StaticAssets::get_url( 'AttachToPost/ngg_attach_to_post_tinymce_plugin.js', 'photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.js' ) ); } return $plugins; } /** * Adds the Attach To Post TinyMCE i18n strings * * @param $mce_translation * @return mixed */ public function add_attach_to_post_tinymce_i18n( $mce_translation ) { $mce_translation['ngg_attach_to_post.title'] = \__( 'Attach NextGEN Gallery to Post', 'nggallery' ); return $mce_translation; } } PK *P0]�y�q�. �. BlockManager.phpnu �[��� PK *P0]�!Hҭh �h ./ Controller.phpnu �[��� PK *P0]����� � � Marketing.phpnu �[��� PK *P0]ϝ7� � �� EventPublisher.phpnu �[��� PK *P0]�[��v7 v7 ǻ ATPManager.phpnu �[��� PK � {�
dvadf
dvadf
| ver. 1.4 |
Github
|
.
| PHP 8.2.33 | Generation time: 0 |
proxy
|
phpinfo
|
Settings