我们能有一个没有鼻涕虫的职位吗?

时间:2013-10-22 作者:Brian Barnes

当我插入一篇帖子时,我发现在insert\\u post中有一个对wp\\u unique\\u post\\u slug的缓慢调用(在我用来测试的数据库中有155000篇帖子-live会有更多)。由于我不认为一个slug对我所做的事情很重要(浏览我们网站的人可能永远不会看到这种帖子类型的单一页面视图),我能做些什么来加快通话速度或(更好的)消除通话。

查看insert\\u post的代码,我看不到不修改core的方法(这是我不愿意做的)。我使用的代码是:

$post = array(
    \'post_title\' => \'post_title\',
    \'post_type\' => \'character\',
    \'post_status\' => \'publish\'
);
$post_id = wp_insert_post( $post );
编辑:因为人们似乎遗漏了我在这个问题中所写的信息。这是我能说清楚的问题。

问题:性能缓慢。我已经查到了这个函数wp_unique_post_slug 从内部调用wp_insert_post

调用wp_insert_post:

$post = array(
    \'post_title\' => \'post_title\',
    \'post_type\' => \'character\',
    \'post_status\' => \'publish\'
);

$post_id = wp_insert_post( $post );
(是的,它们都是字符串,而不是分配给$post的变量)

其他信息:

当这些帖子呈现给用户时,帖子状态需要为“发布”(虽然不是以标准的WordPress方式)。

我可以通过编辑核心来修复它,但这是一个BAD 这个想法有很多原因。

slug并不重要,因为用户不应该访问此内容类型的单个页面视图。

2 个回复
SO网友:Marek

我知道这是一个很老的问题,但今天我遇到了类似的问题,我找到了一个解决方案——如果wp_unique_post_slug() 调用是性能瓶颈,并且post_name 那么,价值并不重要set post_name manualy to some random value.

我的wp_insert_post 最近(20-30秒)后处理时间过长。保存自定义帖子类型order 访客不可见,带有post_title = "Order" (帖子标题无关紧要)。这导致了数千篇标题为“Order”的帖子,而WP正在自动生成帖子名(post_name) 如“订单1”、“订单2”、“订单3”。。。“订单-6152”。。。

而且每wp_insert_post WP从“order”开始搜索免费的帖子名称,并递增后缀数字,每一步都是一个DB查询。所以,在我的例子中,WP在向数据库插入一篇文章之前进行了6000多个DB查询。

Setting random post_name in wp_insert_post() call disables wp_unique_post_slug() call.

SO网友:kaiser

检查来源->中止案例wp_unique_post_slug(), 然后你会看到前两行是

if ( 
    in_array( $post_status, 
        array( \'draft\', \'pending\', \'auto-draft\' )
    )
    OR
    ( 
        \'inherit\' == $post_status 
        AND \'revision\' == $post_type 
    )
)
    return $slug;
这意味着没有任何计算、查询或处理if

post状态为draft、pending或auto draft,或

post状态为inherit 以及a类岗位revision正如您从wp_insert_post() where wp_unique_post_slug() 调用时,它会像您一样传递状态。

$post_name = wp_unique_post_slug(
    $post_name,
    $post_ID,
    $post_status,
    $post_type,
    $post_parent
);
如果帖子类型不是公共的,但只能从管理UI中看到,那么您只需忽略帖子状态,将其设置为draft(草稿)、pending(挂起)或其他(插入帖子时)即可,并且不会进行任何处理。

每次尝试都会失败,因为$wpdb->get_var() 没有筛选器。

也许解决方案

您仍然可以使用下拉菜单。替换$wpdb 类/对象。只需复制~/wp-includes/wp-db.php 放入名为db.php 并将其放入~/wp-content (或任何您命名的)文件夹。

然后修改$wpdb->get_var() 在从上下文调用时中止wp_unique_post_slug(). 那就取决于你的创造力和技能,如果你能更快地放弃它的话。

请记住,每次有核心更新时,都必须更新该文件。

注意:如果您离开post_status 参数为空,自动赋值draft.post 帖子类型,当没有分配类别时,它会自动分配默认类别。但前提是帖子状态不是auto-draft.post_date_gmt 为空,并且您正在添加草稿,则该值将自动设置为\'0000-00-00 00:00:00\'.post_name (标题)为空,状态为draft, auto-draftpending, 那么标题将不会被清除

结束

相关推荐

Performance on WPMS

我的WPMS站点托管在8核/32mb RAM服务器上,但响应时间非常长。我们有大约1000个博客(单个db上有35000多个表)和70000个页面浏览量。我认为我可以缩短响应时间,将具有更多页面浏览量的博客移动到单独的DB中,并使用hyper DB插件将所有博客拆分为每个DB 100个博客。你觉得怎么样?