WordPress asigna una URL personalizada a una función

3 minutos de lectura

avatar de usuario
Steve

Estoy tratando de agregar una estructura de URL personalizada a un sitio web basado en WordPress.

por ejemplo:

example.com/machines             //list all machines in a table

example.com/machines?some=params //list filtered machines in a table

example.com/machines/1           //show single machine

Los datos provendrán de una API externa que ya he desarrollado, a través de curl.

No puedo importar los datos en un tipo de publicación personalizada, ya que está normalizado en muchas tablas, la lógica comercial es complicada y otros dispositivos utilizan la API de todos modos.

He mirado los documentos para add_rewrite_rulepero el segundo parámetro me tiene perplejo:

$redirect
(string) (required) The URL you would like to actually fetch

Bueno, no tengo una URL para buscar, quiero ejecutar una función, que actuará como un enrutador simple: tome las partes de la URL, llame a la API externa y devuelva una plantilla con los datos correctos.

Llamar a la API será simple, pero la forma en que realmente dirijo la URL a la función, y cómo luego cargo una plantilla (utilizando el encabezado.php y el pie de página de WordPress existentes) me tiene perplejo.

avatar de usuario
Steve

Después de mucho googlear y leer algunos bueno recursosHe encontrado la solución.

Paso 1: Usar add_rewrite_endpoint para crear una URL base que se asignará a una variable de consulta:

add_action( 'init', function(){
    add_rewrite_endpoint( 'machines', EP_ROOT );
} );

Paso 2: Visite la página de configuración de enlaces permanentes y haga clic en “Guardar cambios” para eliminar las reglas de reescritura.

Paso 3: Engánchate a la acción 'template_redirect' para hacer algo cuando se golpea la URL:

add_action( 'template_redirect', function() {
    if ( $machinesUrl = get_query_var( 'machines' ) ) {
        // var_dump($machinesUrl, $_GET);
        // $machinesURl contains the url part after example.com/machines
        // e.g. if url is example.com/machines/some/thing/else
        // then $machinesUrl == 'some/thing/else'
        // and params can be retrieved via $_GET

        // after parsing url and calling api, it's just a matter of loading a template:
        locate_template( 'singe-machine.php', TRUE, TRUE );

        // then stop processing
        die();
    }
});

Paso 4: Lo único que se puede hacer es manejar un hit en una URL sin más partes, por ejemplo. example.com/machines. Resulta que en algún momento dentro de las entrañas de WordPress, la cadena vacía se evalúa como falsa y, por lo tanto, se omite, por lo que el paso final es conectarse al filtro. 'request' y establezca un valor predeterminado:

add_filter( 'request', function( $vars = [] ) {
    if ( isset( $vars['machines'] ) && empty( $vars['machines'] ) ) {
        $vars['machines'] = 'default';
    }
    return $vars;
});

Esto se puede mejorar fácilmente envolviéndolo todo en una(s) clase(s). El análisis de URL y la lógica de carga de plantillas se pueden pasar a un enrutador básico, incluso a una configuración rudimentaria de MVC, cargando rutas desde un archivo, etc., pero lo anterior es el punto de partida.

Una solución más simple es simplemente crear una nueva redirección de plantilla.

Entonces, asumiendo que estás cargando example.com/custom-url

/**
 * Process the requests that comes to custom url.
 */
function process_request() {
    // Check if we're on the correct url
    global $wp;
    $current_slug = add_query_arg( array(), $wp->request );
    if($current_slug !== 'custom-url') {
        return false;
    }

    // Check if it's a valid request.
    $nonce = filter_input(INPUT_GET, '_wpnonce', FILTER_SANITIZE_STRING);
    if ( ! wp_verify_nonce( $nonce,  'NONCE_KEY')) {
        die( __( 'Security check', 'textdomain' ) );
    }

    // Do your stuff here
    

    //
    die('Process completed' );
}
add_action( 'template_redirect', 'process_request', 0);

  • Sí, puedes omitir absolutamente add_rewrite_endpointes útil si tiene la intención de manejar múltiples rutas de URL, como la configuración de estilo de descanso que usé cuando originalmente escribí esto.

    –Steve

    7 dic 2020 a las 11:50

  • Asegúrese de agregar un encabezado (“HTTP/1.1 200 OK”); Estaba usando este código para un webhook para un proveedor de pagos. Si no agrega el encabezado, la página devolverá un 404, por lo que el proveedor de pago pensó que la solicitud falló.

    – Guido Rus

    16 de julio de 2021 a las 14:45


¿Ha sido útil esta solución?