क्या वर्डप्रेस उपयोगकर्ताओं का उपयोग करने का एक तरीका है लेकिन पूरे वर्डप्रेस कोर को लोड किए बिना?


11

मेरे पास एक वर्डप्रेस साइट और एक वेब एप्लिकेशन है जो केवल पंजीकृत (वर्डप्रेस) उपयोगकर्ताओं द्वारा उपयोग किया जा सकता है।

अब मैं wp-blog-header.phpयह जांचने के लिए लोड कर रहा हूं कि क्या उपयोगकर्ता लॉग इन है। सब कुछ ठीक चल रहा है, लेकिन हर अनुरोध पर (AJAX सहित) मुझे वर्डप्रेस कोर भी लोड करना होगा, यह मेरे आवेदन को धीमा कर देता है (कुल से 70% से अधिक) लोडिंग के समय)।

क्या वर्डप्रेस उपयोगकर्ताओं का उपयोग करने का कोई सरल तरीका है लेकिन पूरे वर्डप्रेस कोर को लोड किए बिना?

अपडेट: मुझे यह जानना होगा कि कौन सा उपयोगकर्ता लॉग इन है और सुरक्षा भी महत्वपूर्ण है।

धन्यवाद!

जवाबों:


9

अगर मुझे ऐसा करना पड़ा, तो मैं लॉगिन निर्धारित करने के लिए अपनी खुद की कुकी का उपयोग करूंगा और आवश्यक होने पर जांच के लिए केवल वर्डप्रेस लोड करूंगा।

Wordpress_logged_in_ {some-hash} कुकी का उपयोग उपयोगकर्ता को निर्धारित करने के लिए किया जा सकता है, और वर्डप्रेस इसे निर्धारित करने के लिए उपयोग करता है। आप इसे आसानी से लागू नहीं कर सकते, लेकिन आप इसे कई अनुरोधों पर वर्डप्रेस लोड किए बिना उपयोग कर सकते हैं।

उदाहरण के लिए, यहाँ मेरा कुकी हैश (पूरी तरह से डेटा बनाया गया है, लेकिन यथार्थवादी):

key: wordpress_logged_in_1234567890abcdef1234567890abcdef
value: admin|1234567890|abcdef1234567890abcdef1234567890

जिस तरह से वर्डप्रेस जानता है कि कुकी कैसे मान्य है अप्रासंगिक है, आपको बस यह जानना होगा कि क्या यह एक बार मान्य है, तो आप इसे एक रहस्य के साथ हस्ताक्षर करते हैं।

इसलिए, पहली बार, उपयोगकर्ता अभी तक साबित नहीं हुआ है। आप wp-load.php को लोड करते हैं और WP कुकी को सत्यापित करता है और उपयोगकर्ता को लॉग इन करता है। अब आप जो कुछ भी करते हैं वह यह साबित करने के लिए होता है कि उपयोगकर्ता लॉग इन कर चुका है, फिर आप अपना कुकी सेट करें। कुंजी आपके लिए कुछ भी कस्टम हो सकती है, जिस मूल्य को आप हैश_हमैक फ़ंक्शन का उपयोग करते हुए एक गुप्त कुंजी के साथ संदेश में पचाते हैं।

$key = ... // the key from the WP cookie
$value = ... // the value from the WP cookie
$hash = hash_hmac ( 'md5' , $key.$value , 'some secret key' );

आपको वापस अस्पष्ट मिलेगा, जिसे आप सेटकुकी () का उपयोग करके उन्हें वापस भेजते हैं। भविष्य के अनुरोध पर, वे इस कुकी को आपके पास वापस भेज देंगे। आप पहले जांच सकते हैं और उसी हैश फ़ंक्शन और गुप्त कुंजी का उपयोग करके इसे सत्यापित कर सकते हैं।

केवल आप हैश उत्पन्न कर सकते हैं क्योंकि केवल आप गुप्त कुंजी को जानते हैं। इसलिए यदि वे एक वैध हैश को वापस भेजते हैं, जो उनके WP कुकी के लिए भेजे गए मेल से भी मेल खाता है, तो आप जानते हैं कि वे आपके कोड से पहले, WP के साथ मान्य हो चुके हैं, और आप उस मान से उपयोगकर्ता नाम प्राप्त कर सकते हैं (यह पहला है कुकी का हिस्सा, जाहिर है)। तब आपको WP लोड नहीं करना पड़ेगा।

