有没有办法在不加载整个WordPress核心的情况下使用WordPress用户?

时间:2011-09-12 作者:Victor

我有一个Wordpress网站和一个web应用程序,只能由注册(Wordpress)用户使用。

现在我正在加载wp-blog-header.php 检查用户是否已登录。一切都很好,但因为在每次请求(包括AJAX)时,我也必须加载Wordpress内核,这明显会减慢我的应用程序的速度(超过总加载时间的70%)。

有没有简单的方法可以使用Wordpress用户,但不必加载整个Wordpress核心?

更新:我需要知道哪个用户已登录,而且安全性也很重要。

非常感谢。

6 个回复
最合适的回答,由SO网友:Otto 整理而成

如果必须这样做,我会使用自己的cookie来确定登录名,并且只在必要时加载WordPress进行检查。

wordpress\\u logged\\u in{some hash}cookie可用于确定用户,wordpress使用它来确定相同的用户。您无法轻松地重新实现它,但您可以使用它,而无需在多个请求上加载WordPress。

例如,下面是我的cookie哈希(完全由数据组成,但真实):

key: wordpress_logged_in_1234567890abcdef1234567890abcdef
value: admin|1234567890|abcdef1234567890abcdef1234567890
WordPress知道cookie如何有效的方式是无关紧要的,你只需要知道它是否有效一次,然后你用一个秘密签名。

所以,第一次,用户还没有得到验证。您加载wp-load。php和WP验证cookie并让用户登录。现在,您可以做任何事情来向自己证明用户已经登录,然后设置自己的cookie。密钥可以是您自定义的任何内容,也可以是使用hash\\u hmac函数使用密钥生成消息摘要的值。

