// Skip the 'dynamic stylesheets' URL endpoints used by Pro. elseif ( false !== strpos( $_SERVER['REQUEST_URI'], 'nextgen-dcss?name' ) ) { return false; } // Skip any files belonging to the NGG 1.x days. elseif ( false !== strpos( $_SERVER['REQUEST_URI'], 'nextgen-gallery/src/Legacy/' ) ) { return false; } // Do not process requests made directly to files. elseif ( preg_match( '/\\.(\\w{3,4})$/', $_SERVER['REQUEST_URI'], $match ) ) { if ( ! in_array( $match[1], [ 'htm', 'html', 'php' ] ) ) { $retval = false; } } // Skip legacy versions of the Pro Lightbox. elseif ( ( isset( $_SERVER['PATH_INFO'] ) && strpos( $_SERVER['PATH_INFO'], 'nextgen-pro-lightbox-gallery' ) !== false ) or strpos( $_SERVER['REQUEST_URI'], 'nextgen-pro-lightbox-gallery' ) !== false ) { $retval = false; } // And lastly skip all REST endpoints. elseif ( $this->is_rest_request() ) { $retval = false; } // phpcs:enable WordPress.Security.NonceVerification.Recommended return $retval; } public function is_rest_request() { return defined( 'REST_REQUEST' ) || strpos( $_SERVER['REQUEST_URI'], 'wp-json' ) !== false; } /** * Start the output buffers */ public function start_buffer() { if ( self::is_disabled() ) { return; } if ( apply_filters( 'run_ngg_resource_manager', $this->valid_request ) ) { ob_start( [ $this, 'output_buffer_handler' ] ); ob_start( [ $this, 'get_buffer' ] ); add_action( 'wp_print_footer_scripts', [ $this, 'get_resources' ], 1 ); add_action( 'admin_print_footer_scripts', [ $this, 'get_resources' ], 1 ); add_action( 'shutdown', [ $this, 'shutdown' ] ); } } public function get_resources() { ob_start(); wp_print_styles(); print_admin_styles(); $this->styles = ob_get_clean(); if ( ! is_admin() ) { ob_start(); wp_print_scripts(); $this->scripts = ob_get_clean(); } $this->wrote_footer = true; } /** * Output the buffer after PHP execution has ended (but before shutdown) * * @param $content * @return string */ public function output_buffer_handler( $content ) { return $this->output_buffer(); } /** * Removes the closing tag from the output buffer. We'll then write our own closing tag * in the shutdown function after running wp_print_footer_scripts() * * @param $content * @return mixed */ public function get_buffer( $content ) { $this->buffer = $content; return ''; } /** * Moves resources to their appropriate place */ public function move_resources() { if ( $this->valid_request ) { // Move stylesheets to head. if ( $this->styles ) { $this->buffer = str_ireplace( '', $this->styles . '', $this->buffer ); } // Move the scripts to the bottom of the page. if ( $this->scripts ) { $this->buffer = str_ireplace( $this->marker, $this->marker . $this->scripts, $this->buffer ); } if ( $this->other_output ) { $this->buffer = str_replace( $this->marker, $this->marker . $this->other_output, $this->buffer ); } } } /** * When PHP has finished, we output the footer scripts and closing tags * * @param bool $in_shutdown * @return string */ public function output_buffer( $in_shutdown = false ) { // If the footer scripts haven't been outputted, then // we need to take action - as they're required. if ( ! $this->wrote_footer ) { // If W3TC is installed and activated, we can't output the scripts and manipulate the buffer, so we can only provide a warning. if ( defined( 'W3TC' ) && defined( 'WP_DEBUG' ) && WP_DEBUG && ! is_admin() ) { if ( ! defined( 'DONOTCACHEPAGE' ) ) { define( 'DONOTCACHEPAGE', true ); } if ( ! did_action( 'wp_footer' ) ) { error_log( "We're sorry, but your theme's page template didn't make a call to wp_footer(), which is required by NextGEN Gallery. Please add this call to your page templates." ); } else { error_log( "We're sorry, but your theme's page template didn't make a call to wp_print_footer_scripts(), which is required by NextGEN Gallery. Please add this call to your page templates." ); } } // We don't want to manipulate the buffer if it doesn't contain HTML. elseif ( strpos( $this->buffer, '' ) === false ) { $this->valid_request = false; } // The output_buffer() function has been called in the PHP shutdown callback // This will allow us to print the scripts ourselves and manipulate the buffer. if ( $in_shutdown === true && $this->valid_request ) { ob_start(); if ( ! did_action( 'wp_footer' ) ) { wp_footer(); } else { wp_print_footer_scripts(); } $this->other_output = ob_get_clean(); $this->buffer = str_ireplace( '', $this->marker . '', $this->buffer ); } // W3TC isn't activated and we're not in the shutdown callback. We'll therefore add a shutdown callback to print the scripts. else { $this->run_shutdown = true; return ''; } } // Once we have the footer scripts, we can modify the buffer and move the resources around. if ( $this->wrote_footer ) { $this->move_resources(); } return $this->buffer; } /** * PHP shutdown callback. Manipulate and output the buffer */ public function shutdown() { if ( $this->run_shutdown ) { echo $this->output_buffer( true ); } } }