Appearance-> Themesページで、テーマの "Live Preview" URLを変更する方法が必要ですか?テーマのサムネイルを、カスタマイザを開かずにテーマを紹介するデモサイトにリンクさせたい。私はいくつかのコードを調べましたが、私は解決策をあまり見ていませんが、他の誰かがこれにトリックを持っているかどうか疑問に思いました。ありがとう
の Live Preview /wp-admin/themes.php
ページのボタンは、tmpl-themeマイクロテンプレートから生成されます。
<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') );
});
をクリックすると Live Preview ボタン、外部のURLで、それはのようなエラーを引き起こすでしょう:
セキュリティエラーが発生しました: 'History'で '
pushState
'の実行に失敗しました:URLが 'http://foo.tld/demo/twentysixteen/
'の履歴状態オブジェクトは、Originがhttp://example.tld
、URLがhttp://example.tld/wp-admin/themes.php
の文書には作成できません。
これを防ぐには、ダブルクリック(本当に信頼できるオプションではありません)するか、外部プレビューリンクのload-customize
クラスを削除します。これがそのようなハックの1つです。
/**
* 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
} );
@daved ここ からthis.Host
というアイデアを得ました。
もう1つのもっと劇的なアプローチはtmpl-theme
テンプレートを上書きすることです。
WordpressはテーマプレビューのURLを取得するためにwp_customize_url
を呼び出すようですが、フィルタをかけることができるフィルタの方法はそれほど多くありません( https://developer.wordpress.org/reference/functions/wp_customize_url/ )。 admin_url
フィルタに潜在的にフックして変更を加えることができます - しかしcustomize.php
が送信されるときに異なるURLを返すことは明らかにライブプレビュー機能だけではなくカスタマイザのすべてのインスタンスに影響します。これがあなたに関係がないなら、これはあなたが必要とするものかもしれません:
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
を追加することで、そのページでどのテーマが要求されているかを判断できます。
これは合うかもしれないし、そうでないかもしれません。
そうでない場合は、URLを変更するためのフロントエンドJavaScriptが残っていると思います。 admin_enqueue_scripts
を使用して管理者にJavaScriptファイルをエンキューする必要があり(ヘルプについては https://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts を参照)、次にLive Previewリンクを参照します。
jQuery(".theme-browser .theme[aria-describedby*='twentysixteen'] .button.load-customize")
.attr("href", "http://offsitethemepreviewurl.com/");
これは、TwentysixteenテーマのLoad Previewリンクを http://offsitethemepreviewurl.com に変更します。
私はこれらの解決策のどちらもテストしていません...しかし、私はそれらがうまくいくと思います:)
あなたがWPカスタマイザを使用している場合、Javascriptを使って現在のプレビューURLを変更する方法は次のとおりです。
コントロールパネルから現在のURLを変更する予定がある場合は、これを試してください。wp.customize.previewer.previewUrl( url )
プレビューフレームからURLを変更したい場合は、これを試してください:wp.customize.preview.send( "url", url )
さらに、コントロールパネルから現在のプレビューURLを取得する方法は次のとおりです。wp.customize.previewer.previewUrl()