Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closes #7246 3.19 - Preconnect to external domains - Beacon insertion part #7301

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
f204d60
:feat: Add preconnect external domains db structure :closes: #7248
Khadreal Feb 17, 2025
f57d4b1
:chore: Add ajax controller
Khadreal Feb 17, 2025
72829dd
Add subscriber, table to uninstallation process
Khadreal Feb 17, 2025
2356bb1
Add trait, update test
Khadreal Feb 18, 2025
aed491f
Add unit test
Khadreal Feb 18, 2025
b127b5a
Update integration test setup
Khadreal Feb 18, 2025
49f32e7
Update feature name
Khadreal Feb 18, 2025
7362b32
fixed php stan issue
Khadreal Feb 18, 2025
b693ee1
Add missing context class, subscriber class
Khadreal Feb 19, 2025
35c6fb4
Add unit test for context
Khadreal Feb 19, 2025
0b196d3
Add more test to improve codacy score
Khadreal Feb 19, 2025
14ed81c
:feat: Add factory class for service provider :closes: #7246
Khadreal Feb 13, 2025
bc3b51a
Add context for preconnect external domains
Khadreal Feb 13, 2025
3430936
Fixed php stan error -- #7246
Khadreal Feb 13, 2025
795fd1d
Add table, ajax controller to factory
Khadreal Feb 19, 2025
82dbe70
Add missing constructor argument
Khadreal Feb 19, 2025
ff2d0df
Add traits for query filter :sparkles:
Khadreal Feb 19, 2025
35b3987
Add test, fix php stan error
Khadreal Feb 19, 2025
5a74827
uncomment test data, fix lint
Khadreal Feb 19, 2025
af49943
remove debugging code
Khadreal Feb 19, 2025
b7d7412
clean up, add row and schema table
Khadreal Feb 19, 2025
5d1a868
Merge branch 'feature/7248-data-insertion-part' into feature/7246-bea…
Khadreal Feb 19, 2025
4f43fca
fixed code conflict
Khadreal Feb 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use WP_Rocket\Engine\Media\AboveTheFold\Activation\ActivationFactory as ATFActivationFactory;
use WP_Rocket\Engine\Optimization\LazyRenderContent\Activation\ActivationFactory as LRCActivationFactory;
use WP_Rocket\Engine\Optimization\LazyRenderContent\Context\Context as LRCContext;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Context\Context as PreconnectContext;

