2011-03-15 17 views
30

Estoy tratando de conectarme a Wordpress usando el WPDB porque es una clase tan hermosa y también hay configuraciones que se especifican en wp-config.php, así que no necesitaré especificarlo de nuevo.¿Usando WPDB en una secuencia de comandos independiente?

Voy a escribir un pequeño script separado de wordpress principal para ejecutarlo en segundo plano que necesitará usar esta instancia de WPDB.

¿Cómo puedo archivar esto?

Cualquier ayuda es apreciada.

Respuesta

40

La forma mejor (más rápido y más seguro) para cargar sólo cargar la funcionalidad principal de WordPress es el uso de la bandera SHORTINIT así:

define('SHORTINIT', true); 

require('/path/to/wp-load.php'); 

//Here you can use WordPress core features, for example the $WPDB object 

Para obtener más información sobre esto y ver lo que está cargada , es verificar el código en /wp-settings.php.Allí encontrará la siguiente sección:

// Stop most of WordPress from being loaded if we just want the basics. 
if (SHORTINIT) 
    return false; 

Esto significa que nada después de esto no va a ser cargado, y es un buen montón de cosas como se puede ver. La huella será mucho más pequeña que la simple carga del wp-load.php y aún le da acceso a todas las funciones integradas en el núcleo de WordPress, a diferencia de incluir, por ejemplo, /wp-includes/wp-db.php directamente. Muchas funciones en WP core también tienen dependencias en otros archivos y puede ser un desastre averiguar exactamente qué archivos necesita incluir para poder hacer lo que quiera. SHORTINIT incluye las dependencias necesarias para que no tenga que preocuparse por esto.

Si sabe exactamente lo que necesita, por ejemplo solo WPDB, la forma más rápida es, por supuesto, incluir solo los archivos que necesita, pero SHORTINIT proporciona una forma más segura y estandarizada de cargar el núcleo WP y las dependencias. Con SHORTINIT, WordPress no carga los complementos, la mayoría de las partes de la API del complemento, los temas, las funciones del tema y la mayoría de las funciones de administración y frontend. Aquí es donde está el código pesado en una instalación típica de WordPress. En la mayoría de los casos creo que SHORTINIT vale la pena la pequeña compensación en velocidad/rendimiento en comparación con incluir solo los archivos que necesita y en la mayoría de los casos es un gran aumento de rendimiento en comparación con una carga completa.

+0

¡Definitivamente es la mejor respuesta! –

+0

Con mucho, la mejor respuesta con SHORTINIT para scripts personalizados es mucho más rápida. –

+0

¡Gracias! Esto es exactamente lo que necesitaba. wp-db.php en sí mismo requiere algunas funciones WP extrañas que no se incluyen y esto resuelve eso. –

41
<?php 

$path = $_SERVER['DOCUMENT_ROOT']; 

include_once $path . '/wp-config.php'; 
include_once $path . '/wp-load.php'; 
include_once $path . '/wp-includes/wp-db.php'; 
include_once $path . '/wp-includes/pluggable.php'; 

// $wpdb is available, do stuff 
+20

¿No es suficiente 'wp-load.php'? –

+2

Sí, wp-load es suficiente por sí solo, carga todo el resto; en otras palabras, está cargando todo WordPress, incluidos todos los complementos. –

16

WordPress en realidad le permite utilizar su propio DBA (capa de abstracción de base de datos) simplemente mediante la creación de un archivo llamado db.php y guardarlo en el directorio raíz de su wp-content.

Tuve el problema de tener que acceder a una base de datos a través de la clase que escribí, que no tenía nada que ver con WordPress, pero no quería crear un DBA completamente nuevo solo con este script.

Desde el defecto WPDB no le permite utilizar el patrón de la fábrica, que escribió rápidamente unas líneas que lo apoyen, y ha añadido que a db.php ...

<?php 

class DB extends wpdb 
{ 
    protected static $instance = null; 

    public static function getInstance() 
    { 
    if (!self::$instance) { 
     self::$instance = new DB(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST); 
    } 

    return self::$instance; 
    } 
} 

$wpdb = DB::getInstance(); 

Ahora, cuando la necesidad de usar wpdb de en otro lugar (en mi caso una clase no WordPress), puede Juse uso:

$wpdb = DB::getInstance(); 

desde dentro de un método, en lugar de lo horrible global.

+0

hermosa forma de obtener $ wpdb – hidden

+0

Wow, ¿dónde puedo obtener más información sobre el archivo DBA y db.php de WordPress? – BenRacicot

+0

El problema con esto es que el código todavía llama a las funciones de WordPress como apply_filter. Estoy tratando de encontrar una manera de tener que incluir cualquier otro archivo PHP extraño (o todo). –

11

Puede usar $ wpdb en el nuevo archivo .php que está dentro de la carpeta del tema, usando el siguiente código.

$url = (!empty($_SERVER['HTTPS'])) ? "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] : "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; 
$url = $_SERVER['REQUEST_URI']; 
$my_url = explode('wp-content' , $url); 
$path = $_SERVER['DOCUMENT_ROOT']."/".$my_url[0]; 

include_once $path . '/wp-config.php'; 
include_once $path . '/wp-includes/wp-db.php'; 
include_once $path . '/wp-includes/pluggable.php'; 

global $wpdb; 
+0

Por lo que puedo ver, esta es la única forma que se menciona aquí de cargar el código mínimo para usar wpdb, sin cargar todo WordPress ... –

2

Los siguientes dos pasos son suficientes.

  1. Incluya el archivo wp-blog-header.php
  2. Antes de utilizar el $ wpdb, poner como $ wpdb mundial;

variables globales que puede utilizar en esta página después de eso. Asegúrese de dar la ruta de inclusión correcta de wp-blog-header.php. No es necesario incluir varios archivos.

3

debe simplemente require_once ('../../../ wp-load.php');

y luego todas las clases de wordpress se enganchan y todo se cargará. ahora puede comenzar a ejecutar con la base de datos usando global $ wpdb y se iniciará la instancia de wpdb

4

Solo necesita incluir el archivo wp-load.php en su secuencia de comandos.

require('the/path/to/wp-load.php file'); 
4

Esto debería hacer el truco demasiado:

preg_match('/^(.+)wp-content\/.*/', dirname(__FILE__), $path); 
    include($path[1] . 'wp-load.php'); 
1

manera rápida y ligera con una única línea es

requieren (dirname (_FILE__) '/ wp-blog-header.php. ');

La razón es porque wordpress inicializa cargar el index.php y cuando se echa el index.php, que aparezca:

requieren (dirname (__FILE__) '/ wp-blog-header.php'). ;

Esto carga y carga wordpress.

modo de usar WordPress exterior de la instalación de WordPress, basta con crear un nuevo archivo y luego escribir:

requieren; (dirname (__FILE__) '/ wp-blog-header.php').

Luego, para una prueba, escriba: global $ wpdb; var_export ($ wpdb).

por lo que ahora tiene acceso a todas las API de wordpress y al objeto de base de datos $ wpdb.

Cuestiones relacionadas