wordpress批量删除指定分类所有文章

文章数量不多,可以直接后台手动删除,如果数量很多,需要执行SQL:

delete
from
wp_posts
using
wp_posts,
wp_term_relationships,
wp_term_taxonomy
where
wp_posts.id = wp_term_relationships.object_id
and
wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
and
wp_term_relationships.term_taxonomy_id = 18(分类ID)

如果还需删除分类:

delete FROM `wp_term_relationships` where term_taxonomy_id = 18(分类ID)

另外,update更新内容的用法:

UPDATE wp_posts SET post_content = replace( post_content, '原内容','新内容') WHERE option_name = 'home' OR option_name ='siteurl';

wordpress自动给旧文章生成别名

用wordpress遇到一个需求,需要重新修改网站固定连接格式,以前是以post id为url,现在需要修改为别名。

为了不影响原来的post的url结构,需要给原来的post批量生成别名,即slug_name=post_id

有以下几种方法。

注意,如果是安装了Opcache和Memcached缓存扩展,更新文章url结构后,一定要刷新下缓存。

方法一:在模板函数 functions.php 文件中添加代码实现批量修改旧文章别名

使用方法:将下边的代码添加到到当前主题目录下 functions.php 文件,在php结束标记 ?> 前 即可。

// 修改WordPress旧文章别名为文章IDfunction Bing_post_name_id(){query_posts( 'posts_per_page=-1' );while( have_posts() ){the_post();$post_id = $GLOBALS['post']->ID;wp_update_post( array('ID' => $post_id,'post_name' => $post_id) );}wp_reset_query();}if( $_GET['post_name_id'] == 'yes' ) add_action( 'init', 'Bing_post_name_id' );

放置好代码后,访问一下下边的网站,注意替换成你的域名,访问前注意一定要备份数据,以免出错。

http://www.aszhi.com?post_name_id=yes

文章多的话网页加载会比较慢,因为正在一篇文章一篇文章的修改别名,要耐心等到网页完全加载好才可以。

PS:加载好后,删除之前添加的代码,修改完成,所有文章的别名都会变成自身的ID。

方法二:在配置文件 wp-config.php 中添加代码实现批量修改旧文章别名

使用方法:将下面的代码添加到网站 根目录的 wp-config.php 的最底部,保存后,访问一次网站首页(你将看到浏览器一直都在努力打开网页,不要急,耐心等待,直到网页真正打开,所需时间看文章数和网络情况而定)。等网页打开后,删除刚刚添加到 wp-config.php 的代码!(删除代码是为了防止下次打开网站首页缓慢的情况发生)

/** 批量更改旧文章的别名为文章ID */// 添加一个变量来包容文章标题数组,防止重复操作$slug_done = array();// 查询所有文章$posts = $wpdb->get_results( "SELECT`ID`,`post_title`FROM`" . $wpdb->posts . "`WHERE`post_type` = 'post'" );// 输出文章foreach( $posts AS $single ) {$this_slug = $single->ID;$slug_done[] = $this_slug;// 使用文章ID替换文章原来的别名$wpdb->query( "UPDATE`" . $wpdb->posts . "`SET`post_name` = '" . $this_slug . "'WHERE`ID` = '" . $single->ID . "'LIMIT 1" );}

方法三:直接替换SQL数据库里的 post_name 字段的方法

进入 mysql 命令【 选择你所创建的数据库的命令:mysql> USE MYSQLDATA; (注:MYSQLDATA是数据库的名称。按回车键出现 Database changed 时说明操作成功!) 】或者 phpmyadmin 的 SQL (登录后打开数据库管理系统,找到网站对应的wordpress数据库,点击后,在上方有个SQL按钮) ,执行如下SQL命令修改即可:

update wp_posts set post_name=ID where post_status='publish' and post_type='post';

PS:wp_posts 是 WordPress 的文章数据表,wp_ 是默认的前缀,如果自定义更改过,请根据实际修改即可。

方法四:使用新建一个 PHP 文件批量修改旧文章别名

操作方法:将以下代码保存为 php 文件,比如 uppostname.php,并上传到网站根目录,执行即可,成功后记得删除!

<?php/*** 将所以已发布的文章别名修改成对应ID,让文章以别名完美连续* PS:备份网站数据库后,请放到WordPress根目录执行,成功后请记得删除!**/require('./wp-blog-header.php');global $wpdb;$wpdb->query("UPDATE $wpdb->posts SET post_name = ID WHERE post_status = 'publish' AND post_type = 'post'");echo 'Update Success!';?>

任选其中一种方法,成功执行之后,你之前发布的文章的别名就全部变成了对应的 ID 了!

新文章自动使用文章ID作为文章的别名的方法,看之前的文章:

