最近修改了一下之前上传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。

回复

秋冬

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

回复

  • 最新随笔

  • 尝试让DALLE生成一些连续的精灵图,让gpt帮忙生成一些提示词,如果能稳定输出的话就很强大了。
    让gpt帮忙生成的DALLE提示词
    "Generate a pixel art sprite sheet of a character walking in four directions (north, south, east, west) in a retro video game style."
    "Create a series of pixel art frames showing a character performing different actions like walking, running, jumping, and attacking in a classic 2D game aesthetic."
  • 路过别人山庄的门口,被一条大黑狗边叫边追过来,幸好骑电动车,不然还不一定跑得过,哈哈哈哈哈哈哈哈哈哈。
  • 最近两周也没咋出去玩,主要也是觉得没啥好玩的(笑哭)。看完布莱恩阿瑟的《复杂经济学》后,里面那个酒吧问题勾起我的兴趣,最近空了就花了些时间实现个python版本,顺便搞了篇博文,很享受这种新知识能和已有知识碰撞的感觉。(配张前段时间拍的图片,梧桐山门口前面那条路,挺漂亮的)
  • 盐田港夜景
  • 为啥这猫总喜欢喝杯子里的水
  • 确实开始冷了,在树林里至少要比人类聚集区低个几度,进出入口就能很明显感觉到。看看深圳水库的风景,貌似后面的视野更开阔。
  • 给随笔加了多图的功能,传一传周末拍的风景图,漫无目的的逛也挺好玩的。
  • 逻辑自洽是一套体系的根基,最根本的因素,最吸引人的地方