Configuración de una página de "escucha" de la API

2

Necesito crear una secuencia de comandos PHP que recibirá datos de otra aplicación a través de una publicación HTTP, procesar esos datos y actualizar la base de datos de WordPress. Este script se ejecutará de forma silenciosa (es decir, sin salida HTTP). ¿Cuál es la mejor manera de configurar una página de este tipo? Pensé en crear un archivo de plantilla personalizado con el script PHP y asignar esa plantilla a una página de WordPress en blanco, pero ¿hay algún método mejor que deba usar?

    
pregunta philosophyguy 17.01.2014 - 17:45

2 respuestas

2

Yo usaría Rewrite API y la acción template_redirect para responder a las solicitudes de API.

A modo de ejemplo, si quisiera responder a las solicitudes dirigidas a url: example.com/example-path/ con lógica en mi tema o en el archivo endpoint.php del complemento, crearía una regla de reescritura y un enganche de redirección de la plantilla como tal. :

add_action( 'init', 'example_rewrite_rules' );
add_action( 'template_redirect', 'example_template_route' );

/**
 * Add rewrite rules for Example endpoint.
 */
function example_rewrite_rules()
{
    add_rewrite_rule(
        'example-path/?$',
        'index.php',
        'top'
   );
}

function example_template_route( $default_template ) {
    global $wp, $wp_rewrite;

    if ( $wp->matched_rule == 'example-path/?$' ) {
        // call function or include template view here.
        include dirname( __FILE__ ) . '/endpoint.php';
        exit();   
    }
}

Dependiendo de los datos que se publiquen desde su API, es posible que también desee agregar un rewrite_tag para poder acceder a la consulta cadenas pasadas a su ruta de ruta de ejemplo.

    
respondido por el Rachel Baker 17.01.2014 - 22:11
2

Parece que estás pidiendo un par de cosas. Haré mi mejor esfuerzo para ayudar.

  1. Necesito crear un script PHP que recibirá datos de otra aplicación a través de una publicación HTTP, procesar esos datos y actualizar la base de datos de WordPress

    • Necesitará una regla .htaccess para dirigir todas las solicitudes de un patrón de url particular a un script determinado. Lo que tendría sentido para mí es hacer coincidir api/version_number/api_resource con un script php en particular.

      Ejemplo : use .htaccess para asignar las solicitudes api/v1/user a wp-content\themes\your_theme\api\v1\user.php . Ahora su usuario puede hacer www.philosophyguy.com/api/v1/user?id=1337&action=upvote y su script aumentará el voto del usuario # 1337. Puede configurarlo para recopilar solicitudes POST en lugar de GET. O ambos, si quieres. Todo depende de tu archivo user.php .

    • Aquí hay un fragmento de un proyecto reciente que prácticamente hace lo mismo.

    <?php

    if( !$_POST || !$_POST['t'] ){ die("FORGOT TO SEND A TRANSACTION, DID YOU?"); }
    
    require_once('utils.php');
    
    // required variables
        $connection = db_server_connect();
        $transaction_id = get_hashsum($_POST['t']);
        $transaction = json_decode($_POST['t']);
    
    // get DB
        mysql_select_db(DB_NAME, $connection);
    
    // filter
        if(get_transaction($transaction_id)){ die("TRANSACTION ALREADY PROCESSED"); }
    
  2. Este script se ejecutará de forma silenciosa (es decir, sin salida HTTP)

    • Lo que desea es devolver el Código de estado HTTP 204. Le permite al navegador saber que todo fue bien, pero no espere ningún contenido con esta respuesta. Aquí hay un ejemplo de cómo hice el mío:

    <?php

    // No Content Header
        header('HTTP/1.0 204 No Response', true, 204);
    
    // Don't Cache Server-Check
        header( 'Cache-Control: no-store, no-cache, must-revalidate' );
        header( 'Access-Control-Allow-Origin: *' ); 
        header( 'Pragma: no-cache' ); 
    

    ?>

Ahora no es necesario crear una plantilla de Wordpress personalizada para manejar esta operación. Todo se gestiona por separado fuera del entorno de Wordpress. Para hacer lo necesario para guardar y actualizar cosas de Wordpress, hay algunas guías sobre cómo cargar el entorno de Wordpress externamente. Creo que este será toneladas de ayuda.

    
respondido por el akamaozu 18.01.2014 - 05:24

Lea otras preguntas en las etiquetas