$key = ... // the key from the WP cookie
$value = ... // the value from the WP cookie
$hash = hash_hmac ( \'md5\' , $key.$value , \'some secret key\' );
您将返回乱七八糟的信息,您可以使用setcookie()将其发送给他们。在将来的请求中,他们会将此cookie发送回您。您可以先检查它,然后使用相同的哈希函数和密钥对其进行验证。

只有您才能生成哈希,因为只有您知道密钥。因此,如果他们返回一个有效的哈希值,该哈希值也与他们为其WP cookie发送的哈希值相匹配,那么您知道他们之前已经通过您的代码使用WP进行了验证,并且您可以从该值中获得正确的用户名(很明显,这是cookie的第一部分)。那么你就不必加载WP了。

顺便说一句,密钥应该是长的和随机的。不是短密码。不是字典上的单词。只是一些无意义的胡言乱语。线路噪音,而且很多。示例键:\'GHY5hFNqq4Ntdu=3:SUp8#/+_W!- @@^@xslN*L|N+Vn;(1xo8jNyp,au$v9Ki5*\'

SO网友:Victor

因为我在用户管理之外还使用了一些Wordpress功能,所以我决定继续加载WP核心,但我制作了一个自定义文件,只加载我需要的内容,而不加载插件。新的加载时间令人满意(从全WP加载时的1.5s减少到0.3s)

我制作了一个名为“wp load minimum”的文件。php’和我调用这个文件,而不是‘wp blog header’。php\'

这是WP 3.3的工作。以下是文件的内容,如果您觉得有用:

<?php

//this stops wp-settings from load everything
define (\'SHORTINIT\',true);

error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );

/** Define ABSPATH as this files directory */
define( \'ABSPATH\', dirname(__FILE__) . \'/\' );

//WP config file
require (\'wp-config.php\');

if (SHORTINIT):

// Load the l18n library.
require( ABSPATH . WPINC . \'/l10n.php\' );

// Run the installer if WordPress is not installed.
wp_not_installed();


// Load most of WordPress.
require( ABSPATH . WPINC . \'/class-wp-walker.php\' );
//require( ABSPATH . WPINC . \'/class-wp-ajax-response.php\' );
require( ABSPATH . WPINC . \'/formatting.php\' );
require( ABSPATH . WPINC . \'/capabilities.php\' );
require( ABSPATH . WPINC . \'/query.php\' );
require( ABSPATH . WPINC . \'/theme.php\' );
require( ABSPATH . WPINC . \'/user.php\' );
require( ABSPATH . WPINC . \'/meta.php\' );
require( ABSPATH . WPINC . \'/general-template.php\' );
require( ABSPATH . WPINC . \'/link-template.php\' );
//require( ABSPATH . WPINC . \'/author-template.php\' );
require( ABSPATH . WPINC . \'/post.php\' );
//require( ABSPATH . WPINC . \'/post-template.php\' );
//require( ABSPATH . WPINC . \'/category.php\' );
//require( ABSPATH . WPINC . \'/category-template.php\' );
require( ABSPATH . WPINC . \'/comment.php\' );
//require( ABSPATH . WPINC . \'/comment-template.php\' );
require( ABSPATH . WPINC . \'/rewrite.php\' );
//require( ABSPATH . WPINC . \'/feed.php\' );
//require( ABSPATH . WPINC . \'/bookmark.php\' );
//require( ABSPATH . WPINC . \'/bookmark-template.php\' );
require( ABSPATH . WPINC . \'/kses.php\' );
require( ABSPATH . WPINC . \'/cron.php\' );
//require( ABSPATH . WPINC . \'/deprecated.php\' );
require( ABSPATH . WPINC . \'/script-loader.php\' );
require( ABSPATH . WPINC . \'/taxonomy.php\' );
//require( ABSPATH . WPINC . \'/update.php\' );
//require( ABSPATH . WPINC . \'/canonical.php\' );
require( ABSPATH . WPINC . \'/shortcodes.php\' );
require( ABSPATH . WPINC . \'/media.php\' );
require( ABSPATH . WPINC . \'/http.php\' );
require( ABSPATH . WPINC . \'/class-http.php\' );
require( ABSPATH . WPINC . \'/widgets.php\' );
require( ABSPATH . WPINC . \'/nav-menu.php\' );
//require( ABSPATH . WPINC . \'/nav-menu-template.php\' );
//require( ABSPATH . WPINC . \'/admin-bar.php\' );

// Load multisite-specific files.
if ( is_multisite() ) {
    require( ABSPATH . WPINC . \'/ms-functions.php\' );
    require( ABSPATH . WPINC . \'/ms-default-filters.php\' );
    require( ABSPATH . WPINC . \'/ms-deprecated.php\' );
}

// Define constants that rely on the API to obtain the default value.
// Define must-use plugin directory constants, which may be overridden in the sunrise.php drop-in.
wp_plugin_directory_constants( );

// Load must-use plugins.
/*foreach ( wp_get_mu_plugins() as $mu_plugin ) {
    include_once( $mu_plugin );
}
unset( $mu_plugin );*/

// Load network activated plugins.
if ( is_multisite() ) {
    foreach( wp_get_active_network_plugins() as $network_plugin ) {
        include_once( $network_plugin );
    }
    unset( $network_plugin );
}

do_action( \'muplugins_loaded\' );

if ( is_multisite() )
    ms_cookie_constants(  );

// Define constants after multisite is loaded. Cookie-related constants may be overridden in ms_network_cookies().
wp_cookie_constants( );

// Define and enforce our SSL constants
wp_ssl_constants( );

// Create common globals.
require( ABSPATH . WPINC . \'/vars.php\' );

// Make taxonomies and posts available to plugins and themes.
// @plugin authors: warning: these get registered again on the init hook.
create_initial_taxonomies();
create_initial_post_types();

// Register the default theme directory root
//register_theme_directory( get_theme_root() );

// Load active plugins.
/*foreach ( wp_get_active_and_valid_plugins() as $plugin )
    include_once( $plugin );
unset( $plugin );*/

// Load pluggable functions.
require( ABSPATH . WPINC . \'/pluggable.php\' );
//require( ABSPATH . WPINC . \'/pluggable-deprecated.php\' );

// Set internal encoding.
wp_set_internal_encoding();

// Run wp_cache_postload() if object cache is enabled and the function exists.
if ( WP_CACHE && function_exists( \'wp_cache_postload\' ) )
    wp_cache_postload();

do_action( \'plugins_loaded\' );

// Define constants which affect functionality if not already defined.
wp_functionality_constants( );

// Add magic quotes and set up $_REQUEST ( $_GET + $_POST )
wp_magic_quotes();

do_action( \'sanitize_comment_cookies\' );

/**
 * WordPress Query object
 * @global object $wp_the_query
 * @since 2.0.0
 */
$wp_the_query = new WP_Query();

/**
 * Holds the reference to @see $wp_the_query
 * Use this global for WordPress queries
 * @global object $wp_query
 * @since 1.5.0
 */
$wp_query =& $wp_the_query;

/**
 * Holds the WordPress Rewrite object for creating pretty URLs
 * @global object $wp_rewrite
 * @since 1.5.0
 */
$wp_rewrite = new WP_Rewrite();

/**
 * WordPress Object
 * @global object $wp
 * @since 2.0.0
 */
$wp = new WP();

/**
 * WordPress Widget Factory Object
 * @global object $wp_widget_factory
 * @since 2.8.0
 */
$GLOBALS[\'wp_widget_factory\'] = new WP_Widget_Factory();

do_action( \'setup_theme\' );

// Define the template related constants.
wp_templating_constants(  );

// Load the default text localization domain.
load_default_textdomain();

// Find the blog locale.
$locale = get_locale();
$locale_file = WP_LANG_DIR . "/$locale.php";
if ( ( 0 === validate_file( $locale ) ) && is_readable( $locale_file ) )
    require( $locale_file );
unset($locale_file);

// Pull in locale data after loading text domain.
require( ABSPATH . WPINC . \'/locale.php\' );

/**
 * WordPress Locale object for loading locale domain date and various strings.
 * @global object $wp_locale
 * @since 2.1.0
 */
$GLOBALS[\'wp_locale\'] = new WP_Locale();

// Load the functions for the active theme, for both parent and child theme if applicable.
/*if ( ! defined( \'WP_INSTALLING\' ) || \'wp-activate.php\' === $pagenow ) {
    if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . \'/functions.php\' ) )
        include( STYLESHEETPATH . \'/functions.php\' );
    if ( file_exists( TEMPLATEPATH . \'/functions.php\' ) )
        include( TEMPLATEPATH . \'/functions.php\' );
}*/

do_action( \'after_setup_theme\' );

// Load any template functions the theme supports.
//require_if_theme_supports( \'post-thumbnails\', ABSPATH . WPINC . \'/post-thumbnail-template.php\' );

// Set up current user.
$wp->init();

/**
 * Most of WP is loaded at this stage, and the user is authenticated. WP continues
 * to load on the init hook that follows (e.g. widgets), and many plugins instantiate
 * themselves on it for all sorts of reasons (e.g. they need a user, a taxonomy, etc.).
 *
 * If you wish to plug an action once WP is loaded, use the wp_loaded hook below.
 */
do_action( \'init\' );

// Check site status
if ( is_multisite() ) {
    if ( true !== ( $file = ms_site_check() ) ) {
        require( $file );
        die();
    }
    unset($file);
}

/**
 * This hook is fired once WP, all plugins, and the theme are fully loaded and instantiated.
 *
 * AJAX requests should use wp-admin/admin-ajax.php. admin-ajax.php can handle requests for
 * users not logged in.
 *
 * @link http://codex.wordpress.org/AJAX_in_Plugins
 *
 * @since 3.0.0
 */
do_action(\'wp_loaded\');

endif;

//require( ABSPATH . WPINC . \'/pluggable.php\' );

SO网友:Anna Ericson

对于Wordpress 4.9:因为我无法评论(新用户)。我用于制作的最终解决方案(单个WP安装)is_user_logged_in()current_user_can() 工作如下。我们require(\'wp-load.php\') first (跳过加载日志标题中的wp()。php),并获取ABSPATH 常数则手动包括exactly 所有需要的东西。

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

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

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

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

时间差(0.3瑞典克朗)可能与安装和PHP引擎不同,但在一个页面上验证多个请求时,事情会累加起来!

记住对WP installed dir使用相对调用。从Wordpress自定义插件目录,在一个子目录级别内,正常安装,路径应如下所示:

$wordpress = \'../../../../wp-load.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\' );
在此之后,可以访问用户验证。对于其他任务,运行一个或两个请求,跟踪其他需要的文件可能不值得0.3瑞典克朗。跳过SHORTINIT 恒定和手动杂乱。

SO网友:hakre

Wordpress本身仅处于打开或关闭状态。有时,但这只是偶然的,不是有意的,你可以解决这个问题。但就你而言,我不确定这是否可能。

而不是wp-blog-header.php 您可以尝试仅加载WP函数,包括wp-load.php 相反也许这会有帮助。

SO网友:Rarst

使用WP可以获得的最快速度是制作自定义包装器,该包装器将定义SHORTINIT 然后加载堆芯。这将使核心负载在连接数据库之后以及处理大多数API和扩展(主题和插件)之前立即停止。

从那里,您可以尝试单独通过数据库获取或有选择地加载所需的部分核心。

这是一个相当混乱的方法,但它接近于在WP中得到的更轻的核心负载。

SO网友:T.Todua

似乎已经讨论过了。因此,请在以下位置查看更新:https://core.trac.wordpress.org/ticket/37584

结束

相关推荐

posts_nav_link on single.php

情况。。。我使用3个类别。其中一个叫做“新闻”。此页面左侧显示“新闻”类别中的最新帖子,左侧显示同一类别中的10篇最新帖子。还有默认导航。。。«上一页-下一页»。“新闻”类别中的单个帖子看起来与“新闻”页面相同。左边是帖子,右边是最近的10篇帖子。还有导航。。。这就是问题所在。导航按钮链接到:../news/single-post-title/page/2/ 其应链接到:../news/page/2/ 无论如何要解决这个问题?如何将下一页/上一页链接添加到单个页面。php?