如何在外观->主题页面中更改主题“实时预览”URL?

时间:2016-03-12 作者:David Labbe

我需要一种方法来更改外观->主题页面中的主题“实时预览”url?我希望主题缩略图链接到展示主题的演示网站,而不是打开自定义程序。我查看了一些代码,但我没有看到太多的解决方案,但想知道是否有其他人有这个技巧。谢谢

3 个回复
SO网友:birgire

主题的外部实时预览/wp-admin/themes.php 页面,从tmpl主题生成:

<script id="tmpl-wpse" type="text/template">

    ...cut...

        <div class="theme-actions">

        <# if ( data.active ) { #>
                <# if ( data.actions.customize ) { #>
                        <a class="button button-primary customize load-customize hide-if-no-customize" href="{{{ data.actions.customize }}}"><?php _e( \'Customize\' ); ?></a>
                <# } #>
        <# } else { #>
                <a class="button button-secondary activate" href="{{{ data.actions.activate }}}"><?php _e( \'Activate\' ); ?></a>
                <a class="button button-primary load-customize hide-if-no-customize" href="{{{ data.actions.customize }}}"><?php _e( \'Live Preview\' ); ?></a>
        <# } #>
        </div>

    ...cut...

  </script>
我们可以通过wp_prepare_themes_for_js 滤器

下面是一个示例:

/**
 * External Live Previews
 */
add_filter( \'wp_prepare_themes_for_js\', function(  $prepared_themes )
{
    //--------------------------
    // Edit this to your needs:

    $externals = [ 
        \'twentysixteen\' => \'http://foo.tld/demo/twentysixteen/\', 
        \'twentyfifteen\' => \'http://bar.tld/demo/twentyfifteen/\' 
    ];
    //--------------------------

    foreach( $externals as $slug => $url )
    {
        if( isset( $prepared_themes[$slug][\'actions\'][\'customize\'] ) )
            $prepared_themes[$slug][\'actions\'][\'customize\'] = $url;
    }   

    return $prepared_themes;
} );
但由于load-customize 类,它将触发一个单击事件并打开一个iframe覆盖:

$(\'#wpbody\').on( \'click\', \'.load-customize\', function( event ) {
    event.preventDefault();

    // Store a reference to the link that opened the Customizer.
    Loader.link = $(this);
    // Load the theme.
    Loader.open( Loader.link.attr(\'href\') );
});
当我们单击带有外部url的实时预览按钮时,它将触发如下错误:

Uncaught SecurityError:未能执行\'pushState\' 关于“History”:URL为的历史状态对象http://foo.tld/demo/twentysixteen/\' 无法在来源为“”的文档中创建http://example.tld\' 和URL\'http://example.tld/wp-admin/themes.php\'.

我们可以通过双击(不是真正可靠的选项)或删除load-customize 为外部预览链接初始化。这里有一个这样的黑客:

/**
 * Remove the .load-customize class from buttons with external links
 */
add_action( \'admin_print_styles-themes.php\', function()
{ ?>
    <script>
        jQuery(document).ready( function($) {
            $(\'.load-customize\').each( function( index ){
                if( this.host !== window.location.host )
                    $( this ).removeClass( \'load-customize\' );
            } );
        });
    </script> <?php
} );
我从哪里得到的this.host 来自@daved的想法here.

另一个更激进的方法是推翻tmpl-theme 样板

SO网友:Tim Malone

Wordpress似乎在呼叫wp_customize_url 要获取主题预览URL,没有多少过滤器可以连接(https://developer.wordpress.org/reference/functions/wp_customize_url/). 您可能会连接到admin_url 筛选以进行更改-但在customize.php 发送将明显影响自定义程序的每个实例,而不仅仅是实时预览功能。如果这与您无关,那么这可能就是您所需要的:

add_filter("admin_url", "my_live_preview", 10, 3);
function my_live_preview($url, $path, $blog_id){
  if($path == "customize.php"){ $url = "http://offsitethemepreviewurl.com"; }
  return $url;
}
这个$url 然后将附加?theme=name-of-theme 这将允许您在该页面上确定所请求的主题。

这可能适合也可能不适合。

如果没有,我想您只剩下一些前端JavaScript来更改URL。您需要使用admin_enqueue_scripts (参见https://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts 有关帮助),请参考实时预览链接:

jQuery(".theme-browser .theme[aria-describedby*=\'twentysixteen\'] .button.load-customize")
  .attr("href", "http://offsitethemepreviewurl.com/");
这将把216th主题的加载预览链接更改为http://offsitethemepreviewurl.com.

我没有测试过这两种解决方案中的任何一种。。。但我认为它们会起作用:)

SO网友:mj_azani

如果您在wp customizer中,以下是如何通过Javascript更改当前预览URL:

当您计划从“控制面板”更改当前URL时,请尝试此选项:wp.customize.previewer.previewUrl( url )

或者在您打算更改预览框架中的URL时尝试此选项:wp.customize.preview.send( "url", url )

此外,以下是如何从控制面板获取当前预览URL:wp.customize.previewer.previewUrl()

相关推荐

About wordpress child themes

我对WordPress和儿童主题有一些问题。据我所知,如果我不想在更新主题时失去任何东西,使用子主题是很重要的。我是WordPress的初学者,到目前为止,我一直在使用PageBuilder(管理面板上的板载自定义选项)自定义我的网站,并在“附加CSS”选项中加入几行CSS。所有这些都是在主主题上完成的(只是玩转尝试学习),现在我想开始使用一个儿童主题。问题如下:我不知道我是否可以像通过管理界面设计父主题那样设计我的子主题,或者我是否必须通过文本编辑器(在我的计算机上,然后通过FTP等方式上传)对所有内容