Submit
Path:
~
/
home
/
bfxleof
/
www
/
wp-content
/
plugins
/
wordpress-seo
/
src
/
integrations
/
File Content:
indexable-post-watcher.php
<?php namespace Yoast\WP\SEO\Integrations\Watchers; use Exception; use WP_Post; use Yoast\WP\SEO\Builders\Indexable_Builder; use Yoast\WP\SEO\Builders\Indexable_Link_Builder; use Yoast\WP\SEO\Conditionals\Migrations_Conditional; use Yoast\WP\SEO\Helpers\Author_Archive_Helper; use Yoast\WP\SEO\Helpers\Post_Helper; use Yoast\WP\SEO\Integrations\Integration_Interface; use Yoast\WP\SEO\Loggers\Logger; use Yoast\WP\SEO\Models\Indexable; use Yoast\WP\SEO\Repositories\Indexable_Hierarchy_Repository; use Yoast\WP\SEO\Repositories\Indexable_Repository; use YoastSEO_Vendor\Psr\Log\LogLevel; /** * WordPress Post watcher. * * Fills the Indexable according to Post data. */ class Indexable_Post_Watcher implements Integration_Interface { /** * The indexable repository. * * @var Indexable_Repository */ protected $repository; /** * The indexable builder. * * @var Indexable_Builder */ protected $builder; /** * The indexable hierarchy repository. * * @var Indexable_Hierarchy_Repository */ private $hierarchy_repository; /** * The link builder. * * @var Indexable_Link_Builder */ protected $link_builder; /** * The author archive helper. * * @var Author_Archive_Helper */ private $author_archive; /** * Holds the Post_Helper instance. * * @var Post_Helper */ private $post; /** * Holds the logger. * * @var Logger */ protected $logger; /** * Returns the conditionals based on which this loadable should be active. * * @return array */ public static function get_conditionals() { return [ Migrations_Conditional::class ]; } /** * Indexable_Post_Watcher constructor. * * @param Indexable_Repository $repository The repository to use. * @param Indexable_Builder $builder The post builder to use. * @param Indexable_Hierarchy_Repository $hierarchy_repository The hierarchy repository to use. * @param Indexable_Link_Builder $link_builder The link builder. * @param Author_Archive_Helper $author_archive The author archive helper. * @param Post_Helper $post The post helper. * @param Logger $logger The logger. */ public function __construct( Indexable_Repository $repository, Indexable_Builder $builder, Indexable_Hierarchy_Repository $hierarchy_repository, Indexable_Link_Builder $link_builder, Author_Archive_Helper $author_archive, Post_Helper $post, Logger $logger ) { $this->repository = $repository; $this->builder = $builder; $this->hierarchy_repository = $hierarchy_repository; $this->link_builder = $link_builder; $this->author_archive = $author_archive; $this->post = $post; $this->logger = $logger; } /** * Initializes the integration. * * This is the place to register hooks and filters. * * @return void */ public function register_hooks() { \add_action( 'wp_insert_post', [ $this, 'build_indexable' ], \PHP_INT_MAX ); \add_action( 'delete_post', [ $this, 'delete_indexable' ] ); \add_action( 'wpseo_save_indexable', [ $this, 'updated_indexable' ], \PHP_INT_MAX, 2 ); \add_action( 'edit_attachment', [ $this, 'build_indexable' ], \PHP_INT_MAX ); \add_action( 'add_attachment', [ $this, 'build_indexable' ], \PHP_INT_MAX ); \add_action( 'delete_attachment', [ $this, 'delete_indexable' ] ); } /** * Deletes the meta when a post is deleted. * * @param int $post_id Post ID. * * @return void */ public function delete_indexable( $post_id ) { $indexable = $this->repository->find_by_id_and_type( $post_id, 'post', false ); // Only interested in post indexables. if ( ! $indexable || $indexable->object_type !== 'post' ) { return; } if ( $indexable->is_public ) { $this->update_relations( $this->post->get_post( $post_id ) ); } $this->update_has_public_posts( $indexable ); $this->hierarchy_repository->clear_ancestors( $indexable->id ); $this->link_builder->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(); } }
Submit
FILE
FOLDER
Name
Size
Permission
Action
alerts
---
0755
blocks
---
0755
front-end
---
0755
third-party
---
0755
watchers
---
0755
-20260704225409.DS_Store
10234 bytes
0644
.DS_Store
10234 bytes
0644
20200616130143_ReplacePermalinkHashIndex.php
2293 bytes
0644
AjaxController-20260705070306.php
2162 bytes
0644
AjaxController.php
2162 bytes
0644
BundleWriter.php
5687 bytes
0644
DownloadConfController-20260706140635-20260707110705.php
945 bytes
0644
DownloadConfController-20260706140635.php
945 bytes
0644
DownloadConfController.php
945 bytes
0644
JsonSerializable.php
577 bytes
0644
LimitStream-20260705142420.php
4209 bytes
0644
LimitStream.php
4209 bytes
0644
admin-network-it_IT.l10n.php
42133 bytes
0644
article-modified-time-presenter-20260705153144.php
609 bytes
0644
article-modified-time-presenter.php
609 bytes
0644
baidu-presenter.php
659 bytes
0644
base.php
2793 bytes
0644
class-admin-user-profile-20260624025208.php
2740 bytes
0644
class-admin-user-profile.php
2740 bytes
0644
class-helpscout.php
6972 bytes
0644
class-metabox-formatter-20260705074848.php
12602 bytes
0644
class-metabox-formatter.php
12602 bytes
0644
class-option-tabs-formatter.php
2321 bytes
0644
class-plugin-availability-20260622071513.php
8440 bytes
0644
class-sitemaps-admin-20260703023908.php
3665 bytes
0644
class-sitemaps-admin-20260706155649.php
3665 bytes
0644
class-sitemaps-admin.php
3665 bytes
0644
class-taxonomy-columns.php
7324 bytes
0644
class-upgrade-history.php
2939 bytes
0644
class-wpseo-replacement-variable-20260623193110.php
1375 bytes
0644
class-wpseo-replacement-variable.php
1375 bytes
0644
class-wpseo-statistics-20260706092054.php
1443 bytes
0644
class-wpseo-statistics.php
1443 bytes
0644
class-yoast-form.php
31520 bytes
0644
class-yoast-notification-center.php
23601 bytes
0644
class-yoast-notification.php
9611 bytes
0644
class-yoast-plugin-conflict.php
10390 bytes
0644
class.constants-20260623170030.php
150 bytes
0644
class.constants.php
150 bytes
0644
class.pack.database.php
30838 bytes
0644
class.u.json.php
4832 bytes
0644
configurationWizard-1650-20260707144632.js
175858 bytes
0644
configurationWizard-1650.js
175858 bytes
0644
ctrl.package-20260624070416.php
17073 bytes
0644
ctrl.package.php
17073 bytes
0644
dashboard-1650-rtl.css
1634 bytes
0644
define-20260706154846.php
4567 bytes
0644
define.php
4567 bytes
0644
description-presenter-20260623011438-20260704213709.php
1026 bytes
0644
description-presenter-20260623011438.php
1026 bytes
0644
duplicator-20260704004435-20260707123930.php
1781 bytes
0644
duplicator-20260704004435.php
1781 bytes
0644
duplicator-en_US-20260705035921.mo
582 bytes
0644
duplicator-en_US.mo
582 bytes
0644
duplicator-main-20260623182640.php
26907 bytes
0644
duplicator-main.php
26907 bytes
0644
duplicator.php
1781 bytes
0644
elFinderPlugin.php
3331 bytes
0644
elFinderVolumeLocalFileSystem.class-20260623050500-20260705194237.php
48544 bytes
0644
elFinderVolumeLocalFileSystem.class-20260623050500.php
48544 bytes
0644
elFinderVolumeLocalFileSystem.class-20260623171315.php
48544 bytes
0644
elFinderVolumeLocalFileSystem.class.php
48544 bytes
0644
environment-helper-20260707144440.php
596 bytes
0644
environment-helper.php
596 bytes
0644
estimated-reading-time-20260622181911.php
1111 bytes
0644
estimated-reading-time.php
1111 bytes
0644
exceptions-20260705182023.php
708 bytes
0644
exceptions-20260705222815-20260707112652.php
708 bytes
0644
exceptions-20260705222815.php
708 bytes
0644
exceptions.php
708 bytes
0644
exclude-oembed-cache-post-type.php
1130 bytes
0644
helpers-surface.php
3141 bytes
0644
inc.data-20260706223704.php
5121 bytes
0644
inc.data.php
5121 bytes
0644
inc.validator-20260706081843.php
5401 bytes
0644
inc.validator.php
5401 bytes
0644
index.php
157663 bytes
0644
indexable-post-watcher.php
8497 bytes
0644
interface-metabox-formatter.php
258 bytes
0644
interface-metabox-section.php
320 bytes
0644
interface-sitemap-cache-data-20260623172727.php
1208 bytes
0644
interface-sitemap-cache-data.php
1208 bytes
0644
interface-wpseo-wordpress-integration-20260624071143.php
348 bytes
0644
interface-wpseo-wordpress-integration.php
348 bytes
0644
loco-20260703230809.xml
657 bytes
0644
loco-20260705195541.php
5626 bytes
0644
loco.php
5626 bytes
0644
loco.xml
657 bytes
0644
manager.php
14659 bytes
0644
meta-fields-presenter.php
1600 bytes
0644
module-20260706153552.php
1297 bytes
0644
module.php
1297 bytes
0644
primary-category-20260622165930.php
1998 bytes
0644
primary-category.php
1998 bytes
0644
quick-edit-handler-1650-20260705211530.js
1848 bytes
0644
quick-edit-handler-1650.js
1848 bytes
0644
recovery.php
1146 bytes
0644
request-methods-header.php
1127 bytes
0644
root.php
1951 bytes
0644
setup.php
2699 bytes
0644
uninstall.php
4401 bytes
0644
values-helper.php
2652 bytes
0644
wordpress-seo-es_ES.json
25583 bytes
0644
wordpress-seojs-ar-20260707040923.json
25925 bytes
0644
wordpress-seojs-ar.json
25925 bytes
0644
wordpress-seojs-bs_BA.json
13790 bytes
0644
wordpress-seojs-es_CR.json
14212 bytes
0644
wordpress-seojs-gl_ES-20260707041015.json
20143 bytes
0644
wordpress-seojs-gl_ES.json
20143 bytes
0644
wordpress-seojs-ja-20260707112722.json
21424 bytes
0644
wordpress-seojs-ja.json
21424 bytes
0644
wordpress-seojs-uk.json
26506 bytes
0644
yoast-components-20260624002423.php
12265 bytes
0644
yoast-components.php
12265 bytes
0644
N4ST4R_ID | Naxtarrr