最近修改了一下之前上传wordpress文章的代码,准备为程序加一个添加特色图片的功能,即文章的封面,观察了一下wordpress的数据库发现,特色图片需要先添加到wordpress的媒体库中,然后才能设为文章的封面,所以下面就跟大家分享一下这之间的一些记录。

一张图片要上传到wordpress的媒体库,需要在数据库添加两条记录。

一是在wp_post表中添加一条记录(图片和文章都用同一个表),这里面最主要的就是图片的url,然后另一条记录就是添加到wp_postmeta,记录图片的一些信息,我们在标题提到的_wp_attachment_metadata字段就是记录图片的信息。

下面就是一张保存在媒体库的图片的数据库记录

wp_post

wp_postmeta

wp_postmeta表中的post_id对应wp_post表中的ID

一开始在看到wp_postmeta_wp_attachment_metadata对应的键值我是有点懵逼的,这里面有些直接看过去还是能明白是什么意思,比如宽、高、文件名,以及对应的值,不过那个s后面的那个数字不知道是什么意思,在百度搜索无果后,便到谷歌搜索了一下,才搞懂了s的意思;我先把_wp_attachment_metadata的值格式化给大家看一下。

我举个例子s:5:"width";,在这里面的width是五个字符,所以s后面就是5,大家可以看一下上面是不是这么回事。

明白是什么意思后,将图片上传到媒体库就非常简单啦;接下来我们再解决另一个问题,如何将图片设为文章封面即wordpress所说的特色图片呢,这个比较简单,在wp_postmeta添加一条记录就行,像下面这样。

post_id对应文章的ID,meta_value对应图片的ID,都是对应wp_post表的ID。

代码部分

之前写了一篇关于爬取内容并上传到wordpress的一篇教程,我在那个基础上添加一个参数,为图片的url,图片添加到媒体库并设为文章封面图的小功能,若无图片则不添加封面。

通过requests和BytesIO获得图片,再通过PIL获得图片的长宽,用于_wp_attachment_metadata的值

import pymysql
import requests
from io import BytesIO
from PIL import Image

post_sqlbase=r"INSERT INTO wp_posts(post_author,post_date,post_date_gmt,post_content,post_title,post_status,comment_status,ping_status,post_name,post_modified,post_modified_gmt,post_parent,menu_order,post_type) VALUE(1,now(),DATE_ADD(now(),INTERVAL '-8' HOUR),'%s','%s','publish','open','open','%s',now(),DATE_ADD(now(),INTERVAL '-8' HOUR),0,0,'post')"
category_sqlbase=r"INSERT INTO wp_term_relationships(object_id,term_taxonomy_id,term_order) VALUE(%s,%s,0)"
count_sqlbase="UPDATE wp_term_taxonomy SET count=count+1 WHERE term_id ='%s' "
image_sqlbase="INSERT INTO wp_posts(post_author,post_date,post_date_gmt,post_content,post_title,post_status,comment_status,ping_status,post_name,post_modified,post_modified_gmt,post_parent,guid,menu_order,post_type,post_mime_type) VALUE(1,now(),DATE_ADD(now(),INTERVAL '-8' HOUR),' ','%s','inherit','open','closed','%s',now(),DATE_ADD(now(),INTERVAL '-8' HOUR),0,'%s',0,'attachment','image/jpeg')"
postmeta_sqlbase="INSERT INTO wp_postmeta(post_id,meta_key,meta_value) VALUE ('%s','%s','%s')"
profile_base='a:4:{s:5:"width";i:%s;s:6:"height";i:%s;s:4:"file";s:%s:"%s";s:5:"sizes";a:1:{s:4:"full";a:3:{s:5:"width";i:%s;s:6:"height";i:%s;s:4:"file";s:%s:"%s";}}}'

def getSize(img_url):
    response=requests.get(img_url)
    f=BytesIO(response.content)
    image=Image.open(f)
    return image.size

