加载最小的WordPress环境


12

我为网站制作了自己的上传服务,该服务与WP分开,但是使用WP提供了低级的数据库功能和用户验证。为此,我在主脚本(Uploadify)中包含了wp-load.php,但是这样做似乎用不必要的组件填充了服务器的内存。因此,我在脚本中看到一个错误,该错误似乎指向已安装的WP插件。

如何仅加载核心WP组件并忽略插件?这有可能吗?


Answers:


9

完全禁用插件意味着您失去了很多优势。

Wordpress的分布范围更广,可以撕掉帖子和链接等,但是它们总是落后于WordPress核心,而且往往无法生存很长时间。

这是可以做的一些事情

短初始化

将其放在您的wp-config.php中:

define( 'SHORTINIT', TRUE );

或在加载wordpress之前在某处定义它,应减少加载过程并将其拉回到最小的核心功能。

次要轻量级安装

设置第二个wordpress安装,仅包含所需的插件和主题(如果有)。然后将wp-config.php配置为使用相同的wp-content目录和数据库值。

反压

WordPress,原始的BBpress和glotpress等都是围绕BackPress库构建的。尽管可能缺少许多API和功能或需要重新实现/移植,但您可以使用它代替WordPress来完成工作。

选项表

我还要记住,WordPress将整个选项表加载到内存中以减少查询,如果您在其中保存任何大值,则会影响性能。

提早退出

您也可以尝试在WordPress加载过程中加入早期功能,并在WordPress完成之前退出PHP过程,但是我不能建议这样做的安全性。

选择性加载插件

还有关于选择性加载插件的文章,但确实需要对wordpress核心文件进行破解


+1是否尝试过“次要的轻量级安装”
kaiser 2012年

我做过类似的事情,尽管从来没有为此目的,但大多数用例最好由多站点服务。主要是我使用它,所以我可以同时运行开发安装,以便他们共享内容
Tom J Nowell

8

使用BackPress,但是我的发展很小,在这里我使用默认安装,并通过const使用较小的源。

看到 wp-settings.php

// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
    return false;

在中将const SHORTINIT设置为true wp-config.php并查看快速运行。 define( 'SHORTINIT', TRUE );

这些是您获得的文件:

// All are located in ABSPATH.WPINC
'/load.php'
'/default-constants.php'
'/version.php'
'/compat.php'
'/functions.php'
'/class-wp.php'
'/class-wp-error.php'
'/plugin.php'
'/default-filters.php'
'/pomo/mo.php'

// Only Multisite
'/ms-blogs.php'
'/ms-settings.php'

6

对于制作is_user_logged_in()current_user_can()工作,我在这里找到了类似的答案 (不能评论)。

手动使用define('SHORTINIT', true)+ require('wp-load.php')+包括:

页面加载量:1.05 sek- 包含的文件:43个文件

比较: 使用require('wp-load.php')

页面加载量:1.35 sek- 包含的文件:419个文件

时间差异(0.3 sek)可能与安装和PHP引擎不同,但是在一次页面加载中验证许多请求时-事情加起来!/ @ Anna Ericson

对WP安装目录使用相对调用是个好主意。从Wordpress自定义插件“ ROOT”中获取,例如:

$wordpress = '../../../wp-load.php';

然后在我的插件index.php中:

define('SHORTINIT', true);
include_once $wordpress;

require_once ( ABSPATH . WPINC . '/class-wp-user.php' );
require_once ( ABSPATH . WPINC . '/class-wp-roles.php' );
require_once ( ABSPATH . WPINC . '/class-wp-role.php' );
require_once ( ABSPATH . WPINC . '/class-wp-session-tokens.php' );
require_once ( ABSPATH . WPINC . '/class-wp-user-meta-session-tokens.php' );
require_once ( ABSPATH . WPINC . '/formatting.php' );
require_once ( ABSPATH . WPINC . '/capabilities.php' );
//require_once ( ABSPATH . WPINC . '/query.php' ); // - might be useful
require_once ( ABSPATH . WPINC . '/user.php' );
require_once ( ABSPATH . WPINC . '/meta.php' );

wp_cookie_constants();

require_once ( ABSPATH . WPINC . '/vars.php' );
require_once ( ABSPATH . WPINC . '/kses.php' );
require_once ( ABSPATH . WPINC . '/rest-api.php' );
require_once ( ABSPATH . WPINC . '/pluggable.php' );

在此之后,用户验证对我有用。感谢@Anna Ericson来自原始代码的最后几句话:

对于执行一个或两个请求的其他任务,跟踪其他所需文件可能不值得0.3 sek。跳过SHORTINIT 常数并手动进行处理。


1
到目前为止,这是最干净的方法。在ajax调用上工作正常,可以在我们的安装中加载已还原的图像。
乔纳斯·隆德曼

@cavameta您如何通过SHORTINIT将Woocommerce导入炒锅?
webmastx

2

你试过了define('SHORTINIT', true);吗?我没有亲自测试过它,但是它似乎在保留足够功能的同时加载了WP核心的很少方面,特别是如果您只想处理数据库的话。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.