WordPress

ajax – Pobierz zawartość wewnętrznego adresu URL za pomocą file_get_contents lub nawet cURL

  • 19 lipca, 2024
  • 3 min read
ajax – Pobierz zawartość wewnętrznego adresu URL za pomocą file_get_contents lub nawet cURL


Załóżmy taką sytuację:

Istnieje wtyczka, która tworzy faktury dla zamówień WC. Wtyczka ma dedykowaną stronę listy zamówień, na której wybierasz zamówienia WC, a następnie wykonuje wywołanie (GET) AJAX do określonej akcji, która tworzy faktury pojedynczo.

Załóżmy więc, że mamy taki fragment kodu:

add_action('wp_ajax_issue_order_invoices', 'issue_order_invoices');
function issue_order_invoices() {
 // A lot of code here
}

Należy zauważyć, że odnosi się to do wywołania AJAX po zalogowaniu – nie _no_priv dodano akcję. Wtyczka ma również specyficzną wadę projektową (zgodnie z którą, aby poprawnie obliczyć niektóre podatki, musi zmienić status zamówienia na oczekujące, aby uruchomić wbudowaną funkcję WC calculate_totals() funkcja dla każdego zamówienia, a następnie zmień status zamówienia z powrotem na poprzedni (przetwarzanie/zakończone/itp.). Jak możesz sobie wyobrazić, powoduje to ponowne wysłanie e-maili z zamówieniem do klientów.

Autor wtyczki odmawia naprawienia błędu projektowego, więc poproszono mnie, abym jakoś naprawił sytuację. Jednak nie jest to łatwe, nie dlatego, że nie mogę, ale dlatego, że nie daje mi to dostępu do użytecznego haka, aby lepiej podejść do sytuacji…

Warto przeczytać!  pętla - Grupuj posty w kategorii na podstawie tagów w niestandardowej taksonomii

Poproszono mnie również o utworzenie przycisku wewnątrz strony edycji każdego zamówienia, aby za każdym razem generować pojedynczą fakturę. To faktycznie dało mi pomysł „nadpisania” mechanizmu generowania faktury w następujący sposób: tworzę metabox wewnątrz strony edycji zamówienia z przyciskiem, który po naciśnięciu uruchomi utworzone przeze mnie żądanie AJAX, które (tymczasowo) wyłączy powiadomienia e-mail dla tego zamówienia, a następnie wywoła adres URL GET AJAX wtyczki, który wystawi fakturę dla tego konkretnego zamówienia, a następnie ponownie włączy powiadomienia e-mail dla tego zamówienia. Aby więc wywołać żądanie GET AJAX wtyczki, przestudiowałem strukturę adresu URL i naśladowałem ją, przekazując wszystkie niezbędne parametry, które funkcja issue_order_invoices() używa (jak _nonce, order id z poprawną nazwą parametru, itd.). Więc w moim własnym wywołaniu AJAX robię $response = file_get_contents( $this_url ); i wtedy ja json_decode() odpowiedź i odesłać ją do mojego JS w celu dalszego potwierdzenia… Mój problem polega na tym, że file_get_contents() odwiedza adres URL jako niezalogowany użytkownik, a zatem nie może wykonać wywołania wtyczki (pamiętaj, że to użytkownik niezalogowany) _nopriv Akcja AJAX). Więc na początku pomyślałem: OK, dodam dwa dodatkowe kroki do mojego kodu, to znaczy przed wykonaniem file_get_contents() „zadzwoń”, dodam add_action('wp_ajax_nopriv_issue_order_invoices', 'issue_order_invoices'); a potem to usunę remove_action('wp_ajax_nopriv_issue_order_invoices', 'issue_order_invoices'); ze względów bezpieczeństwa… To jednak nie działa, ponieważ kod wtyczki nadal zwraca nieprawidłową odpowiedź JSON…

Warto przeczytać!  Którego protokołu należy używać w WordPressie?

Jak sobie z tym poradzić? Jakie podejście powinienem obrać? Czuję, że jestem już blisko rozwiązania tego problemu, ale nie wiem, jak „imitować” wywołanie lokalnego adresu URL WP, utrzymując bieżącą sesję administratora, aby pobrać zawartość tego adresu URL (odpowiedź AJAX oryginalnej akcji).

Proszę o pomoc?


Źródło