Wordpressユーザーを使用する方法はありますが、Wordpressコア全体をロードしない方法はありますか?


11

登録済み(Wordpress)ユーザーのみが使用できるWordpressサイトとWebアプリケーションがあります。

現在wp-blog-header.php、ユーザーがログインしているかどうかを確認するためにロードしています。すべてが正常に機能していますが、すべてのリクエスト(AJAXを含む)でWordpressコアもロードする必要があるため、アプリケーションが目に見えて遅くなります(合計の70%以上)読み込み時間)。

Wordpressユーザー全体をロードせずに、Wordpressユーザーを使用する簡単な方法はありますか?

更新:ログインしているユーザーを知る必要があります。また、セキュリティも重要です。

ありがとうございました!

回答:


9

これを行う必要がある場合は、自分のCookieを使用してログインを判別し、必要な場合にのみWordPressをロードして確認します。

wordpress_logged_in_ {some-hash} Cookieを使用してユーザーを判別でき、WordPressはそれを使用してユーザーを判別します。簡単に再実装することはできませんが、WordPressを複数のリクエストでロードしなくても使用できます。

たとえば、これは私のCookieハッシュです(完全にデータを構成していますが、現実的です)。

key: wordpress_logged_in_1234567890abcdef1234567890abcdef
value: admin|1234567890|abcdef1234567890abcdef1234567890

WordPressがそのCookieがどのように有効であるかを知る方法は重要ではありません。知る必要があるのは、そのCookieが一度だけ有効であるかどうか、そして秘密で署名することです。

したがって、初めて、ユーザーはまだ証明されていません。wp-load.phpをロードし、WPがCookieを検証してユーザーをログインさせます。ここで、ユーザーがログインしたことを証明するために何をしても、独自のCookieを設定します。鍵は任意のカスタムにすることができ、hash_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()を使用して返送します。今後のリクエストで、彼らはあなたにこのクッキーを送り返します。最初にそれを確認し、同じハッシュ関数と秘密鍵を使用して検証できます。

あなただけが秘密鍵を知っているので、あなただけがハッシュを生成することができます。したがって、WP Cookieに対して送信するものと一致する有効なハッシュを送り返す場合は、以前にコードを介してWPで検証されていることがわかり、その値からユーザー名を取得できます(最初の値です) Cookieの一部です)。その後、WPをロードする必要はありません。

秘密鍵BTWは長くランダムである必要があります。短いパスワードではありません。辞書の単語ではありません。ただの意味不明な意味不明なもの。ラインノイズとその多く。キーの例: 'GHY5hFNqq4Ntdu=3:SUp8#/+_W!- @@^@xslN*L|N+Vn;(1xo8jNyp,au$v9Ki5*'


4

ユーザー管理の横にあるいくつかのWordpress関数も使用しているため、WPコアを引き続きロードすることにしましたが、必要なものだけをロードし、プラグインをロードしないカスタムファイルを作成しました。新しい読み込み時間は満足のいくものです(全WP負荷の1.5秒から0.3秒に減少しました)

「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' );

1
これは良い考えです。提案の1つは、プラグインのロードとクエリの設定を破棄できることです(もちろん、ユースケースによって異なります)。
chrisguitarguy

3

Wordpress 4.9の場合:コメントできない(新規ユーザー)。私が作成is_user_logged_in()およびcurrent_user_can()作業するために使用する最後の魂(単一のWPインストール)は、以下のとおりです。私たちは、require('wp-load.php') 最初の (負荷ブログ- header.phpの中WP()をスキップする)、およびget ABSPATH手動で含まれ、その後、定数を正確にすべてのものが必要。

define('SHORTINIT', true)+ require('wp-load.php')+を手動で使用すると、次のものが含まれます。

ページロード:1.05 sek- インクルードファイル:43ファイル

比較:ONLYの 使用require('wp-load.php')

ページロード:1.35 sek- インクルードファイル:419ファイル

時間差(0.3 sek)はインストールやPHPエンジンとは異なる場合がありますが、1つのページロードで多くのリクエストを検証している間に、合計が発生します!

