wake-up-neo.net

register_rest_route-Regex-Option für base64 oder alternate

Was ich getestet habe

Wordpress-Version : 4.9.5

PHP Version : 7.1.7/7.1.4/7.2.0/7.0.3/5.6.20/5.5.38/5.4.45

Webserver : Nginx 1.10.1/Apache 2.4.10

Umgebung/Host : Schwungrad lokal https://local.getflywheel.com/

PCRE-Bibliotheksversion : 8.38 2015-11-23

Ich habe versucht, mit register_rest_route zu arbeiten, stieß aber auf reguläre Ausdrücke. Es sieht so aus, als würde der Regex vor seiner Ausführung etwas gefiltert.

Die Funktion, die ich zu erstellen versuche, packt einen Beitrag durch den Permalink. Grundsätzlich habe ich einen Client, der seine URL ähnlich wie WordPress strukturiert, sodass er den Permalink an WordPress weitergeben möchte, damit ich die Post-Daten abrufen kann

register_rest_route( $this->namespace, '/post_by_permalink/(?P<path>[\w-]+)', array(
   'methods'             => WP_REST_Server::READABLE,
   'callback'            => array( $this, 'postByPermalink' ),
   'permission_callback' => array( $this, 'permissions' ),
   'show_in_rest' => true
));

Dies ist die Funktion, die ich benutze und die in einigen Fällen funktioniert. Dies liegt jedoch nur daran, dass diejenigen, die funktionieren, keine Sonderzeichen produzieren.

Im Moment war mein Plan im Client, den Permalink auf base64 zu konvertieren, um es einfacher zu machen, die URL zu durchlaufen, obwohl ich für Vorschläge offen bin, wenn sie funktionieren (ich habe nur an base64 gedacht, da der Urlencode noch mehr ein Albtraum war).

Grundsätzlich scheint der einzige reguläre Ausdruck, der in WordPress funktioniert, (?P<path>[\w-]+) und (?P<path>[\d]+) zu sein. Alles andere funktioniert nicht, auch wenn es erfolgreich in so etwas wie http://www.phpliveregex.com getestet wurde.

Zum Beispiel sollte laut Tester (?P<path>[\S]+) funktionieren, aber alles, was ich von WordPress bekomme, ist rest_no_route

Gibt es überhaupt WordPress, um Regex normal zu handhaben? Oder zumindest einen Ausdruck zulassen, der base64 abfängt? Ich habe einige Optionen online gesehen, aber keine funktionieren, wahrscheinlich aufgrund von Änderungen in der WP-Ruhezeit im Laufe der Zeit (alle sagen "nur Regex verwenden", aber es scheint komplexere Regex zu filtern).

BEARBEITEN: Beispiel erweitern

app/v1/post_by_permalink/(?P<path>[\S-]+)

Was wird funktionieren in http://www.phpliveregex.com

Der Suchbegriff lautet

/wp-json/app/v1/post_by_permalink/dGVzdC90ZXN0

Dieselbe reguläre Ausdrucksweise funktioniert in WordPress nicht, nur (?P<path>[\w-]+) und im obigen Beispiel auch in beiden, da keine Sonderzeichen vorhanden sind.

Für diese Zeichenfolge ist dies jedoch nicht der Fall

/wp-json/app/v1/post_by_permalink/dGVzdC90ZXN0LzM1NzM0Ly0=

Da es einen = hat, funktioniert der (?P<path>[\S]+) zwar im Regex-Tester, aber nicht in WordPress.

Edit: weitere Tests

Ich habe es geschafft, rest_pre_dispatch nachzuschlagen und die Anforderung abzufangen, bevor sie die Routen überprüft.

add_filter('rest_pre_dispatch', 'filter_request');
function filter_request($result) {
    global $wp;

    //print_r($wp->request); die;
    preg_match("/app\/v1\/post_by_permalink\/(?P<path>[\S]+)/", $wp->request, $output);
    print_r($output); die;
    return $result;
}

