从WP定制器获取附件ID

时间:2014-05-10 作者:chrisriis

WP定制者的WP_Customize_Image_Control 返回附件的URL,但我需要ID,因为我想这样输出图像:

echo wp_get_attachment_image( $user_logo_id, \'riiskit-user-logo\' );
这是因为我希望徽标与WP Retina 2x插件兼容。这就是为什么我使用上面的缩略图大小。这样,用户只需上传一个大图像,其他一切都将由代码处理。

我已经尝试了所有不同的attachment_src_to_id 函数,但它们都不工作,只返回nullfalse. This 比如说

即使我手动键入URL作为参数,它仍然返回负数。

但是,当我在内部手动键入ID时wp_get_attachment_image, 如预期所示。

在WP v3中有一些更改。9导致这些函数返回false?

也许有某种方法可以扩展定制者的图像控件来接收附件ID?

有什么想法吗?:)

2 个回复
SO网友:Satish Gandham

这很古老,但对于通过搜索来到这里的人来说

WP_Customize_Media_Control WP中的控件(自4.2起)为您提供附件id。

参考号:https://make.wordpress.org/core/2015/07/16/new-customizer-media-controls-in-4-3-and-4-2/

SO网友:RichieAHB

我知道这很旧,但我一直在寻找这个问题的答案,这样我就可以保存缩略图,而不是将全尺寸图像用于日志,但我无法保存。我已经通过执行以下操作来满足我的需要:

选择图像时,我将其挂接到customize_sanitize_{$this->id} 滤器这为我提供了一个过滤器中的图像url,以执行我想要的操作。

最初我使用attachment_url_to_postid 更改过滤器回调中的值,然后从函数返回新的图像url,然后将其存储在标准url的位置。然而,事实证明,用以前的任何选择(在WP_Customize_Upload_ControlWP_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\' 对于我的设置,我需要进行一次管理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\' );
公平地说,为了获得我想要的功能,我不得不一路走下去,但它似乎工作得很好!

结束

相关推荐

Latest news mini images

我试图在网站和其他论坛上找到答案,但一无所获。我会尽力解释我的问题。我需要更改我的WordPress网站,以便在主页上的“最新新闻”中显示所有新闻文章的小图像。如果这很重要,我正在使用headway主题编辑器。upd:根据评论中的要求,以下是my website.