web-dev-qa-db-ja.com

から添付ファイルIDを取得 WP カスタマイザ

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を受け取るようにカスタマイザのイメージコントロールを拡張する方法がありますか?

何か案は? :)

2
chrisriis

これは非常に古いですが、検索でここに来た人のためのものです

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/

3
Satish Gandham

私はこれが古いことを知っていますが、ログにフルサイズの画像を使うのではなくサムネイルを保存することができ、できないように、この問題に対する答えを探していました。私は自分のニーズに合わせて次のことを考え出しました。

画像を選ぶとき、私は 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' );

望んでいた機能を手に入れるためには、私は邪魔にならないようにしなければならないと言うのは公平ですが、それはうまくいっているようです!

3
RichieAHB