Код
Я создал класс PHP для связи с Instagram API. Я использую частную функцию под названием api_request
(показано ниже) для связи с API-интерфейсом Instagram:
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;
}
}
Эти две строки кода...
$this->data["pagination"] = $response["pagination"]["next_url"];
$this->data["response"] = $response["data"];
... устанавливает мои данные в этом массиве:
private $data = array (
"response" => null,
"pagination" => null,
"photos" => array()
);
Проблема
Всякий раз, когда я запрашиваю следующую страницу, со следующей функцией:
public function pagination_query() {
$this->api_request( $this->data["pagination"] );
$output = json_encode( $this->data["photos"] );
return $output;
}
Instagram дает мне первую страницу, снова и снова выигрывает. Любая идея, что проблема здесь?
Обновление # 1
Я понял, что, поскольку моя функция setup_data
(используется в функции api_request
) подталкивает мои фото объекты к концу моего массива $this->data["photos"]
:
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 );
}
}
... при запросе новой страницы необходимо создать пустой массив:
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;
}
Я могу получить вторую страницу, но все последующие вызовы pagination_query
возвращают только вторую страницу. Любые идеи, что может быть неправильным?
Обновление # 2
Я обнаружил, что с помощью инструкции while
, чтобы сделать вызов функции api_request
сам, позволяет мне получить страницу за страницей просто отлично:
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;
}
}
Однако это не исправляет мою функцию pagination_query
и кажется, что мой блок try-catch
создает закрытие, и я не уверен, что с этим делать.