You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
1.9 KiB
80 lines
1.9 KiB
<?php
|
|
class WP_Map_Iterator extends IteratorIterator {
|
|
function __construct( $iterator, $callback ) {
|
|
$this->callback = $callback;
|
|
parent::__construct( $iterator );
|
|
}
|
|
|
|
function current() {
|
|
$original_current = parent::current();
|
|
return call_user_func( $this->callback, $original_current );
|
|
}
|
|
}
|
|
|
|
class WP_Post_IDs_Iterator implements Iterator {
|
|
private $limit = 100;
|
|
private $post_ids;
|
|
private $ids_left;
|
|
private $results = array();
|
|
|
|
public function __construct( $post_ids, $limit = null ) {
|
|
$this->db = $GLOBALS['wpdb'];
|
|
$this->post_ids = $post_ids;
|
|
$this->ids_left = $post_ids;
|
|
if ( !is_null( $limit ) ) {
|
|
$this->limit = $limit;
|
|
}
|
|
}
|
|
|
|
public function current() {
|
|
return $this->results[$this->index_in_results];
|
|
}
|
|
|
|
public function key() {
|
|
return $this->global_index;
|
|
}
|
|
|
|
public function next() {
|
|
$this->index_in_results++;
|
|
$this->global_index++;
|
|
}
|
|
|
|
public function rewind() {
|
|
$this->results = array();
|
|
$this->global_index = 0;
|
|
$this->index_in_results = 0;
|
|
$this->ids_left = $this->post_ids;
|
|
}
|
|
|
|
public function valid() {
|
|
if ( isset( $this->results[$this->index_in_results] ) ) {
|
|
return true;
|
|
}
|
|
if ( empty( $this->ids_left ) ) {
|
|
return false;
|
|
}
|
|
$has_posts = $this->load_next_posts_from_db();
|
|
if ( !$has_posts ) {
|
|
return false;
|
|
}
|
|
$this->index_in_results = 0;
|
|
return true;
|
|
}
|
|
|
|
private function load_next_posts_from_db() {
|
|
$next_batch_post_ids = array_splice( $this->ids_left, 0, $this->limit );
|
|
$in_post_ids_sql = _wp_export_build_IN_condition( 'ID', $next_batch_post_ids );
|
|
$this->results = $this->db->get_results( "SELECT * FROM {$this->db->posts} WHERE $in_post_ids_sql" );
|
|
if ( !$this->results ) {
|
|
if ( $this->db->last_error ) {
|
|
throw new WP_Iterator_Exception( 'Database error: ' . $this->db->last_error );
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
class WP_Iterator_Exception extends Exception {
|
|
}
|
|
|