गुप्त कुंजी, BTW, लंबी और यादृच्छिक होनी चाहिए । छोटा पासवर्ड नहीं। शब्दकोश शब्द नहीं। बस बड़ी बकवास है। लाइन शोर, और यह बहुत सारे। उदाहरण कुंजी: 'GHY5hFNqq4Ntdu=3:SUp8#/+_W!- @@^@xslN*L|N+Vn;(1xo8jNyp,au$v9Ki5*'


4

चूँकि मैं उपयोगकर्ताओं के प्रबंधन के बगल में WP कोर लोड करने के लिए जारी रखने का फैसला करने वाले कुछ Wordpress फ़ंक्शंस का उपयोग कर रहा हूं, लेकिन मैंने एक कस्टम फ़ाइल बनाई है जो केवल वही लोड करती है जो मुझे चाहिए और प्लगइन्स लोड किए बिना। नया लोडिंग समय संतोषजनक है (यह पूर्ण WP लोड पर 1.5s से घटकर 0.3s हो गया)

मैंने 'wp-load-minimal.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
यह एक अच्छा विचार है। एक सुझाव: आप शायद प्लगइन लोडिंग और क्वेरी सेट कर सकते हैं (आपके उपयोग के मामले के आधार पर, बिल्कुल)।
क्रिसगुइटगर्गी

3

वर्डप्रेस 4.9 के लिए: जैसा कि मैं टिप्पणी नहीं कर सकता (नया उपयोगकर्ता)। अंतिम स्पिरिटेशन (एकल WP इंस्टॉल) मैं बनाने is_user_logged_in()और current_user_can()काम करने के लिए उपयोग करता हूं , नीचे दिए गए अनुसार है। हम require('wp-load.php') पहले (लोड-ब्लॉग-हेडर.फैप में wp) को छोड़ते हैं , और ABSPATHतब स्थिर हो जाते हैं, जिसमें मैन्युअल रूप से आवश्यक सभी सामान शामिल होते हैं

मैन्युअल रूप से define('SHORTINIT', true)+ का उपयोग करना require('wp-load.php')शामिल है:

पगेलोड: 1.05 sek - शामिल फाइलें: 43 फाइलें

तुलना: केवल का उपयोग कर require('wp-load.php'):

पगेलोड: 1.35 sek - शामिल फाइलें: 419 फाइलें

समय अंतर (0.3 sek) इंस्टाल और PHP इंजन से भिन्न हो सकता है, लेकिन एक पगेलॉड -थिंग्स पर कई अनुरोधों को मान्य करने पर यह जुड़ जाता है!

WP स्थापित dir के सापेक्ष कॉल का उपयोग करना याद रखें। एक 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' );

इसके बाद, उपयोगकर्ता सत्यापन सुलभ है। अन्य कार्य के लिए, एक या दो अनुरोधों पर r unning , अन्य आवश्यक फ़ाइलों को ट्रैक करना 0.3 sek के लायक नहीं हो सकता है। SHORTINITस्थिर और मैन्युअल अव्यवस्था छोड़ें ।


रिश्तेदार के रूप में पहली कॉल का उपयोग करने के लिए +1, पूर्ण यूआरएल से wp कोर उधार देने पर चीजें वास्तव में गड़बड़ हो सकती हैं।
जोनास लुंडमैन

2

Wordpress ही चालू या बंद है। कभी-कभी, लेकिन यह केवल संयोग से होता है और डिजाइन द्वारा नहीं, आप इसके आसपास काम कर सकते हैं। लेकिन आपके मामले में, मुझे यकीन नहीं है कि यह संभव है।

इसके बजाय wp-blog-header.phpआप केवल WP फ़ंक्शन लोड करने का प्रयास कर सकते हैं, wp-load.phpइसके बजाय शामिल करें । शायद यही मदद करता है।


wp-blog-header.phpमूल रूप से लोड होता है, wp-load.phpइसलिए इसमें कोई अंतर नहीं होता ...

2
@ विक्टर: एक अंतर है। यह wp();वास्तव में बहुत महंगा है , जिसमें से आग को बख्शता है।
हकरे

ठीक है, अब मैं यह पता लगाने की कोशिश कर रहा हूं कि वास्तव में wp () क्या करता है।

मैं के wp-load.phpबजाय के साथ कुछ परीक्षण किया है wp-blog-header.php, सब कुछ ठीक काम करने लगता है, लेकिन लोडिंग समय समान है।

