Seitentyp nach URL erkennen (Archiv, Single, Seite, Autor, …)

Update: Wirklich kurze Version

Wie bekomme ich $wp_query für eine gegebene URL, die alles $wp_query sein kann (Single, Seitenarchiv, benutzerdefinierte $wp_query , Autor, Jahr, Monat, …)?

TL; DR

Ich brauche eine function, die diese Information (als REST-API-Endpunkt) basierend auf einer gegebenen URL zurückgeben kann:

 request:'category/Uncategorized' response: { type:"category", category_name:"uncategorized" } request:'books/harry-potter' response: { type:"single", post_type:"books", name:"harry-potter" } 

So wird meine App wissen, welche Vorlage zu verwenden und welche Art von Daten zu erwarten ist.

Die lange Geschichte

Ich schreibe ein WordPress-Theme mit ReactJS, ich habe meine (bekannten) Routen mit react-router eingerichtet, aber ich muss erkennen, welche Art von Inhalt ich erwarten sollte, wenn die angeforderte URL im Moment nicht bekannt ist.

Falls die URL vom Browser gecallt wird (nicht als Ajax-Aufruf), habe ich meine WordPress Template-Datei alle erforderlichen Daten in die Seite injizieren lassen (mit $wp_query->query_vars ), also mit einer einfachen URL-Prüfung werde ich wissen, ob Daten vorhanden sind ist für die aktuelle URL gedacht und wenn ja, werde ich es verwenden.

Das Problem tritt auf, wenn Benutzer durch die entsprechenden API-Endpunkte navigieren und die nächsten Seiten geladen werden.

Es wird noch schlimmer, wenn ich alle Permalink-Strukturen unterstützen will. Also denke ich, dass ich definitiv URLs im Backend auflösen muss, um alle Möglichkeiten zu prüfen.

Also habe ich einen Detektor js, der versucht zu erkennen, ob er welche Art von Ressource angefordert hat (indem er überprüft, ob URL-Parameter category , author , … enthalten) und den API-Aufruf macht, falls er es nicht könnte werde den Detektorendpunkt aufrufen, in dem ich meiner App mitteilen muss, was auf dieser Seite gerendert werden soll.

Ich habe z. B. einen benutzerdefinierten Beitragstyp mit dem Namen “Team” registriert, sodass ich bereits weiß, wie ich mit mywebsite.com/team & mywebsite.com/team/:slug umgehen mywebsite.com/team/:slug , aber für den Fall, dass der Benutzer einen neuen Beitragstyp registriert, sagen wir “Bücher”, meine App wird keine Ahnung haben, ob Bücher der Slug einer Seite, der Post-Slug oder ein Post-Typ-Archivname ist.

Solutions Collecting From Web of "Seitentyp nach URL erkennen (Archiv, Single, Seite, Autor, …)"

Sie haben rewrite_rules in der Tabelle wp_options. Von dort kann Ihre App eine Vorstellung davon haben, was das WordPress in Zukunft neu schreiben wird und wie es nach index.php umgeschrieben wird. Sie können regex in JS mit wp_options-Daten verwenden, um die App-Antwort anzupassen.

AKTUALISIEREN

Hier ist ein Codeblock, den ich brauchte, um die Art der aktuellen Seite / Post zu bestimmen, um basierend auf dem Rückgabewert dynamisch eine andere Vorlage zu verwenden.

 if(!function_exists('get_nature_of_post')): function get_nature_of_post() { global $wp_query; $wpq = json_decode(json_encode($wp_query),true); $check = array("is_single","is_page","is_archive","is_author","is_category","is_tax","is_search","is_home","is_404","is_post_type_archive"); $page_identifiers = array_intersect_key($wpq,array_flip($check)); $page_identifiers = array_filter($page_identifiers); $keys = array_flip(array_keys($page_identifiers)); $case['home'] = array_flip(array('is_home')); $case['search'] = array_flip(array('is_search')); $case['archive'] = array_flip(array('is_archive','is_post_type_archive')); $case['taxonomy'] = array_flip(array('is_archive','is_tax')); $case['single'] = array_flip(array('is_single')); $case['page'] = array_flip(array('is_page')); $home = !array_diff_key($case['home'], $keys) && !array_diff_key($keys, $case['home']); $archive = !array_diff_key($case['archive'], $keys) && !array_diff_key($keys, $case['archive']); $search = !array_diff_key($case['search'], $keys) && !array_diff_key($keys, $case['search']); // var_dump($archive); $taxonomy = !array_diff_key($case['taxonomy'], $keys) && !array_diff_key($keys, $case['taxonomy']); // var_dump($taxonomy); $single = !array_diff_key($case['single'], $keys) && !array_diff_key($keys, $case['single']); // var_dump($single); $page = !array_diff_key($case['page'], $keys) && !array_diff_key($keys, $case['page']); // var_dump($page); switch (!false) { case $archive: return 'archive'; break; case $taxonomy: return 'taxonomy'; break; case $single: return 'single'; break; case $page: return 'page'; break; case $search: return 'search'; break; case $home: return 'home'; break; default: return false; } } endif;