Acceda a las funciones de WordPress en la página del complemento independiente

6 minutos de lectura

avatar de usuario
robooneo

¿Cómo puedo permitir que una página independiente acceda a las funciones de WordPress? sin incluir/requerir wp_load o wp_config?

Estoy desarrollando un complemento y necesito permitir el acceso a la base de datos de WP en una página php independiente. Esta página es simplemente una solicitud curl que devuelve una página HTML completa para mostrar. Por contexto, el complemento es una lista de trabajos de una API que luego debe vincularse al anuncio de trabajo completo (una página HTML completa).

El código que tengo actualmente es este (en una página jobad.php):

$root = dirname(dirname(dirname(dirname(dirname(__FILE__)))));
if (file_exists($root.'/wp-load.php')) {
  require_once($root.'/wp-load.php');
}

Este es el código que saqué de cada respuesta que encontré sobre cómo lograr esto. Incluso de los propios foros de wordpress.org. De esta respuesta de stackoverflow, por ejemplo: ¿Usar WPDB en un script independiente?

Funciona bien, pero cuando traté de enviar el complemento al directorio WP, el complemento fue rechazado por incluir wp_load.php de esta manera. Tiene sentido por qué no hacerlo, pero no puedo encontrar otra forma de hacer que el archivo funcione dentro de WordPress.

El resultado que necesito

A partir de una lista generada por un shortcode, cada elemento tiene un enlace que devolverá una página HTML completa. Esta página HTML se devuelve como una respuesta cURL, no como una URL (o simplemente podría hacer que cada enlace maneje un iframe). Por contexto, estoy construyendo el enlace de esta manera.

$job_ad_link = plugins_url( 'includes/jobad.php' , dirname(__FILE__) );
$job_id = //id from database;
<a href="'.$job_ad_link.'?sgjobid='.$job_id.'">link</a>

Por lo tanto, llamar a jobad.php ejecutará la función cURL para el job_id correcto y mostrará la respuesta cURL. Puedo ejecutar cURL como AJAX y evitar este problema, pero debido a que es una página HTML completa, no puedo simplemente devolver cURL en un div. En un iframe es incómodo y dudoso y preferiría no usarlo (y no he tenido éxito en intentarlo).

Para aclarar, la respuesta de WordPress:

Incluir wp-config.php, wp-blog-header.php, wp-load.php, o casi cualquier otro archivo central de WordPress al que tengas que llamar directamente a través de un include no es una buena idea y no podemos aprobar un complemento que lo hace a menos que tenga una muy buena razón para cargar los archivos. Es propenso a fallar ya que no todas las instalaciones de WordPress tienen exactamente la misma estructura de archivos.

avatar de usuario
2ndkauboy

Implementé un par de complementos que proporcionan respuestas AJAX, por lo que también necesitaba poder acceder a las funciones de WordPress desde un script PHP. Resolví esto incluyendo el archivo wp_config.php hasta que un desarrollador principal señaló cómo resolverlo correctamente.

Como esta forma no se limita a las llamadas AJAX, también uso para mostrar una página para una aplicación de Facebook, que necesita tener acceso a las funciones de WordPress. Así es como lo hace (simplemente coloque esto en su functions.php o en un pequeño complemento):

function full_job_ad_page() {
    global $wpdb; // this is how you get access to the database

    // do what ever you want with the ability to access WordPress functions.
    // asuming that the one item is an option, just get it with get_option
    $value_from_db = get_option( 'curl_value' );
    // asuming that the value is in any other table, use some $wpdb function
    $value_from_db =  $wpdb->get_var( 'SELECT value FROM table' );
    // include the curl file echoing the response
    include( plugin_dir_path( __FILE__ ) . 'curl-script.php' );

    die(); // this is required to return a proper result
}
add_action( 'wp_ajax_full_job_ad_page', 'full_job_ad_page' );
add_action( 'wp_ajax_nopriv_full_job_ad_page', 'full_job_ad_page' );

Entonces puede usar una URL de este tipo para obtener la respuesta de la función:

http://example.com/wp-admin/admin-ajax.php?action=full_job_ad_page

Nota: La acción en la URL debe coincidir con el final del primer parámetro de los ganchos de acción (la cadena después de wp_ajax_ y wp_ajax_nopriv_).

  • Como se trata de un complemento, simplemente lo incluiría en el archivo principal del complemento, ¿correcto? Lo único a lo que necesito acceso es a un elemento de la base de datos para pasarlo al script cURL. ¿Iría todo el script cURL aquí, o en el archivo PHP separado? Y, si existe, ¿cómo devuelvo el resultado dentro del archivo PHP? Lo siento, todavía no veo cómo se conectan los dos.

    – robooneo

    19 de julio de 2013 a las 10:23

  • Cambié un poco el código y agregué una URL de ejemplo para llamar a esta función. La función se puede incluir en su archivo de complemento de correo.

    – 2.º kauboy

    19 de julio de 2013 a las 10:35

avatar de usuario
Hein André Grønnestad

Creo que encontrarás la respuesta en estos artículos:

AJAX en complementos

5 consejos para usar AJAX en WordPress

también mira esta pregunta en WordPress Answers, donde encontré los enlaces.

  • He implementado AJAX para ejecutar cURL antes, pero no quiero devolver la solicitud de cURL en la misma página. Quiero que el HTML devuelto se muestre en su propia página. Ejecutar la solicitud en AJAX en la otra página no me da más acceso a la base de datos de WP que ejecutarla normalmente.

    – robooneo

    19 de julio de 2013 a las 10:14

  • No leíste los artículos. La respuesta de @ Kau-Boy implementa una solución como se describe en los enlaces que le di.

    – Hein André Grønnestad

    19 de julio de 2013 a las 10:16


¿qué tal si?

<?php
// Include WordPress
define('WP_USE_THEMES', false);
require('path_to_wp/wp-blog-header.php');
query_posts('page_id=63');
?>

<?php while (have_posts()): the_post(); ?>
  <h2><?php the_title(); ?></h2>
  <?php the_content(); ?>
<?php endwhile; ?>

  • Esa no es una buena solución por la misma razón que no se recomienda importar wp_config o wp_load en ningún archivo.

    – 2.º kauboy

    19 de julio de 2013 a las 10:25

  • ¡Este es un método estándar para incluir funciones de WordPress en una página estática/independiente!

    – marty

    19 de julio de 2013 a las 10:39

  • Un método estándar que utilizan demasiados usuarios. ¡Pero no es recomendable en absoluto!

    – 2.º kauboy

    19 de julio de 2013 a las 10:54

  • ¿POR QUÉ? ¿Puede explicar un poco por qué no se recomienda su uso?

    – marty

    22 de julio de 2013 a las 10:55

  • Por (al menos) razones: 1. La ruta de guardado de wp-config.php puede variar (podría ser una carpeta sobre el directorio raíz de WP). 2. El sistema llamará a demasiados ganchos que no son necesarios para responder una llamada AJAX (o en este caso una página estática).

    – 2.º kauboy

    22 de julio de 2013 a las 11:57

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad