为了账号安全,请及时绑定邮箱和手机立即绑定

如何改进 WordPress 插入/更新查询?

如何改进 WordPress 插入/更新查询?

PHP
森林海 2023-04-28 14:15:27
我正在创建自己的 WordPress 插件,将配置文件导入为帖子,并且在脚本运行时,我希望改进插入/更新帖子的查询。这个脚本每 5 分钟运行一次,并且像这样工作,1.从本地用户表中的外部源导入/更新所有配置文件。这很简单并且工作正常2 . 在更新之前将所有现有帖子自定义字段状态设置为离线$offline = "UPDATE $meta SET meta_value='offline' WHERE meta_key='status'";3 . 从表用户中选择所有在线的配置文件$new_query = "SELECT * FROM users WHERE status='online' ORDER BY visitors DESC";4 . 对于每个配置文件,如果帖子存在,则更新,否则创建新帖子$result = $wpdb->get_results($new_query);foreach ($result as $post){    $cat = $post->gender.'s';    $getterm = get_term_by('name',$cat,'user-category');    $cat_id = $getterm->term_id;    $custfields = array (        'name'          => $post->name,        'age'           => $post->age,        'subject'       => $post->subject,        'status'        => $post->status,        'fans'          => $post->fans,        'visitors'      => $post->visitors,    );    endif;    $postarr = array (        'post_title'    => $post->username,        'post_name'     => $post->username.'-profile',        'post_content'  => 'something',        'post_type'     => 'users-profile',        'post_category' =>  array($cat_id),        'post_status'   => 'publish',               'meta_input'    => $custfields    );    $postcheck = get_page_by_title($post->username,OBJECT, 'users-profile');            if($postcheck):            update_post_meta($postcheck->ID ,'subject', $post->subject );            update_post_meta($postcheck->ID ,'status', $post->status );            update_post_meta($postcheck->ID ,'visitors', $post->visitors );    else :        wp_set_object_terms(wp_insert_post( $postarr,true),$cat_id,'user-category',true);    endif;}) 
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

前缀索引 (KEY meta_keymeta_key(191))) 是可憎的。是的,由于utf8mb4. 但它正在伤害你。做这个

SELECT MAX(CHAR_LENGTH(meta_key)) from wp_postmeta;

如果返回 191 或更小,则将 meta_key 的大小更改为 191 并(191)在索引中删除。

UPDATEing很多行中的标志似乎是一种笨拙的处理方式。有没有一种方法可以在不使用离线/在线标志的情况下简单地折叠新数据?(我想我仍然缺少意图。)如果它是一百万行,则该更新可能需要很长时间。

“所有不在 SELECT 中的帖子”——这听起来像是“多表更新”语句。这将涉及一个LEFT JOIN ON ... WHERE ... IS NULL. 你能用重要的列模拟几行吗?向我们展示这些表格中应该包含的内容的“之前”和“之后”。

您还可以将上述操作应用于post_name.

age整数(11)

你每年都在增加吗?


查看完整回答
反对 回复 2023-04-28
  • 1 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信