@ विक्टर: क्या आप F5 दबाते समय अपनी घड़ी का उपयोग कर रहे हैं या आप वास्तव में कैसे मापते हैं? :) वैसे भी, वर्डप्रेस का उपयोग न करें यदि आपको वास्तव में एक रूपरेखा की आवश्यकता है। आप केवल उन कार्यों को लोड करने का प्रयास कर सकते हैं जिनकी आपको वास्तव में आवश्यकता है। लेकिन आपको उन्हें थोड़ा-थोड़ा करके देखने की जरूरत है। केवल उन फ़ाइलों को शामिल करें जिनकी आपको वास्तव में ज़रूरत है, जैसे उपयोगकर्ता कार्यों और डेटाबेस एक्सेस के लिए।
हकर्रे

1

आप सीधे तालिका तक पहुँचने का प्रयास कर सकते हैं। यदि आप पासवर्ड फ़ाइलों के नमक को जानते हैं, तो आप उन्हें अपने सिस्टम के माध्यम से लॉग इन कर सकते हैं, पासवर्ड को स्वयं नमक करें (देखें कि वर्डप्रेस यह कैसे करता है) और स्वयं उन पर नज़र रखें। यदि आप पुन: प्रमाणीकरण के बिना अपने स्वयं के सिस्टम और वर्डप्रेस के बीच पार करने की क्षमता चाहते हैं, तो आप वर्डप्रेस के लिए एक प्लगइन बना सकते हैं जो आपके सिस्टम में वर्तमान उपयोगकर्ता सत्र को पास करता है।


0

WP के साथ आप प्राप्त कर सकते हैं सबसे तेज कस्टम आवरण बना रहा है जो परिभाषित करेगा SHORTINITऔर फिर कोर को लोड करेगा । यह डेटाबेस से जुड़े होने के बाद और एपीआई और एक्सटेंशन (थीम और प्लगइन्स) संसाधित होने से पहले कोर लोड को रोक देगा।

वहाँ से आप अकेले डेटाबेस या चुनिंदा रूप से अपनी ज़रूरत के हिस्सों को लोड करने की कोशिश कर सकते हैं।

यह काफी गन्दा दृष्टिकोण है, लेकिन यह हल्का कोर लोड के रूप में है जैसा कि WP में चीजें मिलती हैं।


SHORTINIT एक अच्छा दृष्टिकोण है, लेकिन इसका मतलब है कि उपयोगकर्ताओं और हैश की जाँच करने के लिए सभी कार्य और इस तरह लोड नहीं होंगे। जैसा कि आपने कहा, आप इसे फिर से लागू कर सकते हैं, लेकिन गड़बड़ कर सकते हैं।
ओटो

@ ऑटो संभवतः पुन: लागू नहीं होगा, बल्कि कोर के उन हिस्सों को हाथ से लोड करेगा। और अगर उपयोगकर्ताओं के लिए कोई संशोधन हो रहा है, तो प्लगइन्स लोड किए जा रहे हैं। हाँ, यह काफी शामिल दृष्टिकोण है। लेकिन बेहतर प्रदर्शन के लिए अगला विकल्प WP को पूरी तरह से खोदना और सीधे डेटाबेस के साथ काम करना है, जो और भी अधिक गड़बड़ है।
रारस्ट


-1

यदि आप सभी Wordpress उपयोगकर्ताओं को वेब ऐप का उपयोग करने की अनुमति देना चाहते हैं, तो आप Wordpress उपयोगकर्ता प्रबंधन प्रणाली का उपयोग कर सकते हैं और बस जाँच सकते हैं कि उपयोगकर्ता लॉग इन है या नहीं।

इसे जांचने के लिए आपको यह जांचना होगा कि नामित कुकी wordpress_logged_in_{some-hash}मौजूद है या नहीं। यदि नहीं, तो उपयोगकर्ता को Wordpress लॉगिन पृष्ठ पर पुनर्निर्देशित करें। {some-hash}कुकी नाम के हिस्से सिर्फ अक्षर और अंक की एक श्रृंखला है।


1
मुझे यह जानना होगा कि कौन सा उपयोगकर्ता लॉग इन है और सुरक्षा भी महत्वपूर्ण है।

यह सुरक्षा-बुरा सपना है। कोई भी कुकी के साथ एक अनुरोध भेज सकता है जो इस तरह संरचित है। जैसा कि आप हैश की जाँच नहीं कर रहे हैं, लेकिन जाँच रहे हैं कि क्या कुछ है, यह एक लॉगिन फ़ॉर्म के बराबर है जहाँ आप उपयोगकर्ता और पासवर्ड के लिए कुछ भी दर्ज कर सकते हैं जब तक कि फ़ील्ड खाली न हों।
क्राफ्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.