Có cách nào để sử dụng người dùng Wordpress nhưng không tải toàn bộ lõi Wordpress không?


11

Tôi có một trang Wordpress và một ứng dụng web chỉ có thể được sử dụng bởi người dùng đã đăng ký (Wordpress).

Bây giờ tôi đang tải wp-blog-header.phpđể kiểm tra xem người dùng đã đăng nhập chưa. Mọi thứ đều hoạt động tốt nhưng vì mỗi yêu cầu (bao gồm AJAX) tôi cũng phải tải lõi Wordpress, nó làm chậm ứng dụng của tôi một cách rõ ràng (hơn 70% so với tổng số thời gian tải).

Có cách nào đơn giản để sử dụng người dùng Wordpress nhưng không tải toàn bộ lõi Wordpress không?

Cập nhật: Tôi cần biết người dùng nào đã đăng nhập và bảo mật cũng quan trọng.

Cảm ơn bạn!

Câu trả lời:


9

Nếu tôi phải làm điều này, tôi sẽ sử dụng cookie của riêng mình để xác định đăng nhập và chỉ tải WordPress để kiểm tra khi cần thiết.

Cookie wordpress_logged_in_ {some-hash} có thể được sử dụng để xác định người dùng và WordPress sử dụng nó để xác định tương tự. Bạn không thể dễ dàng thực hiện lại điều đó, nhưng bạn có thể sử dụng nó mà không cần tải WordPress trên nhiều yêu cầu.

Ví dụ: đây là hàm băm cookie của tôi (hoàn toàn tạo thành dữ liệu, nhưng thực tế):

key: wordpress_logged_in_1234567890abcdef1234567890abcdef
value: admin|1234567890|abcdef1234567890abcdef1234567890

Cách WordPress biết cookie đó hợp lệ như thế nào là không liên quan, tất cả những gì bạn cần biết là liệu nó có hợp lệ một lần hay không, sau đó bạn ký nó với một bí mật.

Vì vậy, lần đầu tiên, người dùng chưa được chứng minh. Bạn tải wp-load.php và WP xác thực cookie và đăng nhập người dùng. Bây giờ bạn làm bất cứ điều gì bạn làm để chứng minh với bản thân rằng người dùng đã đăng nhập, sau đó bạn đặt cookie của riêng mình. Khóa có thể là bất cứ thứ gì tùy chỉnh với bạn, giá trị bạn tạo thành thông báo tiêu hóa với khóa bí mật sử dụng hàm 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' );

Bạn sẽ nhận lại được sự vô nghĩa, mà bạn gửi lại cho họ bằng setcookie (). Theo yêu cầu trong tương lai, họ sẽ gửi lại cookie này cho bạn. Bạn có thể kiểm tra trước và xác thực nó bằng cách sử dụng cùng hàm băm và khóa bí mật.

Chỉ bạn mới có thể tạo băm vì chỉ có bạn mới biết khóa bí mật. Vì vậy, nếu họ gửi lại một hàm băm hợp lệ cũng khớp với những gì họ gửi cho cookie WP của họ, thì bạn biết rằng họ đã được xác thực với WP, thông qua mã của bạn, trước đó và bạn có thể lấy tên người dùng ngay từ giá trị đó (đầu tiên là một phần của cookie, rõ ràng). Sau đó, bạn không phải tải WP.

Khóa bí mật, BTW, phải dàingẫu nhiên . Không phải là một mật khẩu ngắn. Không phải là một từ trong từ điển. Chỉ là vô nghĩa lớn vô nghĩa. Dòng tiếng ồn, và rất nhiều nó. Khóa ví dụ: 'GHY5hFNqq4Ntdu=3:SUp8#/+_W!- @@^@xslN*L|N+Vn;(1xo8jNyp,au$v9Ki5*'


4

Vì tôi cũng đang sử dụng một số chức năng Wordpress bên cạnh quản lý người dùng, tôi đã quyết định tiếp tục tải lõi WP nhưng tôi đã tạo một tệp tùy chỉnh chỉ tải những gì tôi cần và không tải plugin. Thời gian tải mới thỏa mãn (giảm từ 1,5 giây khi tải WP đầy đủ xuống 0,3 giây)

Tôi đã tạo một tệp có tên 'wp-load-minim.php' và tôi gọi tệp này thay vì 'wp-blog-header.php'

Đây là woking cho WP 3.3. Đây là nội dung của tập tin, Nếu bạn thấy nó hữu ích:

<?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
Đây là một ý tưởng tốt. Một đề xuất: Có lẽ bạn có thể bỏ tải plugin và truy vấn được thiết lập (tất nhiên tùy thuộc vào trường hợp sử dụng của bạn).
chrisguitarguy

3

Đối với Wordpress 4.9: Như tôi không thể nhận xét (người dùng mới). Linh hồn cuối cùng (cài đặt WP đơn) tôi sử dụng để tạo is_user_logged_in()current_user_can()làm việc, như sau: Trước require('wp-load.php') tiên, chúng tôi (bỏ qua wp () trong load-blog-header.php)ABSPATHsau đó nhận được hằng số, theo cách thủ công bao gồm chính xác tất cả những thứ cần thiết.

Sử dụng define('SHORTINIT', true)+ require('wp-load.php')+ thủ công bao gồm:

Pageload: 1.05 sek - bao gồm các tệp: 43 tệp

So sánh: CHỈ sử dụng require('wp-load.php'):

Pageload: 1,35 sek - bao gồm các tệp: 419 tệp

Sự khác biệt về thời gian (0,3 sek) có thể khác với các bản cài đặt và các công cụ PHP, nhưng trong khi xác thực nhiều yêu cầu trên một trang tải-bổ sung!