class ServiceProvider extends AbstractServiceProvider {
/**
Expand All @@ -30,6 +31,7 @@ class ServiceProvider extends AbstractServiceProvider {
'atf_activation_factory',
'lrc_context',
'lrc_activation_factory',
'preconnect_external_domains_context',
];

/**
Expand Down Expand Up @@ -68,6 +70,8 @@ public function register(): void {
]
);

$this->getContainer()->add( 'preconnect_external_domains_context', PreconnectContext::class );

$factories = [];

$atf_activation_factory = $this->getContainer()->get( 'atf_activation_factory' );
Expand Down
28 changes: 28 additions & 0 deletions inc/Engine/Common/PerformanceHints/Cron/CronTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php
declare(strict_types=1);

namespace WP_Rocket\Engine\Common\PerformanceHints\Cron;

trait CronTrait {
/**
* Performance Hints Deletion interval filter.
*
* @param string $filter_name The filter name.
*
* @return object
*/
public function deletion_interval( string $filter_name ): object {
/**
* Filters the interval (in months) to determine when a performance data entry is considered 'old'.
* Old performance entries are eligible for deletion. By default, a performance entry is considered old if it hasn't been accessed in the last month.
*
* @param int $delete_interval The interval in months after which a performance data entry is considered old. Default is 1 month.
*/
$delete_interval = wpm_apply_filters_typed( 'integer', $filter_name, 1 );
if ( $delete_interval <= 0 ) {
return $this->queries;
}

return $this->queries->set_cleanup_interval( $delete_interval );
}
}
1 change: 1 addition & 0 deletions inc/Engine/Common/PerformanceHints/ServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ public function register(): void {
$factory_array = [
$this->getContainer()->get( 'atf_factory' ),
$this->getContainer()->get( 'lrc_factory' ),
$this->getContainer()->get( 'preconnect_external_domains_factory' ),
];

foreach ( $factory_array as $factory ) {
Expand Down
120 changes: 120 additions & 0 deletions inc/Engine/Media/PreconnectExternalDomains/Factory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<?php
declare(strict_types=1);

namespace WP_Rocket\Engine\Media\PreconnectExternalDomains;

use WP_Rocket\Engine\Common\Context\ContextInterface;
use WP_Rocket\Engine\Common\PerformanceHints\AJAX\ControllerInterface as AjaxControllerInterface;
use WP_Rocket\Engine\Common\PerformanceHints\Cron\CronTrait;
use WP_Rocket\Engine\Common\PerformanceHints\Database\Queries\QueriesInterface;
use WP_Rocket\Engine\Common\PerformanceHints\Database\Table\TableInterface;
use WP_Rocket\Engine\Common\PerformanceHints\FactoryInterface;
use WP_Rocket\Engine\Common\PerformanceHints\Frontend\ControllerInterface as FrontendControllerInterface;

class Factory implements FactoryInterface {
use CronTrait;

/**
* Ajax Controller instance.
*
* @var AjaxControllerInterface
*/
protected $ajax_controller;

/**
* Frontend Controller instance.
*
* @var FrontendControllerInterface
*/
protected $frontend_controller;

/**
* Table instance.
*
* @var TableInterface
*/
protected $table;

/**
* Queries instance.
*
* @var QueriesInterface
*/
protected $queries;

/**
* Context instance.
*
* @var ContextInterface
*/
protected $context;

/**
* Instantiate the class.
*
* @param QueriesInterface $queries Preconnect external domains Queries instance.
* @param ContextInterface $context Preconnect external domains Context instance.
* @param AjaxControllerInterface $ajax_controller Preconnect external domains AJAX Controller instance.
* @param TableInterface $table Preconnect external domains Table instance.
* @param FrontendControllerInterface $frontend_controller Preconnect external domains Frontend Controller instance.
*/
public function __construct(
QueriesInterface $queries,
ContextInterface $context,
AjaxControllerInterface $ajax_controller,
TableInterface $table,
FrontendControllerInterface $frontend_controller
) {
$this->context = $context;
$this->queries = $queries;
$this->table = $table;
$this->ajax_controller = $ajax_controller;
$this->frontend_controller = $frontend_controller;
}

/**
* Provides an Ajax controller object.
*
* @return AjaxControllerInterface
*/
public function get_ajax_controller(): AjaxControllerInterface {
return $this->ajax_controller;
}

/**
* Provides a Frontend controller object.
*
* @return FrontendControllerInterface
*/
public function get_frontend_controller(): FrontendControllerInterface {
return $this->frontend_controller;
}

/**
* Provides a Table interface object.
*
* @return TableInterface
*/
public function table(): TableInterface {
return $this->table;
}

/**
* Provides a Queries object.
*
* @return QueriesInterface
*/
public function queries(): QueriesInterface {
// Defines the interval for deletion and returns Queries object.
return $this->deletion_interval( 'rocket_preconnect_external_domains_cleanup_interval' );
}

/**
* Provides Context object.
*
* @return ContextInterface
*/
public function get_context(): ContextInterface {
return $this->context;
}
}
71 changes: 71 additions & 0 deletions inc/Engine/Media/PreconnectExternalDomains/Frontend/Controller.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php
declare(strict_types=1);

namespace WP_Rocket\Engine\Media\PreconnectExternalDomains\Frontend;

use WP_Rocket\Admin\Options_Data;
use WP_Rocket\Engine\Common\PerformanceHints\Frontend\ControllerInterface;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Context\Context;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Database\Queries\PreconnectExternalDomains as PreconnectDomains;

class Controller implements ControllerInterface {
/**
* Options instance
*
* @var Options_Data
*/
private $options; // @phpstan-ignore-line Use of this will come later.

/**
* Queries instance
*
* @var PreconnectDomains
*/
private $query; // @phpstan-ignore-line Use of this will come later.

/**
* Context instance.
*
* @var Context
*/
private $context; // @phpstan-ignore-line Use of this will come later.

/**
* Constructor
*
* @param Options_Data $options Options instance.
* @param PreconnectDomains $query Queries instance.
* @param Context $context Context instance.
*/
public function __construct( Options_Data $options, PreconnectDomains $query, Context $context ) {
$this->options = $options;
$this->query = $query;
$this->context = $context;
}

/**
* Applies preconnect domains optimization.
*
* @param string $html HTML content.
* @param object $row Database row.
* @return string
*/
public function optimize( string $html, $row ): string {
if ( ! $row->has_preconnect_external_domains() ) {
return $html;
}

return $html;
}

/**
* Add custom data like the List of elements to be considered for optimization.
*
* @param array $data Array of data passed in beacon.
*
* @return array
*/
public function add_custom_data( array $data ): array {
return $data;
}
}
24 changes: 23 additions & 1 deletion inc/Engine/Media/PreconnectExternalDomains/ServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Database\Queries\PreconnectExternalDomains as Query;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\AJAX\Controller as AJAXController;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Database\Table\PreconnectExternalDomains as PreconnectTable;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Frontend\Subscriber as FrontendSubscriber;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Frontend\{Controller as FrontController, Subscriber as FrontendSubscriber};

class ServiceProvider extends AbstractServiceProvider {
/**
Expand All @@ -26,6 +26,8 @@ class ServiceProvider extends AbstractServiceProvider {
'preconnect_external_domains_ajax_controller',
'preconnect_frontend_subscriber',
'preconnect_external_domains_table',
'preconnect_external_domains_factory',
'preconnect_external_domains_controller',
];

/**
Expand Down Expand Up @@ -65,5 +67,25 @@ public function register(): void {
);

$this->getContainer()->addShared( 'preconnect_frontend_subscriber', FrontendSubscriber::class );

$this->getContainer()->add( 'preconnect_external_domains_controller', FrontController::class )
->addArguments(
[
$this->getContainer()->get( 'options' ),
$this->getContainer()->get( 'preconnect_external_domains_query' ),
$this->getContainer()->get( 'preconnect_external_domains_context' ),
]
);

$this->getContainer()->addShared( 'preconnect_external_domains_factory', Factory::class )
->addArguments(
[
$this->getContainer()->get( 'preconnect_external_domains_query' ),
$this->getContainer()->get( 'preconnect_external_domains_context' ),
$this->getContainer()->get( 'preconnect_external_domains_ajax_controller' ),
$this->getContainer()->get( 'preconnect_external_domains_table' ),
$this->getContainer()->get( 'preconnect_external_domains_controller' ),
]
);
}
}
Loading
Loading