index document content using the wp-cli #245

This commit is contained in:
vnmedeiros 2019-09-11 15:32:08 -03:00
parent 3cc9172d59
commit 005a304edb
2 changed files with 121 additions and 1 deletions

View File

@ -0,0 +1,119 @@
<?php
namespace Tainacan;
use WP_CLI;
use Tainacan\Repositories;
class Cli_Document {
private $collection_repository;
private $items_repository;
private $result_count;
private $dry_run = false;
public function __construct() {
$this->items_repository = Repositories\Items::get_instance();
$this->collection_repository = Repositories\Collections::get_instance();
$this->result_count = ['indexed_documents' => 0];
}
/**
* index content of documents
*
* ## OPTIONS
* [--collection-id=<value>]
* : <value> Specific ID of the collection into which the document content of the items will be indexed, if not informed all collections will be index.
*
*
* [--dry-run]
* : only count the total of item which will index, just output a report
*
* ## EXAMPLES
*
* wp tainacan index-content --collection-id=416
* indexing documents of items to collection 416: 100% [====================================================] 0:00 / 0:00
* Success:
* 7 items indexed
*
*
* wp tainacan index-content
* indexing documents of items to collection 416: 100% [====================================================] 0:00 / 0:00
* Success:
* 7 items indexed
* indexing documents of items to collection 301: 100% [====================================================] 0:00 / 0:00
* Success:
* 10 items indexed
*
*/
public function __invoke($args, $assoc_args) {
$this->dry_run = false;
if ( !empty($assoc_args['dry-run']) ) {
$this->dry_run = true;
}
if( empty($assoc_args['collection-id']) ) {
$this->index_item_all_collections();
} else {
$collection_id = $assoc_args['collection-id'];
$this->index_item($collection_id);
}
}
private function index_item_all_collections() {
$collections = $this->collection_repository->fetch(['posts_per_page'=>-1], 'OBJECT');
foreach ($collections as $collection) {
$this->result_count['indexed_documents'] = 0;
$this->index_item($collection->get_id());
}
}
private function index_item($collection_id) {
$per_page = 50; $page = 1;
$args = [
'posts_per_page'=> $per_page,
'paged' => $page,
'post_status' => get_post_stati()
];
$collection_items = $this->items_repository->fetch($args, $collection_id, 'WP_Query');
$total = $collection_items->found_posts;
$last_page = ceil($total/$per_page);
$progress = \WP_CLI\Utils\make_progress_bar( "indexing documents of items to collection $collection_id:", $total );
while ($page++ <= $last_page) {
if ($collection_items->have_posts()) {
while ( $collection_items->have_posts() ) {
$collection_items->the_post();
$item = new Entities\Item($collection_items->post);
$this->index_content_document_item($item);
$progress->tick();
}
}
$args['paged'] = $page;
$collection_items = $this->items_repository->fetch($args, $collection_id, 'WP_Query');
}
$progress->finish();
$msg = "\n" . $this->result_count['indexed_documents'] . " items indexed";
\WP_CLI::success( $msg );
}
private function index_content_document_item($item) {
if (! $item instanceof Entities\Item) {
\WP_CLI::error( 'An item with this ID was not found', true );
}
if ( empty( $item->get_document() ) ) {
return null;
}
$this->result_count['indexed_documents']++;
if ($this->dry_run)
return true;
return $this->items_repository->generate_index_content($item);
}
}
?>

View File

@ -28,7 +28,8 @@ class Cli {
\WP_CLI::add_command('tainacan garbage-collector', 'Tainacan\Cli_Garbage_Collector');
\WP_CLI::add_command('tainacan move-attachments-to-items-folder', 'Tainacan\Cli_Move_Attachments');
\WP_CLI::add_command('tainacan collection', 'Tainacan\Cli_Collection');
\WP_CLI::add_command('tainacan collection', 'Tainacan\Cli_Collection');
\WP_CLI::add_command('tainacan index-content', 'Tainacan\Cli_Document');
}