->delete( $indexable ); $indexable->delete(); } /** * Updates the relations when the post indexable is built. * * @param Indexable $updated_indexable The updated indexable. * @param Indexable $old_indexable The old indexable. */ public function updated_indexable( $updated_indexable, $old_indexable ) { // Only interested in post indexables. if ( $updated_indexable->object_type !== 'post' ) { return; } $post = $this->post->get_post( $updated_indexable->object_id ); // When the indexable is public or has a change in its public state. if ( $updated_indexable->is_public || $updated_indexable->is_public !== $old_indexable->is_public ) { $this->update_relations( $post ); } $this->update_has_public_posts( $updated_indexable ); $updated_indexable->save(); } /** * Saves post meta. * * @param int $post_id Post ID. * * @return void */ public function build_indexable( $post_id ) { // Bail if this is a multisite installation and the site has been switched. if ( $this->is_multisite_and_switched() ) { return; } if ( ! $this->post->is_post_indexable( $post_id ) ) { return; } try { $indexable = $this->repository->find_by_id_and_type( $post_id, 'post', false ); $indexable = $this->builder->build_for_id_and_type( $post_id, 'post', $indexable ); $post = $this->post->get_post( $post_id ); // Build links for this post. if ( $post && $indexable && \in_array( $post->post_status, $this->post->get_public_post_statuses(), true ) ) { $this->link_builder->build( $indexable, $post->post_content ); // Save indexable to persist the updated link count. $indexable->save(); } } catch ( Exception $exception ) { $this->logger->log( LogLevel::ERROR, $exception->getMessage() ); } } /** * Updates the has_public_posts when the post indexable is built. * * @param Indexable $indexable The indexable to check. */ protected function update_has_public_posts( $indexable ) { // Update the author indexable's has public posts value. try { $author_indexable = $this->repository->find_by_id_and_type( $indexable->author_id, 'user' ); $author_indexable->has_public_posts = $this->author_archive->author_has_public_posts( $author_indexable->object_id ); $author_indexable->save(); } catch ( Exception $exception ) { $this->logger->log( LogLevel::ERROR, $exception->getMessage() ); } // Update possible attachment's has public posts value. $this->post->update_has_public_posts_on_attachments( $indexable->object_id, $indexable->is_public ); } /** * Updates the relations on post save or post status change. * * @param WP_Post $post The post that has been updated. */ protected function update_relations( $post ) { $related_indexables = $this->get_related_indexables( $post ); $updated_at = \gmdate( 'Y-m-d H:i:s' ); foreach ( $related_indexables as $indexable ) { if ( ! $indexable->is_public ) { continue; } $indexable->updated_at = $updated_at; $indexable->save(); } } /** * Retrieves the related indexables for given post. * * @param WP_Post $post The post to get the indexables for. * * @return Indexable[] The indexables. */ protected function get_related_indexables( $post ) { /** * The related indexables. * * @var Indexable[] $related_indexables . */ $related_indexables = []; $related_indexables[] = $this->repository->find_by_id_and_type( $post->post_author, 'user', false ); $related_indexables[] = $this->repository->find_for_post_type_archive( $post->post_type, false ); $related_indexables[] = $this->repository->find_for_home_page( false ); $taxonomies = \get_post_taxonomies( $post->ID ); $taxonomies = \array_filter( $taxonomies, 'is_taxonomy_viewable' ); foreach ( $taxonomies as $taxonomy ) { $terms = \get_the_terms( $post->ID, $taxonomy ); if ( empty( $terms ) || \is_wp_error( $terms ) ) { continue; } foreach ( $terms as $term ) { $related_indexables[] = $this->repository->find_by_id_and_type( $term->term_id, 'term', false ); } } return \array_filter( $related_indexables ); } /** * Tests if the site is multisite and switched. * * @return bool True when the site is multisite and switched */ protected function is_multisite_and_switched() { return \is_multisite() && \ms_is_switched(); } }