มีวิธีการใช้ผู้ใช้ Wordpress แต่ไม่โหลดหลักทั้ง Wordpress หรือไม่


11

ฉันมีเว็บไซต์ Wordpress และเว็บแอปพลิเคชันที่สามารถใช้งานได้โดยผู้ใช้ที่ลงทะเบียน (Wordpress) เท่านั้น

ตอนนี้ฉันกำลังโหลดwp-blog-header.phpเพื่อตรวจสอบว่าผู้ใช้ลงชื่อเข้าใช้ทุกอย่างทำงานได้ดี แต่เนื่องจากทุกคำขอ (รวมถึง AJAX) ฉันต้องโหลดคอร์ Wordpress ด้วยเช่นกันมันทำให้แอปพลิเคชันของฉันช้าลง (มากกว่า 70% จากทั้งหมด) เวลาโหลด)

มีวิธีง่าย ๆ ในการใช้ผู้ใช้ Wordpress แต่ไม่โหลดแกนหลักของ Wordpress ทั้งหมดหรือไม่

อัปเดต: ฉันจำเป็นต้องรู้ว่าผู้ใช้คนใดที่เข้าสู่ระบบและความปลอดภัยเป็นสิ่งสำคัญ

ขอขอบคุณ!

คำตอบ:


9

ถ้าฉันต้องทำสิ่งนี้ฉันจะใช้คุกกี้ของตัวเองในการกำหนดชื่อล็อกอินและโหลด WordPress เพื่อตรวจสอบเมื่อจำเป็นเท่านั้น

สามารถใช้คุกกี้ wordpress_logged_in_ {some-hash} เพื่อกำหนดผู้ใช้และ WordPress ใช้เพื่อกำหนดเดียวกัน คุณไม่สามารถนำไปใช้ใหม่ได้อย่างง่ายดาย แต่คุณสามารถใช้งานได้โดยไม่ต้องโหลด WordPress ในหลาย ๆ คำขอ

ตัวอย่างเช่นนี่คือแฮชคุกกี้ของฉัน (สร้างขึ้นโดยสมบูรณ์ข้อมูล แต่มีเหตุผล):

key: wordpress_logged_in_1234567890abcdef1234567890abcdef
value: admin|1234567890|abcdef1234567890abcdef1234567890

วิธีที่ WordPress รู้ว่าคุกกี้นั้นถูกต้องนั้นไม่เกี่ยวข้องทั้งหมดที่คุณต้องรู้คือว่าถูกต้องแค่ครั้งเดียวจากนั้นคุณลงชื่อด้วยลับ

ดังนั้นครั้งแรกที่ผู้ใช้ยังไม่ได้รับการพิสูจน์ คุณโหลด wp-load.php และ WP ตรวจสอบคุกกี้และบันทึกผู้ใช้ในตอนนี้คุณทำสิ่งที่คุณทำเพื่อพิสูจน์ตัวเองว่าผู้ใช้เข้าสู่ระบบแล้วคุณตั้งค่าคุกกี้ของคุณเอง คีย์สามารถเป็นอะไรก็ได้ที่คุณกำหนดเองค่าที่คุณทำลงในข้อความสรุปด้วยคีย์ลับโดยใช้ฟังก์ชัน 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 ของพวกเขาคุณจะรู้ว่าพวกเขาได้รับการตรวจสอบกับ WP ผ่านรหัสของคุณมาก่อนและคุณจะได้รับชื่อผู้ใช้จากค่านั้น เห็นได้ชัดว่าเป็นส่วนหนึ่งของคุกกี้) จากนั้นคุณไม่ต้องโหลด WP

คีย์ลับ BTW ควรจะยาวและสุ่ม ไม่ใช่รหัสผ่านสั้น ๆ ไม่ใช่คำในพจนานุกรม เพียงแค่พูดพล่อยๆไร้สาระขนาดใหญ่ เสียงเส้นและอีกมากมายเลย คีย์ตัวอย่าง: 'GHY5hFNqq4Ntdu=3:SUp8#/+_W!- @@^@xslN*L|N+Vn;(1xo8jNyp,au$v9Ki5*'


4

