最近修改了一下之前上传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而已,还有什么疑问或建议欢迎在下面留言,我会尽快回复的。
回复 @秋冬: 可以呀,调用图床提供的api上传图片获取url就行,其实这篇文章里面的特色图片也是引用外链图片(原文图片的地址),文章最后一张图片里面的那个url显示的就是原文图片的url。