继续阅读

WordPress Builder编辑器统计

WordPress常见的所见即所得(拖动)编辑器统计:

  • Elementor

Elementor用户量最大,功能最多,但是也略臃肿。

  • WPBakery

WPBakery应该是好评最多的编辑器。

  • Oxygen Builder

引用别人的一句话是:Oxygen is NOT a page builder is a THEME BUILDER…Big difference. 不仅仅是编辑器,还可以自己制作主题。

  • Divi Builder

貌似是后出来的?好评不少。

wordpress数据表及火车采集数据库发布

  • wordpress特色图片featured image写入数据库,先发布文章post,然后需要将图片作为post发布,再添加 _thumbnail_id 和 _wp_attached_file ,缺一不可:
INSERT INTO wp_posts (post_title,post_content,post_author,post_date,post_excerpt,to_ping,pinged,post_content_filtered,guid,post_type,post_status,post_mime_type) VALUES ('[标签:标题]','','[标签:authorid]','[系统时间转化:yyyy-MM-dd HH:mm:ss]','','','','','[标签:img-url]','attachment','inherit','image/[标签:image-type]');

INSERT INTO wp_postmeta(post_id,meta_key,meta_value) VALUES ([文章编号:wp_posts]-1,'_thumbnail_id',[文章编号:wp_posts]);

INSERT INTO wp_postmeta(post_id,meta_key,meta_value) VALUES ([文章编号:wp_posts],'_wp_attached_file','[标签:img-url-2]');
  • 同一张数据表如果要插入多组数据,可以:
INSERT INTO

wp_term_relationships (object_id,term_taxonomy_id)

VALUES

 ('[文章编号:wp_posts]','[标签:catid]'),
 ('[文章编号:wp_posts]','[标签:catid2]'),
 ('[文章编号:wp_posts]','[标签:catid3]');

但是火车采集不支持这种SQL写法,会报错,只能每次插入一行,分开写。

  • 如果要获取上一篇post的自增id,即post_id,可以用set变量:
set @var=[文章编号:wp_posts];
INSERT INTO wp_postmeta ( post_id,meta_key,meta_value)
VALUES
(@var-1,'_wp_attached_file','shows/[标签:img]'),
(@var-1,'_movie_poster',@var);

但是,火车采集同样不支持set变量。不过可以直接用减法运算:

INSERT INTO wp_postmeta(post_id,meta_key,meta_value) VALUES ([文章编号:wp_posts]-1,'_movie_poster',[文章编号:wp_posts]);
  • 前面关于wordpress火车采集数据库发布的文章:

有时需要更新wp_posts补全其他字段,否则会报错:

INSERT INTO wp_posts (post_title,post_content,post_author,post_name,post_date,post_excerpt,to_ping,pinged,post_content_filtered) VALUES ('[标签:标题]','[标签:内容]','[标签:authorid]','[标签:slug]','[系统时间转化:yyyy-MM-dd HH:mm:ss]','','','','');
  • 关于wordpress几张数据表的对应关系,前面也有:

用的比较多的时posts和category、tag之间的对应关系,经常容易搞错,我做了个说明图,一目了然。

  • 数据表的自增id是根据上一个(最后一个)id递增的,如果需要重置,或者设定从某id增加,执行下面代码
//设置sysuser_account表从88开始自增

alter table sysuser_account auto_increment=88;

wordpress自动设置文章第一张图为特色图

下面这段代码会将文章中第一张WordPress附件图片设置为特色图像,附件图片是指上传到WordPress的图片,不需要和当前的文章有关联。

function sola_auto_featured_image() {
  global $post;

  if( has_post_thumbnail() ){
    return;
  }

  preg_match('/<img\s[^>]*?class\s*=\s*[\'\"]([^\'\"]*?)[\'\"][^>]*?>/', $post->post_content, $matches);
  $img_class = $matches[1] ?? false;

  if( $img_class ){
    preg_match('/wp-image-([\d]+)/', $img_class, $matchId);
    $attachment_id = $matchId[1] ?? false;

    if( $attachment_id ){
        set_post_thumbnail($post->ID, absint($attachment_id) );
    }
  }
}

add_action('the_post', 'sola_auto_featured_image');
add_action('save_post_post', 'sola_auto_featured_image');

注意:add_action(‘the_post’, ‘sola_auto_featured_image’)会使这段代码在任何文章被加载时运行,比如archive页面,single post页面等等。好处是被人访问一段时间,你的所有文章就自动获得了特色图像,坏处就是对性能有影响。当你的特色图像设置的差不多时,应该将这一句注释掉。

继续阅读

WordPress优化之缓存侧边栏

之前有写关于wordpress优化的文章:

