Gibt es eine Möglichkeit, die WordPress-Benutzer zu verwenden, ohne den gesamten WordPress-core zu laden?

Ich habe eine WordPress-Website und eine Webanwendung, die nur von den registrierten (WordPress) Benutzern verwendet werden kann.

Jetzt wp-blog-header.php ich wp-blog-header.php , um zu überprüfen, ob der Benutzer eingeloggt ist. Alles funktioniert gut, aber weil ich bei jeder Anfrage (inklusive AJAX) den WordPress-Core auch laden muss, verlangsamt das meine Anwendung sichtbar ( mehr als 70% der gesamten Ladezeit).

Gibt es eine einfache Möglichkeit, die WordPress-Benutzer zu verwenden, ohne den gesamten WordPress-core zu laden?

Update: Ich muss wissen, welcher Benutzer angemeldet ist und auch Sicherheit ist wichtig.

Vielen Dank!

Solutions Collecting From Web of "Gibt es eine Möglichkeit, die WordPress-Benutzer zu verwenden, ohne den gesamten WordPress-core zu laden?"

Wenn ich dies tun müsste, würde ich meinen eigenen Cookie verwenden, um den Login zu bestimmen, und WordPress nur laden, um es bei Bedarf zu überprüfen.

Der wordpress_logged_in_ {some-hash} -Cookie kann verwendet werden, um den Benutzer zu bestimmen, und WordPress verwendet es, um den Benutzer zu bestimmen. Sie können das nicht einfach neu implementieren, aber Sie können es verwenden, ohne WordPress für mehrere Anfragen zu laden.

Zum Beispiel ist hier mein Cookie-Hash (vollständig zusammengesetzte Daten, aber realistisch):

 key: wordpress_logged_in_1234567890abcdef1234567890abcdef value: admin|1234567890|abcdef1234567890abcdef1234567890 

Die Art und Weise, wie WordPress weiß, wie dieser Cookie gültig ist, ist irrelevant. Alles was Sie wissen müssen ist, ob es einmal gültig ist, dann signieren Sie es mit einem Geheimnis.

Also, das erste Mal, der Benutzer ist noch nicht bewiesen. Sie laden wp-load.php und WP validiert den Cookie und loggt den Benutzer ein. Sie tun nun alles, was Sie tun, um sich zu beweisen, dass der Benutzer eingeloggt ist, und dann setzen Sie Ihren eigenen Cookie. Der Schlüssel kann alles sein, was Ihnen bekannt ist, der Wert, den Sie mit der function hash_hmac in einen Nachrichtenauszug mit einem geheimen Schlüssel setzen.

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

Du bekommst Kauderwelsch zurück, den du mit setcookie () an sie zurücksendest. Bei zukünftigen Anfragen senden sie diesen Cookie an Sie zurück. Sie können dies zuerst überprüfen und es mit der gleichen Hash-function und dem gleichen geheimen Schlüssel validieren.

Nur Sie können den Hash generieren, weil nur Sie den geheimen Schlüssel kennen. Wenn sie also einen gültigen Hash zurücksenden, der auch dem entspricht, was sie für ihren WP-Cookie senden, dann wissen Sie, dass sie zuvor mit WP über Ihren Code validiert wurden, und Sie können den Benutzernamen direkt von diesem Wert abrufen (es ist der erste) Teil des cookiess, offensichtlich). Dann müssen Sie WP nicht laden.

Der geheime Schlüssel, BTW, sollte lang und zufällig sein . Kein kurzes Passwort. Kein Wörterbuchwort. Nur ein großes unsinniges Kauderwelsch. Leitungsgeräusche und viel davon. Beispielschlüssel: 'GHY5hFNqq4Ntdu=3:SUp8#/+_W!- @@^@xslN*L|N+Vn;(1xo8jNyp,au$v9Ki5*'

Da ich neben der Benutzerverwaltung auch einige WordPress-functionen verwende, entschied ich mich, den WP-Core weiterhin zu laden, aber ich habe eine benutzerdefinierte Datei erstellt, die nur das lädt, was ich brauche und ohne die Plugins zu laden. Die neue Ladezeit ist zufriedenstellend (sie sank von 1,5 s bei voller WP-Last auf 0,3 s)

Ich habe eine Datei namens ‘wp-load-minimum.php’ erstellt und ich rufe diese Datei anstelle von ‘wp-blog-header.php’

Dies ist für WP 3.3 wünschenswert. Hier ist der Inhalt der Datei, wenn Sie es nützlich finden:

 < ?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 (eg widgets), and many plugins instantiate * themselves on it for all sorts of reasons (eg 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' ); 

WordPress selbst ist nur an oder aus. Manchmal, aber das ist nur zufällig und nicht von Design, Sie können das umgehen. Aber in deinem Fall bin ich mir nicht sicher, ob das möglich ist.

Anstelle von wp-blog-header.php Sie versuchen, nur die WP-functionen zu wp-load.php stattdessen wp-load.php . Vielleicht hilft das.

Sie könnten versuchen, direkt auf die Tabelle zuzugreifen. Wenn Sie das Salz der Passwort-Dateien kennen, können Sie sie sich über Ihr eigenes System einloggen, das Passwort selbst salzen (schauen Sie, wie WordPress es tut) und selbst nachverfolgen. Wenn Sie die Möglichkeit haben möchten, ohne Neuauthentifizierung zwischen Ihrem eigenen System und WordPress zu wechseln, können Sie ein WordPress-Plugin erstellen, das die aktuelle Benutzersitzung an Ihr System weiterleitet.

Das schnellste, was Sie mit WP erreichen können, ist ein benutzerdefinierter Wrapper, der SHORTINIT definiert und dann den Core lädt. Dadurch wird die corelast gestoppt, direkt nachdem die database verbunden ist und bevor die meisten APIs und Erweiterungen (Design und Plugins) verarbeitet werden.

Von dort können Sie versuchen, durch die database allein zu kommen oder Teile des cores selektiv zu laden, die Sie brauchen.

Dies ist ein ziemlich chaotischer Ansatz, aber es ist so nah an der leichteren corelast, wie die Dinge in WP bekommen.

Wenn Sie allen WordPress-Benutzern nur erlauben möchten, die Web-App zu verwenden, können Sie das WordPress-Benutzerverwaltungssystem verwenden und einfach überprüfen, ob der Benutzer angemeldet ist oder nicht.

Um dies zu überprüfen, müssen Sie überprüfen, ob der Cookie namens wordpress_logged_in_{some-hash} vorhanden ist. Wenn nicht, leiten Sie den Benutzer zur Anmeldeseite von WordPress um. Der Teil des Cookie-Namens besteht aus einer Reihe von Buchstaben und Ziffern.