-/**
- * Start preview theme output buffer.
- *
- * Will only preform task if the user has permissions and template and preview
- * query variables exist.
- *
- * @since 2.6.0
- */
-function preview_theme() {
- if ( ! (isset($_GET['template']) && isset($_GET['preview'])) )
- return;
-
- if ( !current_user_can( 'switch_themes' ) )
- return;
-
- // Admin Thickbox requests
- if ( isset( $_GET['preview_iframe'] ) )
- show_admin_bar( false );
-
- $_GET['template'] = preg_replace('|[^a-z0-9_./-]|i', '', $_GET['template']);
-
- if ( validate_file($_GET['template']) )
- return;
-
- add_filter( 'template', '_preview_theme_template_filter' );
-
- if ( isset($_GET['stylesheet']) ) {
- $_GET['stylesheet'] = preg_replace('|[^a-z0-9_./-]|i', '', $_GET['stylesheet']);
- if ( validate_file($_GET['stylesheet']) )
- return;
- add_filter( 'stylesheet', '_preview_theme_stylesheet_filter' );
- }
-
- // Prevent theme mods to current theme being used on theme being previewed
- add_filter( 'pre_option_theme_mods_' . get_option( 'stylesheet' ), '__return_empty_array' );
-
- ob_start( 'preview_theme_ob_filter' );
-}
-add_action('setup_theme', 'preview_theme');
-
-/**
- * Private function to modify the current template when previewing a theme
- *
- * @since 2.9.0
- * @access private
- *
- * @return string
- */
-function _preview_theme_template_filter() {
- return isset($_GET['template']) ? $_GET['template'] : '';
-}
-
-/**
- * Private function to modify the current stylesheet when previewing a theme
- *
- * @since 2.9.0
- * @access private
- *
- * @return string
- */
-function _preview_theme_stylesheet_filter() {
- return isset($_GET['stylesheet']) ? $_GET['stylesheet'] : '';
-}
-
-/**
- * Callback function for ob_start() to capture all links in the theme.
- *
- * @since 2.6.0
- * @access private
- *
- * @param string $content
- * @return string
- */
-function preview_theme_ob_filter( $content ) {
- return preg_replace_callback( "|(<a.*?href=([\"']))(.*?)([\"'].*?>)|", 'preview_theme_ob_filter_callback', $content );
-}
-
-/**
- * Manipulates preview theme links in order to control and maintain location.
- *
- * Callback function for preg_replace_callback() to accept and filter matches.
- *
- * @since 2.6.0
- * @access private
- *
- * @param array $matches
- * @return string
- */
-function preview_theme_ob_filter_callback( $matches ) {
- if ( strpos($matches[4], 'onclick') !== false )
- $matches[4] = preg_replace('#onclick=([\'"]).*?(?<!\\\)\\1#i', '', $matches[4]); //Strip out any onclicks from rest of <a>. (?<!\\\) means to ignore the '" if its escaped by \ to prevent breaking mid-attribute.
- if (
- ( false !== strpos($matches[3], '/wp-admin/') )
- ||
- ( false !== strpos( $matches[3], '://' ) && 0 !== strpos( $matches[3], home_url() ) )
- ||
- ( false !== strpos($matches[3], '/feed/') )
- ||
- ( false !== strpos($matches[3], '/trackback/') )
- )
- return $matches[1] . "#$matches[2] onclick=$matches[2]return false;" . $matches[4];
-
- $link = add_query_arg( array( 'preview' => 1, 'template' => $_GET['template'], 'stylesheet' => @$_GET['stylesheet'], 'preview_iframe' => 1 ), $matches[3] );
- if ( 0 === strpos($link, 'preview=1') )
- $link = "?$link";
- return $matches[1] . esc_attr( $link ) . $matches[4];
-}
-