检测图像文件是否为缩略图

时间:2017-03-18 作者:heller_benjamin

我希望能够检测特定路径上的文件是否是WordPress生成的缩略图。就单个文件而言,WordPress缩略图的唯一区别在于,它将以两个或三个数字、“x”、另外两个或三个数字以及文件扩展名结尾。我能想到的唯一方法是使用正则表达式来检测文件名中的模式。有没有更好的方法我没有想到?如果没有,有人能帮我学正则表达式吗?

4 个回复
SO网友:Irene Mitchell

您需要知道站点当前的缩略图维度设置,以便检测$url是否为缩略图大小。

$thumbnail_width = get_option( \'thumbnail_size_w\' );
$thumbnail_height = get_option( \'thumbnail_size_h\' );

// The do detection
// Assuming you have the image $url

$pattern = \'%\' . $thumbnail_width . \'x\' . $thumbnail_height . \'%\';

if ( preg_match( $pattern, $url ) ) {
    // do your stuff here ...
}

SO网友:birgire

以下是另外两种可能适合您的情况,也可能不适合您的情况:

方法#1

以300x200尺寸为例:

https://example.tld/wp-content/2017/03/vatnajokull-300x200.jpg
下面是一种方法,我们可以检查它是否真的是媒体库的一部分:

-\\d+x\\d+ 从文件名中删除,使其成为:

$url = \'https://example.tld/wp-content/2017/03/vatnajokull.jpg\';
使用核心$attachment_id = attachment_url_to_postid( $url ) 函数获取可能的附件ID。

使用第2部分中的附件ID。要获取元数据,请使用$meta = wp_get_attachment_metadata( $attahcment_id ) 包含所有生成的图像大小。它获取_wp_attachment_metadata 元值300x200 大小是通过窥视大小元数据数组(即。$meta[\'sizes\'] ) 和例如。file_exists( $path ) 确保它确实存在希望您能填写缺失的部分;-)

方法#2

核心使用通配符LIKE 在上搜索_wp_attachment_metadata 元值,在wp_delete_attachment() (source), 删除之前,查看其他附件是否将其用作拇指。这可以在这里工作,但由于它在序列化数组中搜索,因此精确度较低。核心部分如下所示:

if ( ! $wpdb->get_row( 
    $wpdb->prepare( 
        "SELECT meta_id FROM $wpdb->postmeta 
         WHERE meta_key = \'_wp_attachment_metadata\' 
             AND meta_value LIKE %s 
             AND post_id <> %d", 
        \'%\' . $wpdb->esc_like( $meta[\'thumb\'] ) . \'%\', 
        $post_id
    )
) ) {

SO网友:heller_benjamin

好的,我是这样做的。首先,我检查它是否支持图像文件扩展名,因为如果不支持,我们可以保存DB查询。然后我简单地检查了数据库中的附件id。如果没有附件id,那么我假设这是一个缩略图。可能不是每个解决方案都完美,但对我的应用程序都有效。谢谢你的建议,他们让我的思想朝着正确的方向流动。

function is_not_thumbnail( $url ) {
    $result = true;
    $ext = substr( $url, -4 );

    if ( 
        $ext === \'.jpg\' || 
        $ext ===  \'.JPG\' ||
        $ext === \'jpeg\' ||
        $ext === \'JPEG\' ||
        $ext === \'.png\' ||
        $ext === \'.PNG\' ||
        $ext === \'.gif\' ||
        $ext === \'.GIF\' ||
        $ext === \'.ico\' ||
        $ext === \'.ICO\' 
     ) {
        if ( get_attachment_id_from_url( $url ) === \'null\' ) {
            $result = false;
        }
    }

    return $result;

}

function get_attachment_id_from_url( $url ) {
    global $wpdb;

    $result = $wpdb->get_results( \'SELECT ID FROM \' . $wpdb->prefix . \'posts WHERE guid = "\' . $url . \'"\' );


    if ( !empty( $result[0] ) ) {
        return $result[0]->ID;  
    } else {
        return false;
    }

}

SO网友:Kameron Zach

我克隆了媒体库,对嵌套的Wordpress媒体文件运行了此节点脚本,并在文件/文件夹中循环。在循环中加入一些逻辑,使文件名与缩略图命名约定文件名SIZExSIZE的正则表达式相对应。我使用节点文件系统和路径来适当地移动文件。

const glob = require("glob");
const fs = require(\'fs\');
const { resolve, basename } = require(\'path\');

glob("./../media/**/*.png", {}, function (er, files) {

  var count = 0;
  for (const file of files) {
    if(/\\b\\d{2,4}[x.]?\\d{2,4}[..]([a-z\\.]{3})\\b/.test(file) === false){

      let oldFileNamePath = resolve(file);
      let newFileNamePath = resolve(\'./../media-new/\'+ basename(file));

       fs.rename(oldFileNamePath, newFileNamePath, function (err) {
         if (err) throw err;
         console.log(count, \'renamed complete\', newFileNamePath);
       });

       count++;
    }

  }

});

相关推荐

Thumbnails Not Generating

好啊所以这是一个奇怪的问题。。。WordPress不生成缩略图,我设置了图像大小和所有内容。。。我很确定这与我的自定义帖子类型代码有关(见下文),因为当我删除它时,缩略图会正确生成。// Tells WP to add a slides and marquee sections add_action( \'init\', \'create_my_post_types\' ); // WP slides section attributes function create_