无法访问附件图像的缩略图...找不到原因

时间:2016-03-03 作者:mesqueeb

我有一个自定义表单,允许用户发表帖子,也可以上传图片。图像保存在wp_posts as post\\U类型=attachment 使用guid 显示图像。

现在我已经创建了一个用php创建的网格,它显示了我帖子的所有主要图片。然而,由于我调用了图像的guid,所以当图像较大时,加载速度非常慢。

我知道每次上传图像时都会保存一些较小的缩略图,但我在数据库中找不到这些文件。

我尝试用以下所有方式向他们展示:

//test with ID of the post:
get_the_post_thumbnail(\'17547\');
get_the_post_thumbnail(17547, \'thumbnail\');
get_the_post_thumbnail(17547, \'medium\');

//test with ID of the attachment:
wp_get_attachment_image(17548, \'medium\' );
wp_get_attachment_image_src(17548, \'medium\' );
这两个不同的数字是因为我尝试了post ID和attachement ID。但是上面所有的函数都没有在DOM中显示任何内容。。。

I think that maybe the way I save the pictures doesn\'t allows me to use this function. 但我不知道我做错了什么!有人知道我可以看哪里,或者我如何显示这些缩略图吗?

这就是我的照片网格的制作方法:
 首先,我根据用户搜索的内容获取ID列表:

$allluca01 = $wpdb->get_results("
    SELECT wpp.ID, post_title
    FROM wp_posts AS wpp
    WHERE post_type = \'post\' 
    ".$plus_other_search_conditions."
    GROUP BY wpp.ID
");
 然后我得到图像的guid。我将附件id作为元值保存到名为image01的元键(链接到post\\u id)。

foreach($sqlsearchquery as $results){
        $resultid = $results->ID;
        $getpicture = $wpdb->get_results("
            SELECT guid AS pic 
            FROM wp_posts
            LEFT JOIN wp_postmeta ON ID = meta_value
            WHERE post_id = \'$resultid\' AND meta_key = \'item_image01\'
        ");

            <div class="grid_item_img" style="background-image:url(\'<? echo $getpicture[0]->pic; ?>\')">
正如你所看到的,我达到了guid 然后我在我的网格中使用它。I just want to obtain a guid of a smaller size of my media 这样我可以更快地加载网格。有人知道怎么做吗?

5 个回复
最合适的回答,由SO网友:cybmeta 整理而成

您可以使用多个函数获取WordPress创建的任何中间大小的图像的URL(缩略图、中、大、完整或任何其他大小custom size).

您可以使用get_the_post_thumbnail()/the_post_thumbnail(): 如果需要,请使用此功能to get a <img> element of the featured image of a post (aka "post thumbnail"). 例如,要获取ID为78的帖子的特色图片medium szie:

$featured_image = get_the_post_thumbanil( 78, \'medium\' );
echo $featured_image;
如果您在循环中,则可以显示当前帖子的帖子缩略图(中等大小),如下所示:

// Don\'t need echo
the_post_thumbnail( \'medium\' );
如果未设置图像大小,get_the_post_thumbanil()/the_post_thumbnail() 使用post-thumbnail, 这是the size registered for the post thumbanil (特色图片)。

如果你愿意to get a <img> element of any image, 不是帖子缩略图(特色图片),请使用wp_get_attachment_image(). 例如,如果附件的ID为7898,并且您希望获得中等大小<img>:

echo wp_get_attachment_image( 7898, \'medium\' );
您还可以使用wp_get_attachment_image_src() 如果您只想获取任何图像的URL(而不是<img> 元素):

$image_url = wp_get_attachment_image_src( $id_of_the_attachment, $size );
例如,如果附件的ID为7898,并且您希望获取中等大小的URL:

$image_url = wp_get_attachment_image_src( 7898, \'medium\' );
在自定义查询中,可以选择附件ID,而不是guid 并将此附件ID用于wp_get_attachment_image()wp_get_attachment_image_src().

无论如何you should avoid that custom SQL queries. 您缺少重要的WordPress挂钩和一些功能,模板标记、内容过滤器、嵌入等,无法写入。如果您想在WordPress中处理WordPress帖子,最好的选择是使用get_posts() o或的新实例WP_Query.

现在to directly answer your question: 附件文件(包括图像的中间大小)存储在wp-content/uploads 文件夹数据库保留附件post类型的信息,但文件不在数据库中。

SO网友:Prasad Nevase

我不知道你是如何实现自定义格式的图像上传的。如果您遵循了标准方法,那么您应该能够使用以下任一方法获得缩略图:

get_the_post_thumbnail( $post_id, \'thumbnail\' ); get_the_post_thumbnail( $post_id, \'medium\' );

若上述方法不起作用,那个么可以通过第二个参数给出具体的图像大小。只需按以下方式传递大小,WordPress就会动态返回指定大小的图像:

get_the_post_thumbnail( $post_id, array(300, 300))

让我知道进展情况:-)

SO网友:Pieter Goosen

我想知道你是否在寻找与我最初回答的不同的东西。在重读了你的帖子后,我想如果我读对了,你的图片实际上是附件,而不是缩略图。如果这些附件仍然没有保存在db中,那么只有您正确指出的关于附件的信息

在这种情况下,如果操作不当,加载附件可能会非常昂贵。令人沮丧的是,WordPress不允许您在不传递post父ID的情况下直接查询附件。

要获取帖子的附加图像,您可以尝试以下方法,这样做会更快一些

/**
 * Because we really just need post ID\'s and nothing more like
 * custom fields, postdata, and post terms, we will not be updating
 * the post cache. This saves a lot of time and resources. If you are 
 * going to need custom fields or post data or terms, then you should remove
 * cache_results because this will cause huge increase in db queries when you
 * try to get post terms or custom fields
 *
 * Also, we will only get post ID\'s as we do not need anything else
 */
$args = [
    \'fields\'        => \'ids\', // Get only post ID\'s
    \'cache_results\' => false, // Do not update post caches
    // Add any extra arguments
];
$q = get_posts( $args );

if ( $q ) {
    foreach ( $q as $id ) {
        /**
         * Get all attached images
         * 
         * We will be doing what get_attached_media does, but because we only
         * have post ID\'s and have not updated the post cache, we will not be 
         * using get_attached_media() as it will lead to a large number of db hits
         * because get_attached_media() will use get_post() to get the complete post object
         */
        $image_args = [
            \'post_parent\'    => $id,
            \'post_type\'      => \'attachment\',
            \'post_mime_type\' => \'image\',
            \'posts_per_page\' => -1,
            \'orderby\'        => \'menu_order\',
            \'order\'          => \'ASC\',
        ];
        $images = get_children( $image_args );

        if ( !$images )
            continue;

        // Loop throught the images
        foreach ( $images as $image ) {
            // Output the images as needed

            // For debugging, see the var_dump for values
            var_dump( $image );

        }
    }
}
原始答案Post缩略图不会显式保存在db中,只有特定缩略图的ID会保存为Post metawp_postmeta 桌子特定的元键是_thumbnail_id.

您可以通过get_the_post_thumbnail() 作用也可以将字符串或自定义属性数组设置为第三个参数

值得注意的是,get_the_post_thumbnail() 不显示缩略图,只返回缩略图。在循环中,您可能希望使用the_post_thumbnail() 显示缩略图,在这种情况下,上述参数将分别为第一个和第二个参数。

在自定义循环中加载缩略图的成本很高,因为自定义查询不会缓存缩略图。只覆盖主查询。您需要在自定义循环中明确设置缩略图的缓存。

您可以尝试以下可能的解决方案:(NOTE: 所有内容都未经测试,可能有问题

假设您想使用medium 调整缩略图大小,只显示缩略图,不显示其他内容,如果需要任何其他帖子属性,请删除过滤器

让我们先看看应该进入的过滤器functions.php

/**
 * Custom filter to retrieve only post ID\'s.
 *
 * We cannot set the fields arguments to ID in our query because
 * we need to update the thumbnail cache, and if you look at 
 * update_post_thumbnail_cache(), we need the post as an object
 * so we can use $post->ID, if we set the fields parameter, we only
 * get an array of ID\'s, not post objects with only ID\'s
 */
add_filter( \'posts_fields\', function ( $fields, \\WP_Query $q ) use ( &$wpdb )
{
    remove_filter( current_filter(), __FUNCTION__ );

    // Only target a query where the new wpse_fields parameter is set with a value of ID
    if ( \'ID\' === $q->get( \'wpse_fields\' ) ) {
        // Only get the post ID field to reduce server load
        $fields = "$wpdb->posts.ID";
    }

    return $fields;
}, 10, 2);
这个过滤器将大幅度减少服务器负载,因为我们只获得post ID,但仍然维护post对象。

您的自定义查询可以如下所示:

/** 
 * Because we only need to display the post thumbnails, we will not be
 * updating the term cache. If you need post term info, remove the 
 * update_post_term_cache argument. This will increase performance if you
 * do not need post term info
 */
$args = [
    \'meta_key\'               => \'_thumbnail_id\', // Only get posts with thumbnails
    \'wpse_fields\'            => \'ID\',            // Our custom argument to get only post ID\'s
    \'update_post_term_cache\' => false,           // Do not update the post caches to make the query faster
    // Any other arguments
];
$q = new WP_Query( $args );

if ( $q->have_posts() ) {

    // Update the post thumbnail cache
    update_post_thumbnail_cache( $q );

    while ( $q->have_posts() ) {
        $q->the_post();

        // Display the post thumbnail, medium size
        if ( has_post_thumbnail() ) // Not really necessary in current context
            the_post_thumbnail( \'medium\' ); // Get medium size post thumbnail

    }
    wp_reset_postdata();
}
编辑

VERY IMPORTANT NOTE

非常不鼓励使用短PHP标记,实际上WordPress中不允许使用短PHP标记。这是一种非常糟糕的编码实践。您应该养成使用正确PHP标记的习惯(*<?php?>

SO网友:majick

默认情况下,缩略图(附件)ID存储在帖子的meta_key 属于_thumbnail_id, 因此,如果未设置该选项(例如,通过post writing屏幕将图像添加到帖子中),则get_the_post_thumbnailthe_post_thumbnail 不会做任何事,因为你把$post_id 他们会检查并发现_thumbnail_id 没有为此设置$post_id 不返回任何内容。

wp_get_attachmentwp_get_attachment_src <但是,em>会做一些事情,但前提是你通过Attachment ID 而不是Post ID. 您说您已将附件ID保存到的meta\\u密钥item_image01 (或image01?) 但在当前的SQL查询中,实际上并没有检索该值,只是检查它是否已设置。因此,您应该可以这样做:

foreach ($sqlsearchquery as $results) {
    $post_id = $results->ID;
    $attachment_id = get_post_meta($post_id,\'item_image01\',true);
    $source_url = wp_get_attachment_src($attachment_id,\'medium\');
    ?>

        <div class="grid_item_img" style="background-image:url(\'<? echo $source_url; ?>\')">
因此,如果您确实想简单地使用get_the_post_thumbnail 您可以将附件ID设置为帖子的_thumbnail_id 改为meta\\u键。

SO网友:mesqueeb

答案很简单:

别忘了写信echo 在所有这些功能之前。

echo wp_get_attachment_image($attachment_id, \'medium\' );
echo wp_get_attachment_image_src($attachment_id, \'medium\' );

echo get_the_post_thumbnail($post_id, \'thumbnail\');
echo get_the_post_thumbnail($post_id, \'medium\');
//note this only works if you have _thumbnail_id set to the postmeta of the post.
这一切都很好,问题也解决了。

相关推荐

Blurry Images Wordpress 5.8.1

我试过了使用。png而不是。禁用wordpress默认压缩add_filter(\'jpeg_quality\', function($arg){return 100;});</切换主题以测试禁用插件多次重新生成缩略图多次重新上载媒体定义每个图像的确切宽度和高度禁用延迟加载图像上载后仍然模糊。我的图像都经过了优化,并且具有精确的宽度和高度。我以前版本的wordpress没有这些问题。我还应该做些什么来解决这个问题?谢谢