Próbuję utworzyć niestandardowy punkt końcowy interfejsu API w WordPress i muszę przekierować żądania do wirtualnej strony w katalogu głównym WordPress na rzeczywistą stronę, która jest dostarczana z moją wtyczką. Zasadniczo wszystkie żądania na jednej stronie są w rzeczywistości przekierowywane na drugą.
Przykład:
http://mysite.com/my-api.php
=>http://mysite.com/wp-content/plugins/my-plugin/my-api.php
Chodzi o to, aby adres URL punktu końcowego interfejsu API był jak najkrótszy (podobnie jak w http://mysite.com/xmlrpc.php
celu dostarczenia rzeczywistego pliku punktu końcowego interfejsu API z wtyczką, zamiast wymagać od użytkownika przenoszenia plików podczas instalacji i / lub rąbania rdzenia .
Moim pierwszym pchnięciem było dodanie niestandardowej reguły przepisywania. Miało to jednak dwa problemy.
- Punkt końcowy zawsze miał końcowy ukośnik. Stało się
http://mysite.com/my-api.php/
- Moja reguła przepisywania została zastosowana tylko częściowo. Nie przekierowuje do
wp-content/plugins...
, przekierowuje doindex.php&wp-content/plugins...
. Doprowadziło to do wyświetlenia przez WordPress błędu nie znalezienia strony lub domyślnego ustawienia strony głównej.
Pomysły? Propozycje?
źródło
get_query_vars()
w my-api.php. Sprawdziłem, które zmienne są ładowane. A jedynym ustawionym var jest aa oWP object
nazwie$wp
. Jak uzyskać dostęp doWP_Query
obiektu lub przekształcić go w obiekt, aby uzyskać dostęp do przekazywanych zmiennych za pomocąget_query_vars()
?include
plik jest wykonywany w bieżącym zakresie. W tym przypadku jest towpse9870_parse_request
funkcja, która ma tylko$wp
parametr. Możliwe, że$wp_query
obiekt globalny nie został ustawiony w tej chwili, więcget_query_var()
nie będzie działać. Jednak masz szczęście:$wp
jest to klasa, która zawiera elementquery_vars
członkowski, którego potrzebujesz - używam go sam w powyższym kodzie.To zadziałało dla mnie. Nigdy nie dotykam przepisanego API, ale zawsze jestem gotów popchnąć się w nowych kierunkach. Poniższe działało na moim serwerze testowym dla wersji 3.0 zlokalizowanym w podfolderze localhost. Nie widzę żadnego problemu, jeśli WordPress jest zainstalowany w katalogu głównym.
Po prostu upuść ten kod we wtyczce i prześlij plik o nazwie „taco-kittens.php” bezpośrednio do folderu wtyczki. Będziesz musiał napisać twardy kolor dla swoich permalinków. Myślę, że mówią, że najlepszym czasem na to jest aktywacja wtyczki.
Najlepsze życzenia, -Mike
źródło
add_rewrite_rule( 'taco-kittens', 'wp-content/plugins/taco-kittens.php', 'top' );
Czy jest jakiś powód, aby nie robić czegoś takiego?
http://mysite.com/?my-api=1
Następnie po prostu podłącz swoją wtyczkę do 'init' i sprawdź, czy zmienna jest dostępna. Jeśli istnieje, zrób to, co musi zrobić wtyczka, i zgiń ()
źródło
Być może nie rozumiem w pełni twoich pytań, ale czy zwykły krótki kod rozwiązałby twój problem?
Kroki:
Nowa strona działa jako punkt końcowy interfejsu API, a Twój shortcode wysyła żądania do kodu wtyczki w http://mysite.com/wp-content/plugins/my-plugin/my-api.php
(oczywiście oznacza to, że my-api.php miałby zdefiniowany krótki kod)
Prawdopodobnie możesz zautomatyzować kroki 1 i 2 za pomocą wtyczki.
źródło
Nie zajmowałem się jeszcze zbyt często przepisywaniem, więc jest to prawdopodobnie trochę trudne, ale wydaje się, że działa:
Działa, jeśli podłączysz to do „generate_rewrite_rules”, ale musi istnieć lepszy sposób, ponieważ nie chcesz przepisywać pliku .htaccess przy każdym ładowaniu strony.
Wygląda na to, że nie mogę przestać edytować własnych postów ... raczej powinno raczej wejść w ciebie, aktywować oddzwanianie i odwołać się do globalnego $ wp_rewrite. A następnie usuń wpis z non_wp_rules i wyślij ponownie do .htaccess, jeśli dezaktywujesz oddzwanianie.
I na koniec, pisanie na .htaccess powinno być nieco bardziej wyrafinowane, chcesz tylko tam zastąpić sekcję wordpress.
źródło
Miałem podobne wymagania i chciałem stworzyć kilka punktów końcowych w oparciu o unikalne ślimaki, które wskazywałyby na zawartość generowaną przez wtyczkę.
Zobacz źródło mojej wtyczki: https://wordpress.org/extend/plugins/picasa-album-uploader/
Technika, której użyłem, zaczyna się od dodania filtra
the_posts
do badania przychodzącego żądania. Jeśli wtyczka powinna to obsłużyć, generowany jest fałszywy post i dodawane jest działanietemplate_redirect
.Wywołanie
template_redirect
akcji musi skutkować wyświetleniem całej zawartości strony, która ma zostać wyświetlona, i wyjściem, w przeciwnym razie powinna powrócić bez generowania danych wyjściowych. Zobacz kod w,wp_include/template-loader.php
a zobaczysz dlaczego.źródło
Używam innego podejścia, które polega na zmuszeniu strony głównej do załadowania niestandardowego tytułu, treści i szablonu strony .
Rozwiązanie jest bardzo fajne, ponieważ można je wdrożyć, gdy użytkownik podąża za przyjaznym linkiem, takim jak http://example.com/ ? Plugin_page = moja strona
Jest bardzo łatwy do wdrożenia i powinien pozwalać na nieograniczoną liczbę stron.
Kod i instrukcje tutaj: Generuj na bieżąco niestandardową / fałszywą / wirtualną stronę Wordpress
źródło
Używam podejścia podobnego do powyższego Xavi Esteve, który przestał działać z powodu aktualizacji WordPress, o ile mogłem powiedzieć w drugiej połowie 2013 roku.
Jest to szczegółowo opisane tutaj: https://stackoverflow.com/questions/17960649/wordpress-plugin-generating-virtual-pages-and-using-theme-template
Kluczową częścią mojego podejścia jest użycie istniejącego szablonu, aby powstała strona wyglądała tak, jakby była częścią witryny; Chciałem, aby był jak najbardziej kompatybilny ze wszystkimi motywami, mam nadzieję, że we wszystkich wersjach WordPress. Czas pokaże, czy miałem rację!
źródło
jest to gotowy przykład produkcji, najpierw stwórz wirtualną klasę strony:
W następnym kroku podpinaj
template_redirect
i obsługuj swoją wirtualną stronę jak poniżejźródło