• File: indexable-helper.php
  • Full Path: /home/matthif/www/wp-content/plugins/wordpress-seo/src/helpers/indexable-helper.php
  • Date Modified: 02/24/2024 11:29 PM
  • File size: 7.14 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

namespace Yoast\WP\SEO\Helpers;

use 
Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Indexation_Action;
use 
Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Type_Archive_Indexation_Action;
use 
Yoast\WP\SEO\Actions\Indexing\Indexable_Term_Indexation_Action;
use 
Yoast\WP\SEO\Config\Indexing_Reasons;
use 
Yoast\WP\SEO\Models\Indexable;
use 
Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * A helper object for indexables.
 */
class Indexable_Helper {

    
/**
     * Represents the indexable repository.
     *
     * @var Indexable_Repository
     */
    
protected $repository;

    
/**
     * Represents the options helper.
     *
     * @var Options_Helper
     */
    
protected $options_helper;

    
/**
     * Represents the environment helper.
     *
     * @var Environment_Helper
     */
    
protected $environment_helper;

    
/**
     * Represents the indexing helper.
     *
     * @var Indexing_Helper
     */
    
protected $indexing_helper;

    
/**
     * Default values of certain columns.
     *
     * @var array
     */
    
protected $default_values = [
        
'title'                  => [
            
'default_value'   => null,
        ],
        
'description'            => [
            
'default_value'   => null,
        ],
        
'open_graph_title'       => [
            
'default_value'   => null,
        ],
        
'open_graph_description' => [
            
'default_value'   => null,
        ],
        
'twitter_title'          => [
            
'default_value'   => null,
        ],
        
'twitter_description'    => [
            
'default_value'   => null,
        ],
        
'canonical'              => [
            
'default_value'   => null,
        ],
        
'primary_focus_keyword'  => [
            
'default_value'   => null,
        ],
        
'is_robots_noindex'      => [
            
'default_value'   => null,
        ],
        
'is_robots_nofollow'     => [
            
'default_value'   => false,
        ],
        
'is_robots_noarchive'    => [
            
'default_value'   => null,
        ],
        
'is_robots_noimageindex' => [
            
'default_value'   => null,
        ],
        
'is_robots_nosnippet'    => [
            
'default_value'   => null,
        ],
    ];

    
/**
     * Indexable_Helper constructor.
     *
     * @param Options_Helper     $options_helper     The options helper.
     * @param Environment_Helper $environment_helper The environment helper.
     * @param Indexing_Helper    $indexing_helper    The indexing helper.
     */
    
public function __constructOptions_Helper $options_helperEnvironment_Helper $environment_helperIndexing_Helper $indexing_helper ) {
        
$this->options_helper     $options_helper;
        
$this->environment_helper $environment_helper;
        
$this->indexing_helper    $indexing_helper;
    }

    
/**
     * Sets the indexable repository. Done to avoid circular dependencies.
     *
     * @required
     *
     * @param Indexable_Repository $repository The indexable repository.
     *
     * @return void
     */
    
public function set_indexable_repositoryIndexable_Repository $repository ) {
        
$this->repository $repository;
    }

    
/**
     * Returns the page type of an indexable.
     *
     * @param Indexable $indexable The indexable.
     *
     * @return string|false The page type. False if it could not be determined.
     */
    
public function get_page_type_for_indexable$indexable ) {
        switch ( 
$indexable->object_type ) {
            case 
'post':
                
$front_page_id = (int) \get_option'page_on_front' );
                if ( 
$indexable->object_id === $front_page_id ) {
                    return 
'Static_Home_Page';
                }
                
$posts_page_id = (int) \get_option'page_for_posts' );
                if ( 
$indexable->object_id === $posts_page_id ) {
                    return 
'Static_Posts_Page';
                }

                return 
'Post_Type';
            case 
'term':
                return 
'Term_Archive';
            case 
'user':
                return 
'Author_Archive';
            case 
'home-page':
                return 