เพราะฉันยังใช้ฟังก์ชั่น Wordpress อยู่ข้างๆการจัดการผู้ใช้ฉันจึงตัดสินใจที่จะโหลด WP core ต่อ แต่ฉันสร้างไฟล์ที่กำหนดเองที่โหลดเฉพาะสิ่งที่ฉันต้องการและไม่โหลดปลั๊กอิน เวลาในการโหลดใหม่เป็นที่น่าพอใจ (ลดลงจาก 1.5s เมื่อโหลด WP เต็มเป็น 0.3s)

ฉันสร้างไฟล์ชื่อ 'wp-load-minim.php' แล้วฉันเรียกไฟล์นี้แทน 'wp-blog-header.php'

นี่คือ woking สำหรับ 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
นี่เป็นความคิดที่ดี ข้อเสนอแนะหนึ่งข้อ: คุณสามารถโหลดปลั๊กอินและตั้งค่าคิวรีได้ (ขึ้นอยู่กับกรณีการใช้งานของคุณ)
chrisguitarguy

3

สำหรับ Wordpress 4.9: ฉันไม่สามารถแสดงความคิดเห็น (ผู้ใช้ใหม่) soultion ขั้นสุดท้าย (การติดตั้ง WP เดียว) ที่ฉันใช้สำหรับการสร้างis_user_logged_in()และการcurrent_user_can()ทำงานมีดังต่อไปนี้ require('wp-load.php') อันดับแรก เราจะข้าม wp () ใน load-blog-header.php)และรับABSPATHค่าคงที่แล้วรวมทุกสิ่งที่จำเป็นทั้งหมดด้วยตนเองอย่างแน่นอน

การใช้define('SHORTINIT', true)+ require('wp-load.php')+ ด้วยตนเองรวมถึง:

Pageload: 1.05 sek - ไฟล์ที่รวมอยู่: 43 ไฟล์

เปรียบเทียบ: ใช้เท่านั้น require('wp-load.php') :

ไฟล์: 1.35ไฟล์ - รวมไฟล์: 419 ไฟล์

ความแตกต่างของเวลา (0.3 sek) อาจแตกต่างจากการติดตั้งและเอ็นจิ้น PHP แต่ในขณะที่ตรวจสอบคำขอจำนวนมากในหนึ่ง pageload - สิ่งที่เพิ่มขึ้น!

จำไว้ว่าให้ใช้การโทรแบบสัมพัทธ์กับ WP ที่ติดตั้งไว้ จากปลั๊กอินที่กำหนดเอง Wordpress dir ภายในหนึ่งระดับย่อยการติดตั้งปกติเส้นทางควรเป็นดังนี้:

$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 sek ข้ามSHORTINITความยุ่งเหยิงคงที่และด้วยตนเอง


+1 เพื่อใช้การโทรครั้งแรกในฐานะญาติสิ่งต่าง ๆ อาจยุ่งเหยิงถ้ายืมแกน wp จาก URL ที่แน่นอน
Jonas Lundman

2

Wordpress นั้นเปิดหรือปิดเท่านั้น บางครั้ง แต่นั่นเป็นเพียงโอกาสและไม่ใช่โดยการออกแบบคุณสามารถแก้ไขได้ แต่ในกรณีของคุณฉันไม่แน่ใจจริงๆถ้าเป็นไปได้

แทนที่จะwp-blog-header.phpพยายามโหลดเฉพาะฟังก์ชั่น WP ให้ใส่wp-load.phpแทน บางทีนั่นอาจช่วย


wp-blog-header.phpพื้นโหลดwp-load.phpดังนั้นจึงไม่มี diffrence ...

2
@Victor: มีความแตกต่าง มันทำให้ไฟลุกลามwp();ซึ่งมีราคาแพงมาก
hakre

ตกลงตอนนี้ฉันพยายามคิดว่า wp () ทำอะไร

ฉันได้ทำการทดสอบwp-load.phpแทนwp-blog-header.phpทุกอย่างดูเหมือนว่าจะทำงานได้ดี แต่เวลาในการโหลดเหมือนกัน

@Victor: คุณกำลังใช้นาฬิกาอยู่ในขณะที่กด F5 หรือคุณวัดเป็นอย่างไร :) อย่างไรก็ตามอย่าใช้ WordPress ถ้าคุณต้องการเฟรมเวิร์ก คุณสามารถลองโหลดฟังก์ชั่นที่คุณต้องการแทนเท่านั้น แต่คุณต้องมองหาพวกเขาทีละนิด เพียงแค่รวมไฟล์ที่คุณต้องการเช่นฟังก์ชั่นผู้ใช้และการเข้าถึงฐานข้อมูล
hakre

