전체 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 코어를 계속로드하기로 결정했지만 플러그인을로드하지 않고 필요한 것만로드하는 사용자 지정 파일을 만들었습니다. 새로운 로딩 시간이 만족 스럽습니다 (완전 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
이것은 좋은 생각입니다. 한 가지 제안 : 아마도 플러그인 사용 및 쿼리 설정을 버릴 수 있습니다 (물론 유스 케이스에 따라 다름).
chrisguitarguy

3

Wordpress 4.9의 경우 : (새 사용자)는 말할 수 없습니다. 내가 만들기 위해 사용하는 최종 soultion (단일 WP 설치) is_user_logged_in()current_user_can()작업은 아래 다음과 같다. 우리는 require('wp-load.php') 첫번째 (로드 블로그 header.php에서 WP ()를 건너 뛸 수) , 얻을 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 엔진과 다를 수 있지만 한 페이지로드에서 많은 요청의 유효성을 검사하는 동안 추가됩니다!

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 sek의 가치가 없을 수 있습니다. SHORTINIT상수 및 수동 혼란을 건너 뜁니다 .


첫 번째 호출을 상대로 사용하려면 +1, 절대 URL에서 wp core를 빌려주는 경우 상황이 정말 어려울 수 있습니다.
Jonas Lundman

2

워드 프레스 자체 만 켜져 있거나 꺼져 있습니다. 때로는 의도적 인 것이 아니라 의도적으로 설계된 것일 수도 있습니다. 그러나 귀하의 경우, 가능한지 확실하지 않습니다.

대신 wp-blog-header.phpWP 함수 만로드 할 수 있습니다 wp-load.php. 대신 포함하십시오 . 아마 도움이 될 것입니다.


wp-blog-header.php기본적으로로드 wp-load.php되므로 차이가 없습니다 ...

2
@ 빅터 : 차이가 있습니다. 그것은 wp();실제로 꽤 비싸다는 발사를 아끼지 않습니다 .
hakre

좋아, 이제 정확히 wp ()가 무엇을하는지 알아 내려고 노력 중이다.

wp-load.php대신에 약간의 테스트 wp-blog-header.php를 수행했지만 모든 것이 잘 작동하는 것처럼 보이지만 로딩 시간은 동일합니다.

@Victor : F5를 누른 상태에서 시계를 사용하고 있습니까? :) 어쨌든 실제로 프레임 워크가 필요한 경우 WordPress를 사용하지 마십시오. 실제로 필요한 기능 만 대신로드 할 수 있습니다. 그러나 조금씩 찾아야합니다. 사용자 기능 및 데이터베이스 액세스와 같이 실제로 필요한 파일 만 포함하십시오.
hakre

1

테이블에 직접 액세스하려고 할 수 있습니다. 암호 파일의 소금을 알고 있다면 자신의 시스템을 통해 로그인하도록 할 수 있습니다. 재 인증없이 자신의 시스템과 워드 프레스 간을 이동하려는 경우 현재 사용자 세션을 시스템으로 전달하는 워드 프레스 플러그인을 만들 수 있습니다.


0

WP로 얻을 수있는 가장 빠른 방법은 SHORTINIT코어를 정의한 다음로드 하는 사용자 정의 래퍼를 만드는 것 입니다. 그러면 데이터베이스가 연결되고 대부분의 API 및 확장 (테마 및 플러그인)이 처리되기 직전에 코어로드가 중지됩니다.

거기에서 데이터베이스만으로 가져 오거나 필요한 핵심 부분을 선택적으로로드 할 수 있습니다.

이것은 매우 지저분한 접근 방법이지만 WP에서 얻을 수있는 것처럼 코어로드가 가벼워집니다.


SHORTINIT은 좋은 접근 방법이지만 사용자와 해시 등을 확인하는 모든 기능이로드되지 않음을 의미합니다. 당신이 말한 것처럼 재 구현 할 수는 있지만 지저분합니다.
Otto

@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.