'Home_Page';
            case 
'post-type-archive':
                return 
'Post_Type_Archive';
            case 
'date-archive':
                return 
'Date_Archive';
            case 
'system-page':
                if ( 
$indexable->object_sub_type === 'search-result' ) {
                    return 
'Search_Result_Page';
                }
                if ( 
$indexable->object_sub_type === '404' ) {
                    return 
'Error_Page';
                }
        }

        return 
false;
    }

    
/**
     * Resets the permalinks of the indexables.
     *
     * @param string|null $type    The type of the indexable.
     * @param string|null $subtype The subtype. Can be null.
     * @param string      $reason  The reason that the permalink has been changed.
     *
     * @return void
     */
    
public function reset_permalink_indexables$type null$subtype null$reason Indexing_Reasons::REASON_PERMALINK_SETTINGS ) {
        
$result $this->repository->reset_permalink$type$subtype );

        
$this->indexing_helper->set_reason$reason );

        if ( 
$result !== false && $result ) {
            
\delete_transientIndexable_Post_Indexation_Action::UNINDEXED_COUNT_TRANSIENT );
            
\delete_transientIndexable_Post_Type_Archive_Indexation_Action::UNINDEXED_COUNT_TRANSIENT );
            
\delete_transientIndexable_Term_Indexation_Action::UNINDEXED_COUNT_TRANSIENT );
        }
    }

    
/**
     * Determines whether indexing indexables is appropriate at this time.
     *
     * @return bool Whether the indexables should be indexed.
     */
    
public function should_index_indexables() {
        
// Currently, the only reason to index is when we're on a production website.
        
$should_index $this->environment_helper->is_production_mode();

        
/**
         * Filter: 'Yoast\WP\SEO\should_index_indexables' - Allow developers to enable / disable
         * creating indexables. Warning: overriding
         * the intended action may cause problems when moving from a staging to a
         * production environment because indexable permalinks may get set incorrectly.
         *
         * @since 18.2
         *
         * @param bool $should_index Whether the site's indexables should be created.
         */
        
return (bool) \apply_filters'Yoast\WP\SEO\should_index_indexables'$should_index );
    }

    
/**
     * Returns whether or not dynamic permalinks should be used.
     *
     * @return bool Whether or not the dynamic permalinks should be used.
     */
    
public function dynamic_permalinks_enabled() {
        
/**
         * Filters the value of the `dynamic_permalinks` option.
         *
         * @param bool $value The value of the `dynamic_permalinks` option.
         */
        
return (bool) \apply_filters'wpseo_dynamic_permalinks_enabled'$this->options_helper->get'dynamic_permalinks'false ) );
    }

    
/**
     * Sets a boolean to indicate that the indexing of the indexables has completed.
     *
     * @return void
     */
    
public function finish_indexing() {
        
$this->options_helper->set'indexables_indexing_completed'true );
    }

    
/**
     * Checks whether the indexable has default values in given fields.
     *
     * @param Indexable $indexable The Yoast indexable that we're checking.
     * @param array     $fields    The Yoast indexable fields that we're checking against.
     *
     * @return bool Whether the indexable has default values.
     */
    
public function check_if_default_indexable$indexable$fields ) {
        foreach ( 
$fields as $field ) {
            
$is_default $this->check_if_default_field$indexable$field );
            if ( ! 
$is_default ) {
                break;
            }
        }

        return 
$is_default;
    }

    
/**
     * Checks if an indexable field contains the default value.
     *
     * @param Indexable $indexable The Yoast indexable that we're checking.
     * @param string    $field     The field that we're checking.
     *
     * @return bool True if default value.
     */
    
public function check_if_default_field$indexable$field ) {
        
$defaults $this->default_values;
        if ( ! isset( 
$defaults$field ] ) ) {
            return 
false;
        }

        if ( 
$indexable->$field === $defaults$field ]['default_value'] ) {
            return 
true;
        }

        return 
false;
    }
}