1

คุณสามารถลองเข้าถึงตารางโดยตรง หากคุณรู้ว่าเกลือของไฟล์รหัสผ่านคุณสามารถให้พวกเขาเข้าสู่ระบบผ่านทางระบบของคุณเองให้ใส่รหัสผ่านด้วยตัวคุณเอง (ดูว่า WordPress ทำอย่างไร) และติดตามพวกเขาด้วยตัวคุณเอง หากคุณต้องการความสามารถในการข้ามระหว่างระบบของคุณและ wordpress โดยไม่ต้องมีการรับรองความถูกต้องอีกครั้งคุณสามารถสร้างปลั๊กอินเพื่อ wordpress ที่ส่งผ่านเซสชันผู้ใช้ปัจจุบันไปยังระบบของคุณ


0

เร็วที่สุดที่คุณจะได้รับด้วย WP คือการทำ wrapper แบบกำหนดเองที่จะกำหนดSHORTINITและโหลดคอร์ สิ่งนี้จะทำให้หยุดการโหลดคอร์ทันทีหลังจากเชื่อมต่อฐานข้อมูลและก่อนประมวลผล API และส่วนขยาย (ธีมและปลั๊กอิน) ส่วนใหญ่

คุณสามารถลองใช้ฐานข้อมูลเพียงอย่างเดียวหรือเลือกโหลดบางส่วนของแกนที่คุณต้องการ

นี่เป็นวิธีที่ยุ่งเหยิง แต่ใกล้เคียงกับโหลดคอร์ที่เบากว่าเมื่อเข้าสู่ WP


SHORTINIT เป็นวิธีการที่ดี แต่นั่นหมายความว่าฟังก์ชั่นทั้งหมดสำหรับการตรวจสอบผู้ใช้และแฮชและสิ่งนั้นจะไม่ได้รับการโหลด คุณสามารถนำสิ่งนั้นกลับมาใช้ใหม่ได้ แต่ก็ยุ่งอย่างที่คุณพูด
อ็อตโต

@Otto อาจไม่ได้นำไปใช้ใหม่ แต่ควรโหลดส่วนเหล่านั้นของคอร์ด้วยมือ และหากมีการแก้ไขใด ๆ กับผู้ใช้งานจะถูกดำเนินการโดยปลั๊กอินโหลดเหล่านั้นด้วยมือเช่นกัน ใช่นี่เป็นวิธีการที่ค่อนข้างเกี่ยวข้อง แต่ทางเลือกถัดไปสำหรับประสิทธิภาพที่ดีขึ้นคือการทิ้ง WP ทั้งหมดและทำงานกับฐานข้อมูลโดยตรงซึ่งยิ่งยุ่ง
Rarst


-1

หากคุณต้องการให้ผู้ใช้ Wordpress ทุกคนใช้เว็บแอพคุณสามารถใช้ระบบการจัดการผู้ใช้ Wordpress และตรวจสอบว่าผู้ใช้ลงชื่อเข้าใช้หรือไม่

ในการตรวจสอบสิ่งนี้คุณจะต้องตรวจสอบว่ามีชื่อคุกกี้wordpress_logged_in_{some-hash}อยู่หรือไม่ หากไม่มีให้เปลี่ยนเส้นทางผู้ใช้ไปยังหน้าเข้าสู่ระบบ Wordpress {some-hash}ส่วนหนึ่งของชื่อคุกกี้เป็นเพียงชุดของตัวอักษรและตัวเลข


1
ฉันจำเป็นต้องรู้ว่าผู้ใช้คนใดเข้าสู่ระบบและความปลอดภัยเป็นสิ่งสำคัญ

นี่คือฝันร้ายด้านความปลอดภัย ทุกคนสามารถส่งคำขอด้วยคุกกี้ที่มีโครงสร้างเช่นนี้ เนื่องจากคุณไม่ได้ตรวจสอบแฮช แต่เพียงตรวจสอบว่ามีสิ่งใดที่เท่ากับรูปแบบการเข้าสู่ระบบที่คุณสามารถป้อนอะไรก็ได้สำหรับผู้ใช้และรหัสผ่านตราบใดที่เขตข้อมูลไม่ว่างเปล่า
Kraftner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.