Wordpress kullanıcılarını kullanmanın bir yolu var mı, ancak tüm Wordpress çekirdeğini yüklemeden mi?


11

Bir Wordpress sitem ve yalnızca kayıtlı (Wordpress) kullanıcılar tarafından kullanılabilecek bir web uygulamam var.

Şimdi wp-blog-header.phpkullanıcının oturum açıp açmadığını kontrol etmek için yüklüyorum . Her şey iyi çalışıyor, ancak her istekte (AJAX dahil) Wordpress çekirdeğini de yüklemem gerektiğinden, uygulamamı görünür bir şekilde yavaşlatıyor (toplamdan% 70'ten fazla) yüklenme zamanı).

Wordpress kullanıcılarını kullanmanın basit bir yolu var mı, ancak tüm Wordpress çekirdeğini yüklemeden var mı?

Güncelleme: Hangi kullanıcının giriş yaptığını bilmem gerekiyor ve güvenlik de önemli.

Teşekkür ederim!

Yanıtlar:


9

Bunu yapmak zorunda kalsaydım, giriş bilgisini belirlemek için kendi çerezimi kullanırım ve sadece gerektiğinde kontrol etmek için WordPress'i yüklerdim.

Wordpress_oked_in_ {some-hash} çerezi kullanıcıyı belirlemek için kullanılabilir ve WordPress bunu belirlemek için kullanır. Bunu kolayca yeniden uygulayamazsınız, ancak WordPress'i birden fazla istek üzerine yüklemeden kullanabilirsiniz.

Örneğin, işte benim çerez karma (tamamen oluşturulmuş, ancak gerçekçi):

key: wordpress_logged_in_1234567890abcdef1234567890abcdef
value: admin|1234567890|abcdef1234567890abcdef1234567890

WordPress'in bu çerezin nasıl geçerli olduğunu bilme şekli önemsizdir, bilmeniz gereken tek şey bir kez geçerli olup olmadığıdır, sonra bir sır ile imzalarsınız.

Yani, ilk kez, kullanıcı henüz kanıtlanmamıştır. Wp-load.php dosyasını yüklersiniz ve WP, çerezi doğrular ve kullanıcının oturum açmasını sağlar. Artık kullanıcının oturum açtığını kanıtlamak için ne yaparsanız yapın, sonra kendi çerezinizi ayarlarsınız. Anahtar size özel bir şey olabilir, hash_hmac işlevini kullanarak gizli bir anahtarla mesaj özeti yaptığınız değer olabilir.

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

Setcookie () kullanarak onlara geri gönderdiğiniz anlamsızca geri döneceksiniz. Gelecekteki isteklerde, bu çerezi size geri göndereceklerdir. Önce bunu kontrol edebilir ve aynı karma işlevini ve gizli anahtarı kullanarak doğrulayabilirsiniz.

Gizli anahtarı yalnızca siz bilirsiniz çünkü hash'ı yalnızca siz oluşturabilirsiniz. Dolayısıyla, WP çerezleri için gönderdikleriyle de eşleşen geçerli bir karma gönderirlerse, kodunuzdan önce WP ile doğrulandıklarını bilirsiniz ve kullanıcı adını doğrudan bu değerden alabilirsiniz ( çerezin bir parçası). O zaman WP yüklemeniz gerekmez.

Gizli anahtar BTW uzun ve rastgele olmalıdır . Kısa bir şifre değil. Sözlük kelimesi değil. Sadece büyük saçmalık anlamsızca. Hat gürültüsü ve daha fazlası. Örnek anahtar: 'GHY5hFNqq4Ntdu=3:SUp8#/+_W!- @@^@xslN*L|N+Vn;(1xo8jNyp,au$v9Ki5*'


4

Ayrıca kullanıcı yönetimi yanında bazı Wordpress işlevlerini kullandığım için WP çekirdeğini yüklemeye devam etmeye karar verdim, ancak eklentileri yüklemeden sadece ihtiyacım olanı yükleyen özel bir dosya yaptım. Yeni yükleme süresi tatmin edici (tam WP yükünde 1,5 saniyeden 0,3 saniyeye düşürüldü)

'Wp-load-minimum.php' adlı bir dosya yaptım ve bu dosyayı 'wp-blog-header.php' yerine çağırıyorum

Bu WP 3.3 için uyandırıyor. Dosyanın içeriği: Yararlı bulursanız:

<?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
Bu iyi bir fikir. Bir öneri: Muhtemelen eklenti yüklemesi ve sorgu kurulumunu (kullanım durumunuza bağlı olarak elbette) alabilirsiniz.
chrisguitarguy

3

Wordpress 4.9 için: Yorum yapamadığım gibi (yeni kullanıcı). Yapmak is_user_logged_in()ve current_user_can()çalışmak için kullandığım son ruh (tek WP kurulumu) aşağıdaki gibidir. Biz require('wp-load.php') ilk (yük-blog-header.php içinde wp () atlamak için) , ve almak ABSPATHelle içerir ardından sabiti tam bütün şeyler gerekli.

define('SHORTINIT', true)+ require('wp-load.php')+ Tuşlarını manuel olarak kullanma şunları içerir:

Pageload: 1.05 sek - dahil edilen dosyalar: 43 dosya

Karşılaştırma: SADECE Kullanma require('wp-load.php'):

Pageload: 1.35 sek - dahil dosyalar: 419 dosya

Zaman farkı (0,3 sek) kurulumlardan ve PHP motorlarından farklı olabilir, ancak bir sayfa yükünde birçok isteği doğrularken, işler eklenir!

WP kurulu dir göreli çağrı kullanmayı unutmayın. Wordpress özel eklenti dizininden, bir alt dizin düzeyinde, normal yükleme içinde bir yol şöyle olmalıdır:

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

Sonra:

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

Bundan sonra kullanıcı doğrulamasına erişilebilir. Diğer görevler için, bir veya iki istek üzerine başlayarak, diğer gerekli dosyaları izlemek 0,3 sek değerinde olmayabilir. SHORTINITSabit ve manuel dağınıklığı atlayın .


İlk çağrıyı göreli olarak kullanmak için +1, mutlak URL'lerden wp çekirdeği ödünç verirse işler gerçekten dağınık olabilir.
Jonas Lundman

2

Wordpress'in kendisi sadece açık veya kapalı. Bazen, ancak bu sadece tesadüfen ve tasarımla değil, bunun etrafında çalışabilirsiniz. Ama sizin durumunuzda, bunun mümkün olup olmadığından emin değilim.

Bunun yerine wp-blog-header.phpyalnızca WP işlevlerini yüklemeyi deneyebilirsiniz, wp-load.phpbunun yerine ekleyin . Belki bu yardımcı olur.


wp-blog-header.phptemelde yükler wp-load.phpböylece hiçbir fark yoktur ...

2
@Victor: Bir fark var. Yangın wp();oldukça pahalı olan yedek parça .
hakre

Tamam, şimdi wp () 'nin tam olarak ne yaptığını anlamaya çalışıyorum.

Bunun wp-load.phpyerine bazı testler yaptım wp-blog-header.php, her şey iyi çalışıyor gibi görünüyor, ancak yükleme süresi aynı.

@Victor: Saatinizi F5 tuşuna basarken mi kullanıyorsunuz yoksa gerçekte nasıl ölçüyorsunuz? :) Her neyse, gerçekten bir çerçeveye ihtiyacınız varsa WordPress kullanmayın. Bunun yerine yalnızca gerçekten ihtiyaç duyduğunuz işlevleri yüklemeyi deneyebilirsiniz. Ama onları yavaş yavaş aramalısın. Kullanıcı işlevleri ve veritabanı erişimi gibi gerçekten ihtiyacınız olan dosyaları ekleyin.
hakre