使用下来,Opcache+Memcached+WP Rocket组合效果非常好,但是无意间发现,原来这整个组合,也没有让wordpress侧边栏被缓存,也就是说,wordpress侧边栏是动态查询的,尤其是如果侧边栏有相关推荐,等动态内容的时候,每次打开页面wordpress都会动态查询数据库,即使用了 Opcache+Memcached+WP Rocket ,也不会缓存侧边栏。

update:关闭WP Rocket预缓存,就可以缓存侧边栏,原文连接在文章结尾;

同时,下面的方法对于开启wordpress多站点的,会有问题,可能会出现因跨域加载而页面混乱。

网上找到我爱水煮鱼关于缓存侧边栏的文章,试验下效果不错。但是他的代码有几个语法错误,保存后会报错,网上其他人抄代码的,竟然都没有指出错误,错误代码一起抄!!

我已经修改过来了。

  1. 进入 WordPress 后台,点击外观 => 主题编辑 => Sidebar (sidebar.php)。
  2. 在 sidebar.php 开头加入以下代码:
<?php 
$sidebar_html = ABSPATH . "wp-content/cache/sidebar.txt";
$have_cached = false;
if (file_exists($sidebar_html)){
    $file_time = filemtime($sidebar_html);
    if (($file_time + 3600) > time()){ //缓存1小时
        echo "<!-- cached sidebar -->";
        echo(file_get_contents($sidebar_html));
        echo "<!-- end of cached sidebar -->";
        $have_cached = true;
    }
}
if(!$have_cached){
    ob_start();}
?>

在 sidebar.php 结尾加入以下代码:

<?php
    $sidebar_content = ob_get_contents();
    ob_end_clean();
    $sidebar_fp = fopen($sidebar_html, "w");
 
    if ($sidebar_fp){
         fwrite($sidebar_fp, $sidebar_content);
         fclose($sidebar_fp);
    }
 
    echo $sidebar_content;
?>
继续阅读

wordpress安装插件open_basedir restriction in effect错误解决方法

Update: 如果wordpress按照第三方来历不明的主题或者插件,提示open_basedir restriction in effect错误,一定得注意,该主题或者插件,很有可能有后门,包含恶意跨站攻击病毒。

wordpress下载的第三方插件,上传安装的时候,一直提示如下相关错误:

Warning: scandir(): open_basedir restriction in effect. File(/www/wwwroot) is not within the allowed path(s)

开始以为环境配置问题,调整了很久,换了不同服务器测试,也都是这个错误。

网上查询,原来只需要关闭宝塔面板中的“防跨站攻击”即可。

继续阅读

WordPress数据表及字段

WordPress数据库的11个数据表

  • wp_commentmeta 文章评论额外信息表
  • wp_comments 文章评论信息表
  • wp_links 链接信息表
  • wp_options 基本配置信息表,通常通过get_option来操作,该表通常作为插件存储数据的一个地方。
  • wp_postmeta 文章额外数据表,例如文章浏览次数,文章的自定义字段等都存储在这里
  • wp_posts 文章信息表,包括了日志、附件、页面等等信息。是WordPress最重要的一个数据表。
  • wp_terms 文章分类、链接分类、标签的信息表。
  • wp_term_relationships 分类与文章信息表(wp_posts)、链接表(wp_links)的关联表。
  • wp_term_taxonomy 分类信息表,区分wp_terms信息的分类类型,有category、link_category和tag三种分类类型。
  • wp_usermeta 用户额外信息表
  • wp_users 用户基本信息表。存放系统所有用户基本信息。
继续阅读

火车采集器wordpress数据库发布规则

火车采集到的数据,直接数据库发布,比之前web接口发布,要高效很多很多,而且不太消耗服务器资源,高效!

INSERT INTO wp_posts (post_title,post_content,post_author,post_name,post_date) VALUES ('[标签:标题]','[标签:内容]','1','[标签:slug]','[系统时间转化:yyyy-MM-dd HH:mm:ss]')
INSERT INTO wp_term_relationships (object_id,term_taxonomy_id) VALUES ('[文章编号:wp_posts]','[标签:catid]')
INSERT INTO wp_postmeta (post_id,meta_key,meta_value) VALUES ('[文章编号:wp_posts]','[标签:自定义字段]','[标签:自定义值]')

若是单表或多表无关联,则直接写INSERT语句即可;

若是多表,且存在某字段相互关联,则用 文章编号:表名XXX] 来关联上一个表的自增ID;

代码1:slug标签为URL别名,自定义url别名有利于seo,更重要的是可以给采集来的数据添加内部链接。

代码2:是给添加的文章归类;catid标签可以是一个固定值,直接从采集结果中传递过来。

代码3:给文章添加自定义字段。