Indexing other types of content
Algolia doesn’t provide support for WordPress or any WordPress plugin.
The plugin indexes posts, but you may want to index other types of content from your WordPress instance. To do so, you can adapt your existing reindex_post
function to index any post type.
Indexing post types
You want to adapt the reindex_post
function so you can pass it --type
argument. You can use the passed value in the function instead of the hard-coded “post” value. You can also set the index name using your algolia_index_name
filter, and dynamically pick the transform filter based on post type to convert the content into Algolia records.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public function reindex_post($args, $assoc_args) {
global $algolia;
global $table_prefix;
$type = isset($assoc_args['type']) ? $assoc_args['type'] : 'post';
$indexName = $table_prefix.$type;
$index = $algolia->initIndex(
apply_filters('algolia_index_name', $indexName, $type)
);
$index->clearObjects()->wait();
$paged = 1;
$count = 0;
do {
$posts = new WP_Query([
'posts_per_page' => 100,
'paged' => $paged,
'post_type' => $type,
'post_status' => 'publish',
]);
if (!$posts->have_posts()) {
break;
}
$records = [];
foreach ($posts->posts as $post) {
if (!empty($assoc_args['verbose'])) {
WP_CLI::line('Indexing ['.$post->post_title.']');
}
$record = (array) apply_filters($type.'_to_record', $post);
if (! isset($record['objectID'])) {
$record['objectID'] = implode('#', [$post->post_type, $post->ID]);
}
$records[] = $record;
$count++;
}
$index->saveObjects($records);
$paged++;
} while (true);
WP_CLI::success("$count $type entries indexed in Algolia");
}
Indexing terms
To index terms, you can add a new public reindex_terms
method in your main Algolia_Command
class to create a wp algolia reindex_terms
command. You can start from the reindex_post
code and adapt it to index terms instead of posts.
Posts and terms have a different structure and live in different tables in your database. The logic might be similar, but you should handle them with two separate methods.