1

Tabloya doğrudan erişmeyi deneyebilirsiniz. Şifre dosyalarının tuzunu kendi sisteminizle giriş yapabileceğinizi biliyorsanız, şifreyi kendiniz tuzlayın (wordpress'in nasıl yaptığına bakın) ve bunları kendiniz takip edin. Yeniden kimlik doğrulaması yapmadan kendi sisteminiz ve wordpress arasında geçiş yapabilmek istiyorsanız, geçerli kullanıcı oturumunu sisteminize geçiren wordpress için bir eklenti yapabilirsiniz.


0

WP ile elde edebileceğiniz en hızlı şey, SHORTINITçekirdeği tanımlayıp yükleyecek özel sarıcı yapmaktır. Bu, veritabanı bağlandıktan hemen sonra ve çoğu API ve uzantı (tema ve eklenti) işlenmeden önce çekirdek yükü durduracaktır.

Oradan sadece veritabanı ile almak ya da ihtiyacınız çekirdek parçaları seçici olarak yüklemek için deneyebilirsiniz.

Bu oldukça dağınık bir yaklaşım, ancak işler WP'de olduğu kadar daha hafif çekirdek yüküne yakın.


SHORTINIT iyi bir yaklaşımdır, ancak bu, kullanıcıları ve karmaları kontrol etmek için tüm işlevlerin yüklenmeyeceği anlamına gelir. Söylediğin gibi bunu yeniden yapabilirsin ama dağınık.
Otto

@Otto Muhtemelen yeniden uygulama yapmaz, bunun yerine çekirdeğin bu kısımlarını elle yükleyin. Ve kullanıcılar üzerinde herhangi bir değişiklik varsa eklentiler tarafından yapılıyorsa bunları elle de yükleyin. Evet, bu oldukça ilgili bir yaklaşım. Ancak daha iyi performans için bir sonraki alternatif, WP'yi tamamen terk etmek ve doğrudan veritabanı ile çalışmak, daha da dağınık.
Rarst


-1

Tüm Wordpress kullanıcılarının web uygulamasını kullanmasına izin vermek istiyorsanız, Wordpress kullanıcı yönetim sistemini kullanabilir ve kullanıcının oturum açmış olup olmadığını kontrol edebilirsiniz.

Bunu kontrol etmek için, adlandırılan çerezin wordpress_logged_in_{some-hash}mevcut olup olmadığını kontrol etmeniz gerekir . Değilse, kullanıcıyı Wordpress giriş sayfasına yönlendirin. {some-hash}Çerez adının bir parçası harf ve rakamlardan sadece dizisidir.


1
Hangi kullanıcının giriş yaptığını bilmem gerekiyor ve güvenlik de önemli.

Bu bir güvenlik kabusu. Herkes böyle yapılandırılmış bir çerezle istek gönderebilir. Hash'i kontrol etmediğinizden, ancak alanların boş olmadığı sürece kullanıcı ve şifre için herhangi bir şey girebileceğiniz bir giriş formuna denk gelen bir şey olup olmadığını kontrol ettiğinizden.
kraftner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.