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

namespace Yoast\WP\SEO\Introductions\Application;

use 
Yoast\WP\SEO\Introductions\Domain\Introduction_Interface;
use 
Yoast\WP\SEO\Introductions\Domain\Introduction_Item;
use 
Yoast\WP\SEO\Introductions\Domain\Introductions_Bucket;
use 
Yoast\WP\SEO\Introductions\Infrastructure\Introductions_Seen_Repository;

/**
 * Manages the collection of introductions.
 */
class Introductions_Collector {

    
/**
     * Holds all the introductions.
     *
     * @var Introduction_Interface[]
     */
    
private $introductions;

    
/**
     * Constructs the collector.
     *
     * @param Introduction_Interface ...$introductions All the introductions.
     */
    
public function __constructIntroduction_Interface ...$introductions ) {
        
$this->introductions $this->add_introductions( ...$introductions );
    }

    
/**
     * Gets the data for the introductions.
     *
     * @param int $user_id The user ID.
     *
     * @return array The list of introductions.
     */
    
public function get_for$user_id ) {
        
$bucket   = new Introductions_Bucket();
        
$metadata $this->get_metadata$user_id );

        foreach ( 
$this->introductions as $introduction ) {
            if ( ! 
$introduction->should_show() ) {
                continue;
            }
            if ( 
$this->is_seen$introduction->get_id(), $metadata ) ) {
                continue;
            }
            
$bucket->add_introduction(
                new 
Introduction_Item$introduction->get_id(), $introduction->get_priority() )
            );
        }

        return 
$bucket->to_array();
    }

    
/**
     * Filters introductions with the 'wpseo_introductions' filter.
     *
     * @param Introduction_Interface ...$introductions The introductions.
     *
     * @return Introduction_Interface[]
     */
    
private function add_introductionsIntroduction_Interface ...$introductions ) {
        
/**
         * Filter: Adds the possibility to add additional introductions to be included.
         *
         * @internal
         *
         * @param Introduction_Interface $introductions This filter expects a list of Introduction_Interface instances and
         *                                              expects only Introduction_Interface implementations to be added to the list.
         */
        
$filtered_introductions = (array) \apply_filters'wpseo_introductions'$introductions );

        return 
\array_filter(
            
$filtered_introductions,
            static function ( 
$introduction ) {
                return 
\is_a$introductionIntroduction_Interface::class );
            }
        );
    }

    
/**
     * Retrieves the introductions metadata for the user.
     *
     * @param int $user_id The user ID.
     *
     * @return array The introductions' metadata.
     */
    
private function get_metadata$user_id ) {
        
$metadata \get_user_meta$user_idIntroductions_Seen_Repository::USER_META_KEYtrue );
        if ( 
\is_array$metadata ) ) {
            return 
$metadata;
        }

        return [];
    }

    
/**
     * Determines whether the user has seen the introduction.
     *
     * @param string   $name     The name.
     * @param string[] $metadata The metadata.
     *
     * @return bool Whether the user has seen the introduction.
     */
    
private function is_seen$name$metadata ) {
        if ( 
\array_key_exists$name$metadata ) ) {
            return (bool) 
$metadata$name ];
        }

        return 
false;
    }

    
/**
     * Checks if the given introduction ID is a known ID to the system.
     *
     * @param string $introduction_id The introduction ID to check.
     *
     * @return bool
     */
    
public function is_available_introductionstring $introduction_id ): bool {
        foreach ( 
$this->introductions as $introduction ) {
            if ( 
$introduction->get_id() === $introduction_id ) {
                return 
true;
            }
        }

        return 
false;
    }
}