WPカスタマイザのWP_Customize_Image_Control
は添付ファイルのURLを返しますが、このように画像を出力したいのでIDが必要です。
echo wp_get_attachment_image( $user_logo_id, 'riiskit-user-logo' );
その理由は、ロゴをWP Retina 2xプラグインと互換性があるようにしたいからです。だからこそ、私は上記のサムネイルサイズを使用しています。この方法では、ユーザーは1つの大きな画像をアップロードするだけでよく、それ以外はコードによって処理されます。
私はすでにさまざまなattachment_src_to_id
関数を試してみましたが、どれも機能せず、null
またはfalse
のみを返します。 これは 例えば
URLをパラメータとして手動で入力しても、負の値が返されます。
しかし、wp_get_attachment_image
の中に手動でIDを入力すると、期待通りに表示されます。
WP v3.9でこれらの関数がfalseを返すような変更がありましたか?
おそらく、添付ファイルIDを受け取るようにカスタマイザのイメージコントロールを拡張する方法がありますか?
何か案は? :)
これは非常に古いですが、検索でここに来た人のためのものです
4.2以降のWPのWP_Customize_Media_Control
コントロールは添付ファイルIDを提供します。
参照: https://make.wordpress.org/core/2015/07/16/new-customizer-media-controls-in-4-3-and-4-2/
私はこれが古いことを知っていますが、ログにフルサイズの画像を使うのではなくサムネイルを保存することができ、できないように、この問題に対する答えを探していました。私は自分のニーズに合わせて次のことを考え出しました。
画像を選ぶとき、私は customize_sanitize _ {$ this-> id} フィルタにフックします。これは私が欲しいものをするために私にフィルターのイメージURLを与える。
最初は attachment_url_to_postid
を使ってフィルタコールバックの値を変更してから関数から新しい画像のURLを返しました。標準URLただし、アップローダに以前の選択(WP_Customize_Upload_Control
が継承するWP_Customize_Image_Control
クラスにあります)を追加する関数は、この同じ関数を使用して添付ファイルIDを取得し、最終的に現在の選択をレンダリングします。これは、渡されたURLがサムネイルのときに壊れます。これは、データベースの値をに変更したものです。
私が代わりにしたのは、実際にはフィルタコールバックのwp_option
として値を保存し、それが起こっていたようにそれを壊さないようにちょうど関数を通して標準値を送ることでした:
functions.php
function site_logo_save( $value ) {
$id = attachment_url_to_postid($value);
$thumb = wp_get_attachment_image_src( $id );
$url = $thumb[0];
update_option('site_logo', $url);
return $value;
}
add_action('customize_sanitize_site_logo', 'site_logo_save');
それから私のテーマファイルでは、get_theme_mod
を使う代わりに、get_option
を使ってURLを取得しました。
header.php
<div class="site-branding">
<?php if($site_logo = get_option('site_logo')): ?>
<img src="<?php echo get_option('site_logo'); ?>" class="site-logo" alt="<?php bloginfo( 'name' ); ?>">
<?php else: ?>
<h1 class="site-title"><a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a></h1>
<h2 class="site-description"><?php bloginfo( 'description' ); ?></h2>
<?php endif; ?>
</div><!-- .site-branding -->
<?php
// Add this if we are in the customizer for reseting when no image selected
global $wp_customize;
if ( isset( $wp_customize ) ) : ?>
<div style="display: none;">
<div class="site-branding-no-logo">
<h1 class="site-title"><a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a></h1>
<h2 class="site-description"><?php bloginfo( 'description' ); ?></h2>
</div>
</div>
<?php endif; ?>
また、設定に'transport' => 'postMessage'
を使いたかったので、このライブを反映させるためにこのカスタマイザオプションが変更されるたびに、実際に使用するつもりだったadmin-ajax呼び出しを行う必要がありました。
customizer.js
wp.customize( 'site_logo', function( value ) {
value.bind( function( to ) {
if (to == false) {
var orig = $( '.site-branding-no-logo' ).html();
$( '.site-branding' ).html( orig );
} else {
var data = {
action: 'get_actual_site_logo_url'
};
$.post(ajaxurl, data, function(response) {
var $img = $('<img>').attr('src', response);
$( '.site-branding' ).html( $img );
});
}
} );
} );
functions.php
function get_actual_site_logo_url_callback() {
echo get_option('site_logo');
wp_die();
}
add_action( 'wp_ajax_get_actual_site_logo_url', 'get_actual_site_logo_url_callback' );
望んでいた機能を手に入れるためには、私は邪魔にならないようにしなければならないと言うのは公平ですが、それはうまくいっているようです!