Ist in der Lage, den Pfad korrekt festzulegen, sodass es anscheinend kein preg_match-Problem gibt. Zumindest kann ich damit wp-rest umgehen und dieses Problem umgehen, aber ich habe immer noch nicht herausgefunden, was tatsächlich dazu führt, dass jede Umgebung, in der ich dies versuche, fehlschlägt, und dennoch kann es niemand anderes neu erstellen.

Nach eingehenderem Testen habe ich das Folgende zum Laufen gebracht, ich habe $wp->request verwendet, der wp-json enthielt, der den regulären Ausdruck zum Scheitern brachte.

Wenn ich preg_match( '@^' . $route . '[email protected]', $path, $matches ) verwende, kann ich es nicht zum Laufen bringen (so macht es wp-rest, wobei $ route das ist, was durch register_rest_route geleitet wird), und die Verwendung von preg_match auf diese Weise wird im Regex-Tester nicht unterstützt http: // www.phpliveregex.com/ entweder. Es werden mehr Fragen als Antworten hinzugefügt.

1
Jordan Ramstad

Ich wurde neugierig und habe diese Barebone-Demo getestet:

add_action( 'rest_api_init', function () {
    register_rest_route( 'wpse/v1', '/post_by_permalink/(?P<path>[\S]+)', [
        'methods'      => WP_REST_Server::READABLE,
        'callback'     => 'wpse_callback',
        'show_in_rest' => true
    ] );
});

function wpse_callback( $request ) {
    $data = [ 'path' => base64_decode( $request['path'] ) ];
    return $data;
}

Testen:

https://example.com/wp-json/wpse/v1/post_by_permalink/aHR0cHM6Ly93b3JkcHJlc3Muc3RhY2tleGNoYW5nZS5jb20vcS8zMDEwNjcv

gibt

{
   path: "https://wordpress.stackexchange.com/q/301067/"
}

Auch getestet

https://example.com/wp-json/wpse/v1/post_by_permalink/aHR0cHM6Ly93b3JkcHJlc3Muc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzMwMTA2Ny9yZWdpc3Rlci1yZXN0LXJvdXRlLXJlZ2V4LW9wdGlvbi1mb3ItYmFzZTY0LW9yLWFsdGVybmF0ZS8zMDEwNzY=

das gab:

{
path: "https://wordpress.stackexchange.com/questions/301067/register-rest-route-regex-option-for-base64-or-alternate/301076"
}

Weiter getestet:

https://example.com/wp-json/wpse/v1/post_by_permalink/dGVzdC90ZXN0LzM1NzM0Ly0=

mit Ausgabe:

{
path: "test/test/35734/-"
}
1
birgire

Endlich habe ich es herausgefunden, und ich kann mir nur selbst die Schuld geben ...

Beim Testen hatte ich alle Plugins deaktiviert, aber während dieser Zeit hatte ich es mit (?P<path>[\w-]+) belassen, während ich mit einer Base64-Zeichenfolge getestet habe, die einen = enthielt. Die ganze Zeit über hatte ich Plugins entfernt, weil ich dachte, ich hätte sie neu erstellt, obwohl keine Plugins aktiv waren.

Der Täter war Rest Managerhttps://wordpress.org/plugins/rest-manager/

Ich habe ein Support-Ticket geöffnet, um den Entwickler darüber zu informieren.

rest_pre_dispatch wird verwendet, um Routen herauszufiltern, die Sie als inaktiv festgelegt haben. Das Problem besteht darin, dass Sie Routen ändern, die Sie eingeben und die Konfiguration erneut speichern müssen. Zum Glück konnte es repariert werden, da es einen Haken hat, bevor die Routen herausgefiltert wurden, sodass ich die Funktion "korrigieren" und davon ausgehen konnte, dass Routen ohne Konfiguration standardmäßig aktiviert sein sollten.

Vielen Dank an @mmm, @birire und @Otto, dass Sie sich die Zeit genommen haben, das Problem neu zu erstellen.

Deaktivieren Sie Plugins, wenn Sie versuchen, ein Problem zu isolieren.

1
Jordan Ramstad