WPにインストールされたディレクトリへの相対呼び出しを使用することを忘れないでください。Wordpressカスタムプラグインdirから、1つのサブディレクトリレベル内の通常のインストールでは、パスは次のようになります。

$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' );

この後、ユーザー検証にアクセスできます。他のタスクの場合、1つまたは2つの要求で実行し、他の必要なファイルを追跡することは、0.3 sekの価値がない場合があります。SHORTINIT定数をスキップして手動で乱雑にします。


+1を最初の呼び出しを相対として使用するには、絶対URLからwpコアを貸すと、物事が本当に厄介になる可能性があります。
Jonas Lundman、2018年

2

Wordpress自体はオンまたはオフです。場合によっては、それは偶然であり、設計によるものではないため、回避することができます。しかし、あなたの場合、それが可能かどうかは本当にわかりません。

代わりにwp-blog-header.php、WP関数のみをロードしようとするwp-load.php代わりに、インクルードしてください。多分それは役立ちます。


wp-blog-header.php基本的にロードされるwp-load.phpので、差異はありません...

2
@ビクター:違いがあります。それwp();は、実際にはかなり高価な点火を回避します。
hakre

OK、今私は正確にwp()が何をするかを理解しようとしています。

私はのwp-load.php代わりにいくつかのテストを行いましたがwp-blog-header.php、すべてが正常に動作しているように見えますが、ロード時間は同じです。

@Victor:F5を押しながら時計を使用していますか、または実際にどのように測定していますか?:)とにかく、実際にフレームワークが必要な場合はWordPressを使用しないでください。代わりに、実際に必要な関数のみをロードすることができます。しかし、それらを少しずつ探す必要があります。ユーザー関数やデータベースアクセスなど、実際に必要なファイルを含めるだけです。
hakre

1

テーブルに直接アクセスしてみてください。パスワードファイルのソルトがわかっている場合は、自分のシステムを介してログインさせることができ、自分でパスワードをソルトし(wordpressがどのように行うかを確認)、自分で追跡します。再認証なしで独自のシステムとワードプレスの間を行き来する機能が必要な場合は、現在のユーザーセッションをシステムに渡すワードプレスへのプラグインを作成できます。


0

WPで取得できる最速の方法は、SHORTINITコアを定義してロードするカスタムラッパーを作成することです。これにより、データベースが接続された直後で、ほとんどのAPIと拡張機能(テーマとプラグイン)が処理される前に、コアの読み込みが停止します。

そこから、データベースだけで取得するか、必要なコアの一部を選択的にロードすることができます。

これは非常に面倒なアプローチですが、WPに入るのと同じくらい、コアの負荷が軽くなります。


SHORTINITは良いアプローチですが、これは、ユーザーとハッシュなどをチェックするためのすべての関数がロードされないことを意味します。あなたはそれを再実装することができますが、あなたが言ったように面倒です。
Otto

@Ottoおそらく再実装せず、コアのそれらの部分を手動でロードします。プラグインによってユーザーに変更が加えられている場合は、それらも手動でロードします。ええ、これはかなり複雑なアプローチです。しかし、パフォーマンスを向上させる次の代替策は、WPを完全に廃止し、データベースを直接操作することです。これはさらに厄介です。
Rarst、2009


-1

すべてのWordpressユーザーがWebアプリを使用できるようにする場合は、Wordpressユーザー管理システムを使用して、ユーザーがログインしているかどうかを確認できます。

これを確認するには、指定したCookie wordpress_logged_in_{some-hash}が存在するかどうかを確認する必要があります。そうでない場合は、ユーザーをWordpressのログインページにリダイレクトします。{some-hash}Cookie名の一部は、一連の文字と数字です。


1
ログインしているユーザーを知る必要があります。また、セキュリティも重要です。

これはセキュリティの悪夢です。このような構造のCookieを使用して、誰でもリクエストを送信できます。ハッシュをチェックするのではなく、何かがあるかどうかをチェックするだけなので、フィールドが空でない限り、ユーザーとパスワードに何でも入力できるログインフォームに相当します。
クラフトナー2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.