def upload(title,content,name,cate_id,img_url):
    sql=post_sqlbase % (content,title,name)
    db=pymysql.connect('数据库ip','数据库用户名','数据库用户密码','数据库名')
    cursor=db.cursor()
    try:
        cursor.execute(sql)
        post_id=cursor.lastrowid
        sql2=category_sqlbase % (post_id,cate_id)
        sql3=count_sqlbase % cate_id
        cursor.execute(sql2)
        cursor.execute(sql3)

        if img_url:
            file_name=img_url.split('/')[-1]
            image_name=file_name.split('.')[0]
            thumbsql=image_sqlbase % (image_name,image_name,img_url)
            cursor.execute(thumbsql)
            thumb_id=cursor.lastrowid
            width,height=getSize(img_url)
            metasql=postmeta_sqlbase % (post_id,'_thumbnail_id',thumb_id)
            profilesql=postmeta_sqlbase % (thumb_id,'_wp_attachment_metadata',profile_base % (width,height,len(file_name),file_name,width,height,len(file_name),file_name))
            cursor.execute(metasql)
            cursor.execute(profilesql)

        db.commit()
    except Exception as e:
        db.rollback()
        print(e)
    db.close()

在爬取内容时,获取内容出现的第一张图片的url传入upload函数中,作为文章的封面图,若无则不传参,因为不同的网站的结构不同,所以爬取部分的代码这里我就不展示出来了,那么我们接下来看一看效果吧。(以下爬取网站仅作为学习参考,请勿尝试违法行为)

测试一下

这是被爬取的原文

这是爬取后在文章列表显示的样式,这个主题选择文章的特色图片为文章缩略图

这是点进去文章显示的样式

因为图片想要设为特色图片是需要先添加在媒体库的,所以在媒体库会储存这张封面图

其他

以上就是关于如何为wordpress上传图片与设为特色图片的一些小方法啦,因为图片都是外链图片,所以爬取的图片都不是保存在本地,只是保存图片的URL而已,还有什么疑问或建议欢迎在下面留言,我会尽快回复的。

评论

Felix 管理员

回复 @秋冬: 在这里暂时保存图片二进制数据是为了获取图片的宽高,用于_wp_attachment_metadata中的属性值

回复

Felix 管理员

回复 @秋冬: 可以呀,调用图床提供的api上传图片获取url就行,其实这篇文章里面的特色图片也是引用外链图片(原文图片的地址),文章最后一张图片里面的那个url显示的就是原文图片的url。

回复

秋冬

大神,我有几个问题: 特色图按你的方法,要先把图片保存到本地. 但是我想把图片保存到图床上面, 通过外链引用的方法引用图片. 能实现吗?

回复

  • 最新随笔

  • 对我来说,写东西很好的一点是,自己写的东西,后面基本都会再看,一遍或者很多遍。这样就可以很好地发现自己之前的漏洞,并看看现在有什么变化。
  • 前段时间应该是百度更新了页面结构,那个黑帽泛目录网站我也没有去更新代码,就导致了文章页没有相关推荐,没想到这时候谷歌开始收录了,而且效果还不错。其实之前在谷歌一直不收录的时候就有怀疑过没有尽头的相关推荐很可能是导致不收录的原因,不过也一直没有去管它,而这次误打误撞的收录也恰恰证实了这个想法。(btw,其实这个网站从出现固定链接开始叫泛目录应该不太准确)
  • 最近吉他谱网站iloveguitar上线了,这几天在填充一些内容花了一些时间,这个网站也是使用flask作为后端框架的,前端UI框架使用的是bootstrap4,喜欢吉他的小伙伴欢迎来这里逛一逛哟,有什么建议欢迎在留言板提一下哟。
  • 那个泛目录网站发布了几个星期了,百度没怎么来爬,收了一个首页,谷歌直接就不收了,倒是一个查外链的网站天天来爬(笑哭),还有建议一点就是泛目录还是用在有建站历史的域名比较好(因为已经过了审核期),新域名就尽量不要用了。
  • 刚刚又发了一篇,最近文章百度都不太收录,orz,哈哈
  • 之前那个用python做的静态资源服务器,我又发现了一大用处,现在我都用来在局域网里的不同电脑之间传输文件,真的好用哈哈
  • 今天交换到了博客有史以来第一条友情链接
  • 刚刚更新了一下博客,修复了一些bug,添加了一个项目页