Kod
Stworzyłem klasę PHP do komunikacji z interfejsem API Instagrama. Używam prywatną funkcję o nazwie api_request
(pokazany poniżej), aby komunikować się z Instagram API:Dlaczego stronicowanie na Instagramie wraca do tej samej strony w kółko?
private function api_request($request = null) {
if (is_null($request)) {
$request = $this->request["httpRequest"];
}
$body = wp_remote_retrieve_body(wp_remote_get($request, array(
"timeout" => 10,
"content-type" => "application/json"
)
)
);
try {
$response = json_decode($body, true);
$this->data["pagination"] = $response["pagination"]["next_url"];
$this->data["response"] = $response["data"];
$this->setup_data($this->data);
} catch (Exception $ex) {
$this->data = null;
}
}
Te dwie linie kodu ...
$this->data["pagination"] = $response["pagination"]["next_url"];
$this->data["response"] = $response["data"];
... konfiguruje moich danych w tej tablicy :
private $data = array (
"response" => null,
"pagination" => null,
"photos" => array()
);
problem
Ilekroć zwrócić się do następnej strony, z następujących funkcji:
public function pagination_query() {
$this->api_request($this->data["pagination"]);
$output = json_encode($this->data["photos"]);
return $output;
}
Instagram daje mi pierwszą stronę, w kółko i na zysk. Czy wiesz, jaki jest problem?
Aktualizacja # 1
zdałem sobie sprawę, że z powodu mojego setup_data
funkcja (stosowany w api_request
funkcji) pcha moje obiektów fotograficznych na końcu mojego $this->data["photos"]
tablicy:
private function setup_data($data) {
foreach ($data["response"] as $obj) {
/* code that parses the api, goes here */
/* pushes new object onto photo stack */
array_push($this->data["photos"], $new_obj);
}
}
... to jest konieczne, aby utworzyć pustą tablicę, żądając nowej strony:
public function pagination_query() {
$this->data["photos"] = array(); // kicks out old photo objects
$this->api_request($this->data["pagination"]);
$output = json_encode($this->data["photos"]);
return $output;
}
Mogę pobrać drugą stronę, ale wszystkie kolejne wywołania pagination_query
zwracają tylko drugą stronę. Jakieś pomysły, co może być nie tak?
Aktualizacja # 2
odkryłem, że przy użyciu while
oświadczenie, aby funkcja api_request
nazywać się, pozwala mi odzyskać strona po stronie porządku:
private function api_request($request = null) {
if (is_null($request)) {
$request = $this->request["httpRequest"];
}
$body = wp_remote_retrieve_body(wp_remote_get($request, array(
"timeout" => 18,
"content-type" => "application/json"
)
)
);
try {
$response = json_decode($body, true);
$this->data["response"] = $response["data"];
$this->data["next_page"] = $response["pagination"]["next_url"];
$this->setup_data($this->data);
// while state returns page after page just fine
while (count($this->data["photos"]) < 80) {
$this-> api_request($this->data["next_page"]);
}
} catch (Exception $ex) {
$this->data = null;
}
}
to jednak nie robi Naprawię moją funkcję pagination_query
i wygląda na to, że mój blok try-catch
tworzy zamknięcie i nie jestem do końca pewien, co z tym zrobić.
jakie jest wyjście z tablicy '$ response' –
Witam @MichaelStClair, tutaj możesz znaleźć strukturę koperty odpowiedzi: [Instagram API Endpoints] (https://instagram.com/developer/endpoints/) – Wilhelm
drukuj out '$ response [" pagination "] [" next_url "];' i zobacz czy istnieje tam nawet wartość –