Hãy nhớ sử dụng cuộc gọi tương đối đến thư mục cài đặt WP. Từ một thư mục plugin tùy chỉnh Wordpress, bên trong một cấp độ phụ, cài đặt bình thường, một đường dẫn sẽ như sau:

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

Sau đó:

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

Sau này, xác nhận người dùng có thể truy cập. Đối với tác vụ khác, r unning trên một hoặc hai yêu cầu , theo dõi các tệp cần thiết khác có thể không có giá trị 0,3 sek. Bỏ qua sự SHORTINITlộn xộn liên tục và thủ công.


+1 để sử dụng cuộc gọi đầu tiên với tư cách là người thân, Mọi thứ có thể thực sự lộn xộn nếu cho vay lõi wp từ các url tuyệt đối.
Jonas Lundman

2

Wordpress chỉ là bật hoặc tắt. Đôi khi, nhưng đó chỉ là tình cờ chứ không phải do thiết kế, bạn có thể làm việc xung quanh đó. Nhưng trong trường hợp của bạn, tôi không thực sự chắc chắn nếu nó có thể.

Thay vì wp-blog-header.phpbạn có thể cố gắng chỉ tải các chức năng WP, wp-load.phpthay vào đó hãy bao gồm . Có lẽ điều đó giúp.


wp-blog-header.phpvề cơ bản tải wp-load.phpnên không có sự khác biệt ...

2
@Victor: Có một sự khác biệt. Nó loại bỏ lửa wp();mà thực sự khá đắt.
hakre

OK, bây giờ tôi đang cố gắng tìm hiểu chính xác wp () làm gì.

Tôi đã thực hiện một số thử nghiệm wp-load.phpthay vì wp-blog-header.php, mọi thứ dường như hoạt động tốt nhưng thời gian tải là như nhau.

@Victor: Bạn đang sử dụng đồng hồ trong khi nhấn F5 hay bạn thực sự đo như thế nào? Dù sao đi nữa, đừng sử dụng WordPress nếu bạn thực sự cần một khung công tác. Bạn có thể cố gắng chỉ tải các chức năng bạn thực sự yêu cầu thay thế. Nhưng bạn cần phải tìm kiếm chúng từng chút một. Chỉ cần bao gồm các tệp bạn thực sự cần, như chức năng người dùng và cơ sở dữ liệu có thể truy cập.
hakre

1

Bạn có thể thử truy cập vào bảng trực tiếp. Nếu bạn biết muối của các tệp mật khẩu, bạn có thể yêu cầu họ đăng nhập thông qua hệ thống của riêng bạn, hãy tự muối mật khẩu (xem cách wordpress thực hiện) và tự theo dõi chúng. Nếu bạn muốn có khả năng duyệt qua hệ thống của riêng bạn và wordpress mà không cần xác thực lại, bạn có thể tạo một plugin để wordpress chuyển phiên người dùng hiện tại vào hệ thống của bạn.


0

Cách nhanh nhất bạn có thể nhận được với WP là tạo trình bao bọc tùy chỉnh sẽ xác định SHORTINITvà sau đó tải lõi. Điều này sẽ khiến tải lõi dừng ngay sau khi cơ sở dữ liệu được kết nối và trước khi hầu hết các API và tiện ích mở rộng (chủ đề và plugin) được xử lý.

Từ đó bạn có thể cố gắng lấy bằng cơ sở dữ liệu một mình hoặc tải có chọn lọc các phần lõi bạn cần.

Đây là một cách tiếp cận khá lộn xộn, nhưng nó gần với tải trọng cốt lõi nhẹ hơn như mọi thứ có trong WP.


SHORTINIT là một cách tiếp cận tốt, nhưng điều này có nghĩa là tất cả các chức năng để kiểm tra người dùng và băm và như vậy sẽ không được tải. Bạn có thể thực hiện lại điều đó, nhưng lộn xộn, như bạn đã nói.
Otto

@Otto Có lẽ không thực hiện lại, mà là tải những phần lõi đó bằng tay. Và nếu có bất kỳ sửa đổi nào đối với người dùng cũng đang được thực hiện bằng cách tải các plugin bằng tay. Vâng, đây là cách tiếp cận khá liên quan. Nhưng giải pháp thay thế tiếp theo để có hiệu suất tốt hơn là bỏ hoàn toàn WP và làm việc trực tiếp với cơ sở dữ liệu, điều này thậm chí còn lộn xộn hơn.
Rarst


-1

Nếu bạn chỉ muốn cho phép tất cả người dùng Wordpress sử dụng ứng dụng web, bạn có thể sử dụng hệ thống quản lý người dùng Wordpress và chỉ cần kiểm tra xem người dùng có đăng nhập hay không.

Để kiểm tra điều này, bạn sẽ cần kiểm tra xem cookie có tên hay không wordpress_logged_in_{some-hash}. Nếu không, hãy chuyển hướng người dùng đến trang đăng nhập Wordpress. Một {some-hash}phần của tên cookie chỉ là một loạt các chữ cái và chữ số.


1
Tôi cần biết người dùng nào đã đăng nhập và bảo mật cũng quan trọng.

Đây là một cơn ác mộng an ninh. Bất cứ ai cũng có thể gửi yêu cầu với một cookie có cấu trúc như thế này. Vì bạn không kiểm tra hàm băm mà chỉ kiểm tra xem có bất cứ thứ gì tương đương với một hình thức đăng nhập hay không, nơi bạn có thể nhập bất cứ thứ gì cho người dùng và mật khẩu miễn là các trường không trống.
kraftner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.