Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93
/home/sportsfe.../httpdocs/wp-conte.../plugins/wordpres.../src/integrat.../admin
File: helpscout-beacon.php
<?php
[0] Fix | Delete
[1] Fix | Delete
namespace Yoast\WP\SEO\Integrations\Admin;
[2] Fix | Delete
[3] Fix | Delete
use WPSEO_Addon_Manager;
[4] Fix | Delete
use WPSEO_Admin_Asset_Manager;
[5] Fix | Delete
use WPSEO_Tracking_Server_Data;
[6] Fix | Delete
use WPSEO_Utils;
[7] Fix | Delete
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
[8] Fix | Delete
use Yoast\WP\SEO\Config\Migration_Status;
[9] Fix | Delete
use Yoast\WP\SEO\Helpers\Options_Helper;
[10] Fix | Delete
use Yoast\WP\SEO\Integrations\Academy_Integration;
[11] Fix | Delete
use Yoast\WP\SEO\Integrations\Integration_Interface;
[12] Fix | Delete
use Yoast\WP\SEO\Integrations\Settings_Integration;
[13] Fix | Delete
use Yoast\WP\SEO\Integrations\Support_Integration;
[14] Fix | Delete
[15] Fix | Delete
/**
[16] Fix | Delete
* Class WPSEO_HelpScout
[17] Fix | Delete
*/
[18] Fix | Delete
class HelpScout_Beacon implements Integration_Interface {
[19] Fix | Delete
[20] Fix | Delete
/**
[21] Fix | Delete
* The id for the beacon.
[22] Fix | Delete
*
[23] Fix | Delete
* @var string
[24] Fix | Delete
*/
[25] Fix | Delete
protected $beacon_id = '2496aba6-0292-489c-8f5d-1c0fba417c2f';
[26] Fix | Delete
[27] Fix | Delete
/**
[28] Fix | Delete
* The id for the beacon for users that have tracking on.
[29] Fix | Delete
*
[30] Fix | Delete
* @var string
[31] Fix | Delete
*/
[32] Fix | Delete
protected $beacon_id_tracking_users = '6b8e74c5-aa81-4295-b97b-c2a62a13ea7f';
[33] Fix | Delete
[34] Fix | Delete
/**
[35] Fix | Delete
* The products the beacon is loaded for.
[36] Fix | Delete
*
[37] Fix | Delete
* @var array
[38] Fix | Delete
*/
[39] Fix | Delete
protected $products = [];
[40] Fix | Delete
[41] Fix | Delete
/**
[42] Fix | Delete
* Whether to ask the user's consent before loading in HelpScout.
[43] Fix | Delete
*
[44] Fix | Delete
* @var bool
[45] Fix | Delete
*/
[46] Fix | Delete
protected $ask_consent = true;
[47] Fix | Delete
[48] Fix | Delete
/**
[49] Fix | Delete
* The options helper.
[50] Fix | Delete
*
[51] Fix | Delete
* @var Options_Helper
[52] Fix | Delete
*/
[53] Fix | Delete
protected $options;
[54] Fix | Delete
[55] Fix | Delete
/**
[56] Fix | Delete
* The array of pages we need to show the beacon on with their respective beacon IDs.
[57] Fix | Delete
*
[58] Fix | Delete
* @var array
[59] Fix | Delete
*/
[60] Fix | Delete
protected $pages_ids;
[61] Fix | Delete
[62] Fix | Delete
/**
[63] Fix | Delete
* The array of pages we need to show the beacon on.
[64] Fix | Delete
*
[65] Fix | Delete
* @var array
[66] Fix | Delete
*/
[67] Fix | Delete
protected $base_pages = [
[68] Fix | Delete
'wpseo_dashboard',
[69] Fix | Delete
Settings_Integration::PAGE,
[70] Fix | Delete
Academy_Integration::PAGE,
[71] Fix | Delete
Support_Integration::PAGE,
[72] Fix | Delete
'wpseo_search_console',
[73] Fix | Delete
'wpseo_tools',
[74] Fix | Delete
'wpseo_licenses',
[75] Fix | Delete
'wpseo_workouts',
[76] Fix | Delete
'wpseo_integrations',
[77] Fix | Delete
];
[78] Fix | Delete
[79] Fix | Delete
/**
[80] Fix | Delete
* The current admin page
[81] Fix | Delete
*
[82] Fix | Delete
* @var string|null
[83] Fix | Delete
*/
[84] Fix | Delete
protected $page;
[85] Fix | Delete
[86] Fix | Delete
/**
[87] Fix | Delete
* The asset manager.
[88] Fix | Delete
*
[89] Fix | Delete
* @var WPSEO_Admin_Asset_Manager
[90] Fix | Delete
*/
[91] Fix | Delete
protected $asset_manager;
[92] Fix | Delete
[93] Fix | Delete
/**
[94] Fix | Delete
* The migration status object.
[95] Fix | Delete
*
[96] Fix | Delete
* @var Migration_Status
[97] Fix | Delete
*/
[98] Fix | Delete
protected $migration_status;
[99] Fix | Delete
[100] Fix | Delete
/**
[101] Fix | Delete
* Headless_Rest_Endpoints_Enabled_Conditional constructor.
[102] Fix | Delete
*
[103] Fix | Delete
* @param Options_Helper $options The options helper.
[104] Fix | Delete
* @param WPSEO_Admin_Asset_Manager $asset_manager The asset manager.
[105] Fix | Delete
* @param Migration_Status $migration_status The migrations status.
[106] Fix | Delete
*/
[107] Fix | Delete
public function __construct( Options_Helper $options, WPSEO_Admin_Asset_Manager $asset_manager, Migration_Status $migration_status ) {
[108] Fix | Delete
$this->options = $options;
[109] Fix | Delete
$this->asset_manager = $asset_manager;
[110] Fix | Delete
$this->ask_consent = ! $this->options->get( 'tracking' );
[111] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
[112] Fix | Delete
if ( isset( $_GET['page'] ) && \is_string( $_GET['page'] ) ) {
[113] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
[114] Fix | Delete
$this->page = \sanitize_text_field( \wp_unslash( $_GET['page'] ) );
[115] Fix | Delete
}
[116] Fix | Delete
else {
[117] Fix | Delete
$this->page = null;
[118] Fix | Delete
}
[119] Fix | Delete
$this->migration_status = $migration_status;
[120] Fix | Delete
[121] Fix | Delete
foreach ( $this->base_pages as $page ) {
[122] Fix | Delete
if ( $this->ask_consent ) {
[123] Fix | Delete
// We want to be able to show surveys to people who have tracking on, so we give them a different beacon.
[124] Fix | Delete
$this->pages_ids[ $page ] = $this->beacon_id_tracking_users;
[125] Fix | Delete
}
[126] Fix | Delete
else {
[127] Fix | Delete
$this->pages_ids[ $page ] = $this->beacon_id;
[128] Fix | Delete
}
[129] Fix | Delete
}
[130] Fix | Delete
}
[131] Fix | Delete
[132] Fix | Delete
/**
[133] Fix | Delete
* {@inheritDoc}
[134] Fix | Delete
*/
[135] Fix | Delete
public function register_hooks() {
[136] Fix | Delete
\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_help_scout_script' ] );
[137] Fix | Delete
\add_action( 'admin_footer', [ $this, 'output_beacon_js' ] );
[138] Fix | Delete
}
[139] Fix | Delete
[140] Fix | Delete
/**
[141] Fix | Delete
* Enqueues the HelpScout script.
[142] Fix | Delete
*
[143] Fix | Delete
* @return void
[144] Fix | Delete
*/
[145] Fix | Delete
public function enqueue_help_scout_script() {
[146] Fix | Delete
// Make sure plugins can filter in their "stuff", before we check whether we're outputting a beacon.
[147] Fix | Delete
$this->filter_settings();
[148] Fix | Delete
if ( ! $this->is_beacon_page() ) {
[149] Fix | Delete
return;
[150] Fix | Delete
}
[151] Fix | Delete
[152] Fix | Delete
$this->asset_manager->enqueue_script( 'help-scout-beacon' );
[153] Fix | Delete
}
[154] Fix | Delete
[155] Fix | Delete
/**
[156] Fix | Delete
* Outputs a small piece of javascript for the beacon.
[157] Fix | Delete
*
[158] Fix | Delete
* @return void
[159] Fix | Delete
*/
[160] Fix | Delete
public function output_beacon_js() {
[161] Fix | Delete
if ( ! $this->is_beacon_page() ) {
[162] Fix | Delete
return;
[163] Fix | Delete
}
[164] Fix | Delete
[165] Fix | Delete
\printf(
[166] Fix | Delete
'<script type="text/javascript">window.%1$s(\'%2$s\', %3$s)</script>',
[167] Fix | Delete
( $this->ask_consent ) ? 'wpseoHelpScoutBeaconConsent' : 'wpseoHelpScoutBeacon',
[168] Fix | Delete
\esc_html( $this->pages_ids[ $this->page ] ),
[169] Fix | Delete
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- escaping done in format_json_encode.
[170] Fix | Delete
WPSEO_Utils::format_json_encode( (array) $this->get_session_data() )
[171] Fix | Delete
);
[172] Fix | Delete
}
[173] Fix | Delete
[174] Fix | Delete
/**
[175] Fix | Delete
* Checks if the current page is a page containing the beacon.
[176] Fix | Delete
*
[177] Fix | Delete
* @return bool
[178] Fix | Delete
*/
[179] Fix | Delete
private function is_beacon_page() {
[180] Fix | Delete
$return = false;
[181] Fix | Delete
if ( ! empty( $this->page ) && $GLOBALS['pagenow'] === 'admin.php' && isset( $this->pages_ids[ $this->page ] ) ) {
[182] Fix | Delete
$return = true;
[183] Fix | Delete
}
[184] Fix | Delete
[185] Fix | Delete
/**
[186] Fix | Delete
* Filter: 'wpseo_helpscout_show_beacon' - Allows overriding whether we show the HelpScout beacon.
[187] Fix | Delete
*
[188] Fix | Delete
* @param bool $show_beacon Whether we show the beacon or not.
[189] Fix | Delete
*/
[190] Fix | Delete
return \apply_filters( 'wpseo_helpscout_show_beacon', $return );
[191] Fix | Delete
}
[192] Fix | Delete
[193] Fix | Delete
/**
[194] Fix | Delete
* Retrieves the identifying data.
[195] Fix | Delete
*
[196] Fix | Delete
* @return string The data to pass as identifying data.
[197] Fix | Delete
*/
[198] Fix | Delete
protected function get_session_data() {
[199] Fix | Delete
// Short-circuit if we can get the needed data from a transient.
[200] Fix | Delete
$transient_data = \get_transient( 'yoast_beacon_session_data' );
[201] Fix | Delete
[202] Fix | Delete
if ( \is_array( $transient_data ) ) {
[203] Fix | Delete
return WPSEO_Utils::format_json_encode( $transient_data );
[204] Fix | Delete
}
[205] Fix | Delete
[206] Fix | Delete
$current_user = \wp_get_current_user();
[207] Fix | Delete
[208] Fix | Delete
// Do not make these strings translatable! They are for our support agents, the user won't see them!
[209] Fix | Delete
$data = \array_merge(
[210] Fix | Delete
[
[211] Fix | Delete
'name' => \trim( $current_user->user_firstname . ' ' . $current_user->user_lastname ),
[212] Fix | Delete
'email' => $current_user->user_email,
[213] Fix | Delete
'Languages' => $this->get_language_settings(),
[214] Fix | Delete
],
[215] Fix | Delete
$this->get_server_info(),
[216] Fix | Delete
[
[217] Fix | Delete
'WordPress Version' => $this->get_wordpress_version(),
[218] Fix | Delete
'Active theme' => $this->get_theme_info(),
[219] Fix | Delete
'Active plugins' => $this->get_active_plugins(),
[220] Fix | Delete
'Must-use and dropins' => $this->get_mustuse_and_dropins(),
[221] Fix | Delete
'Indexables status' => $this->get_indexables_status(),
[222] Fix | Delete
]
[223] Fix | Delete
);
[224] Fix | Delete
[225] Fix | Delete
if ( ! empty( $this->products ) ) {
[226] Fix | Delete
$addon_manager = new WPSEO_Addon_Manager();
[227] Fix | Delete
foreach ( $this->products as $product ) {
[228] Fix | Delete
$subscription = $addon_manager->get_subscription( $product );
[229] Fix | Delete
[230] Fix | Delete
if ( ! $subscription ) {
[231] Fix | Delete
continue;
[232] Fix | Delete
}
[233] Fix | Delete
[234] Fix | Delete
$data[ $subscription->product->name ] = $this->get_product_info( $subscription );
[235] Fix | Delete
}
[236] Fix | Delete
}
[237] Fix | Delete
[238] Fix | Delete
// Store the data in a transient for 5 minutes to prevent overhead on every backend pageload.
[239] Fix | Delete
\set_transient( 'yoast_beacon_session_data', $data, ( 5 * \MINUTE_IN_SECONDS ) );
[240] Fix | Delete
[241] Fix | Delete
return WPSEO_Utils::format_json_encode( $data );
[242] Fix | Delete
}
[243] Fix | Delete
[244] Fix | Delete
/**
[245] Fix | Delete
* Returns basic info about the server software.
[246] Fix | Delete
*
[247] Fix | Delete
* @return array
[248] Fix | Delete
*/
[249] Fix | Delete
private function get_server_info() {
[250] Fix | Delete
$server_tracking_data = new WPSEO_Tracking_Server_Data();
[251] Fix | Delete
$server_data = $server_tracking_data->get();
[252] Fix | Delete
$server_data = $server_data['server'];
[253] Fix | Delete
[254] Fix | Delete
$fields_to_use = [
[255] Fix | Delete
'Server IP' => 'ip',
[256] Fix | Delete
'PHP Version' => 'PhpVersion',
[257] Fix | Delete
'cURL Version' => 'CurlVersion',
[258] Fix | Delete
];
[259] Fix | Delete
[260] Fix | Delete
$server_data['CurlVersion'] = $server_data['CurlVersion']['version'] . ' (SSL Support ' . $server_data['CurlVersion']['sslSupport'] . ')';
[261] Fix | Delete
[262] Fix | Delete
$server_info = [];
[263] Fix | Delete
[264] Fix | Delete
foreach ( $fields_to_use as $label => $field_to_use ) {
[265] Fix | Delete
if ( isset( $server_data[ $field_to_use ] ) ) {
[266] Fix | Delete
$server_info[ $label ] = \esc_html( $server_data[ $field_to_use ] );
[267] Fix | Delete
}
[268] Fix | Delete
}
[269] Fix | Delete
[270] Fix | Delete
// Get the memory limits for the server and, if different, from WordPress as well.
[271] Fix | Delete
$memory_limit = \ini_get( 'memory_limit' );
[272] Fix | Delete
$server_info['Memory limits'] = 'Server memory limit: ' . $memory_limit;
[273] Fix | Delete
[274] Fix | Delete
if ( $memory_limit !== \WP_MEMORY_LIMIT ) {
[275] Fix | Delete
$server_info['Memory limits'] .= ', WP_MEMORY_LIMIT: ' . \WP_MEMORY_LIMIT;
[276] Fix | Delete
}
[277] Fix | Delete
[278] Fix | Delete
if ( $memory_limit !== \WP_MAX_MEMORY_LIMIT ) {
[279] Fix | Delete
$server_info['Memory limits'] .= ', WP_MAX_MEMORY_LIMIT: ' . \WP_MAX_MEMORY_LIMIT;
[280] Fix | Delete
}
[281] Fix | Delete
[282] Fix | Delete
return $server_info;
[283] Fix | Delete
}
[284] Fix | Delete
[285] Fix | Delete
/**
[286] Fix | Delete
* Returns info about the Yoast SEO plugin version and license.
[287] Fix | Delete
*
[288] Fix | Delete
* @param object $plugin The plugin.
[289] Fix | Delete
*
[290] Fix | Delete
* @return string The product info.
[291] Fix | Delete
*/
[292] Fix | Delete
private function get_product_info( $plugin ) {
[293] Fix | Delete
if ( empty( $plugin ) ) {
[294] Fix | Delete
return '';
[295] Fix | Delete
}
[296] Fix | Delete
[297] Fix | Delete
$product_info = \sprintf(
[298] Fix | Delete
'Expiration date %1$s',
[299] Fix | Delete
$plugin->expiry_date
[300] Fix | Delete
);
[301] Fix | Delete
[302] Fix | Delete
return $product_info;
[303] Fix | Delete
}
[304] Fix | Delete
[305] Fix | Delete
/**
[306] Fix | Delete
* Returns the WordPress version + a suffix about the multisite status.
[307] Fix | Delete
*
[308] Fix | Delete
* @return string The WordPress version string.
[309] Fix | Delete
*/
[310] Fix | Delete
private function get_wordpress_version() {
[311] Fix | Delete
global $wp_version;
[312] Fix | Delete
[313] Fix | Delete
$wordpress_version = $wp_version;
[314] Fix | Delete
if ( \is_multisite() ) {
[315] Fix | Delete
$wordpress_version .= ' (multisite: yes)';
[316] Fix | Delete
}
[317] Fix | Delete
else {
[318] Fix | Delete
$wordpress_version .= ' (multisite: no)';
[319] Fix | Delete
}
[320] Fix | Delete
[321] Fix | Delete
return $wordpress_version;
[322] Fix | Delete
}
[323] Fix | Delete
[324] Fix | Delete
/**
[325] Fix | Delete
* Returns information about the current theme.
[326] Fix | Delete
*
[327] Fix | Delete
* @return string The theme info as string.
[328] Fix | Delete
*/
[329] Fix | Delete
private function get_theme_info() {
[330] Fix | Delete
$theme = \wp_get_theme();
[331] Fix | Delete
[332] Fix | Delete
$theme_info = \sprintf(
[333] Fix | Delete
'%1$s (Version %2$s, %3$s)',
[334] Fix | Delete
\esc_html( $theme->display( 'Name' ) ),
[335] Fix | Delete
\esc_html( $theme->display( 'Version' ) ),
[336] Fix | Delete
\esc_attr( $theme->display( 'ThemeURI' ) )
[337] Fix | Delete
);
[338] Fix | Delete
[339] Fix | Delete
if ( \is_child_theme() ) {
[340] Fix | Delete
$theme_info .= \sprintf( ', this is a child theme of: %1$s', \esc_html( $theme->display( 'Template' ) ) );
[341] Fix | Delete
}
[342] Fix | Delete
[343] Fix | Delete
return $theme_info;
[344] Fix | Delete
}
[345] Fix | Delete
[346] Fix | Delete
/**
[347] Fix | Delete
* Returns a stringified list of all active plugins, separated by a pipe.
[348] Fix | Delete
*
[349] Fix | Delete
* @return string The active plugins.
[350] Fix | Delete
*/
[351] Fix | Delete
private function get_active_plugins() {
[352] Fix | Delete
$updates_available = \get_site_transient( 'update_plugins' );
[353] Fix | Delete
[354] Fix | Delete
$active_plugins = '';
[355] Fix | Delete
foreach ( \wp_get_active_and_valid_plugins() as $plugin ) {
[356] Fix | Delete
$plugin_data = \get_plugin_data( $plugin );
[357] Fix | Delete
$plugin_file = \str_replace( \trailingslashit( \WP_PLUGIN_DIR ), '', $plugin );
[358] Fix | Delete
$plugin_update_available = '';
[359] Fix | Delete
[360] Fix | Delete
if ( isset( $updates_available->response[ $plugin_file ] ) ) {
[361] Fix | Delete
$plugin_update_available = ' [update available]';
[362] Fix | Delete
}
[363] Fix | Delete
[364] Fix | Delete
$active_plugins .= \sprintf(
[365] Fix | Delete
'%1$s (Version %2$s%3$s, %4$s) | ',
[366] Fix | Delete
\esc_html( $plugin_data['Name'] ),
[367] Fix | Delete
\esc_html( $plugin_data['Version'] ),
[368] Fix | Delete
$plugin_update_available,
[369] Fix | Delete
\esc_attr( $plugin_data['PluginURI'] )
[370] Fix | Delete
);
[371] Fix | Delete
}
[372] Fix | Delete
[373] Fix | Delete
return $active_plugins;
[374] Fix | Delete
}
[375] Fix | Delete
[376] Fix | Delete
/**
[377] Fix | Delete
* Returns a CSV list of all must-use and drop-in plugins.
[378] Fix | Delete
*
[379] Fix | Delete
* @return string The active plugins.
[380] Fix | Delete
*/
[381] Fix | Delete
private function get_mustuse_and_dropins() {
[382] Fix | Delete
$dropins = \get_dropins();
[383] Fix | Delete
$mustuse_plugins = \get_mu_plugins();
[384] Fix | Delete
[385] Fix | Delete
if ( ! \is_array( $dropins ) ) {
[386] Fix | Delete
$dropins = [];
[387] Fix | Delete
}
[388] Fix | Delete
[389] Fix | Delete
if ( ! \is_array( $mustuse_plugins ) ) {
[390] Fix | Delete
$mustuse_plugins = [];
[391] Fix | Delete
}
[392] Fix | Delete
[393] Fix | Delete
return \sprintf( 'Must-Use plugins: %1$d, Drop-ins: %2$d', \count( $mustuse_plugins ), \count( $dropins ) );
[394] Fix | Delete
}
[395] Fix | Delete
[396] Fix | Delete
/**
[397] Fix | Delete
* Return the indexables status details.
[398] Fix | Delete
*
[399] Fix | Delete
* @return string The indexables status in a string.
[400] Fix | Delete
*/
[401] Fix | Delete
private function get_indexables_status() {
[402] Fix | Delete
$indexables_status = 'Indexing completed: ';
[403] Fix | Delete
$indexing_completed = $this->options->get( 'indexables_indexing_completed' );
[404] Fix | Delete
$indexing_reason = $this->options->get( 'indexing_reason' );
[405] Fix | Delete
[406] Fix | Delete
$indexables_status .= ( $indexing_completed ) ? 'yes' : 'no';
[407] Fix | Delete
$indexables_status .= ( $indexing_reason ) ? ', latest indexing reason: ' . \esc_html( $indexing_reason ) : '';
[408] Fix | Delete
[409] Fix | Delete
foreach ( [ 'free', 'premium' ] as $migration_name ) {
[410] Fix | Delete
$current_status = $this->migration_status->get_error( $migration_name );
[411] Fix | Delete
[412] Fix | Delete
if ( \is_array( $current_status ) && isset( $current_status['message'] ) ) {
[413] Fix | Delete
$indexables_status .= ', migration error: ' . \esc_html( $current_status['message'] );
[414] Fix | Delete
}
[415] Fix | Delete
}
[416] Fix | Delete
[417] Fix | Delete
return $indexables_status;
[418] Fix | Delete
}
[419] Fix | Delete
[420] Fix | Delete
/**
[421] Fix | Delete
* Returns language settings for the website and the current user.
[422] Fix | Delete
*
[423] Fix | Delete
* @return string The locale settings of the site and user.
[424] Fix | Delete
*/
[425] Fix | Delete
private function get_language_settings() {
[426] Fix | Delete
$site_locale = \get_locale();
[427] Fix | Delete
$user_locale = \get_user_locale();
[428] Fix | Delete
[429] Fix | Delete
$language_settings = \sprintf(
[430] Fix | Delete
'Site locale: %1$s, user locale: %2$s',
[431] Fix | Delete
( \is_string( $site_locale ) ) ? \esc_html( $site_locale ) : 'unknown',
[432] Fix | Delete
( \is_string( $user_locale ) ) ? \esc_html( $user_locale ) : 'unknown'
[433] Fix | Delete
);
[434] Fix | Delete
[435] Fix | Delete
return $language_settings;
[436] Fix | Delete
}
[437] Fix | Delete
[438] Fix | Delete
/**
[439] Fix | Delete
* Returns the conditionals based on which this integration should be active.
[440] Fix | Delete
*
[441] Fix | Delete
* @return array The array of conditionals.
[442] Fix | Delete
*/
[443] Fix | Delete
public static function get_conditionals() {
[444] Fix | Delete
return [ Admin_Conditional::class ];
[445] Fix | Delete
}
[446] Fix | Delete
[447] Fix | Delete
/**
[448] Fix | Delete
* Allows filtering of the HelpScout settings. Hooked to admin_head to prevent timing issues, not too early, not too late.
[449] Fix | Delete
*
[450] Fix | Delete
* @return void
[451] Fix | Delete
*/
[452] Fix | Delete
protected function filter_settings() {
[453] Fix | Delete
$filterable_helpscout_setting = [
[454] Fix | Delete
'products' => $this->products,
[455] Fix | Delete
'pages_ids' => $this->pages_ids,
[456] Fix | Delete
];
[457] Fix | Delete
[458] Fix | Delete
/**
[459] Fix | Delete
* Filter: 'wpseo_helpscout_beacon_settings' - Allows overriding the HelpScout beacon settings.
[460] Fix | Delete
*
[461] Fix | Delete
* @param string $beacon_settings The HelpScout beacon settings.
[462] Fix | Delete
*/
[463] Fix | Delete
$helpscout_settings = \apply_filters( 'wpseo_helpscout_beacon_settings', $filterable_helpscout_setting );
[464] Fix | Delete
[465] Fix | Delete
$this->products = $helpscout_settings['products'];
[466] Fix | Delete
$this->pages_ids = $helpscout_settings['pages_ids'];
[467] Fix | Delete
}
[468] Fix | Delete
}
[469] Fix | Delete
[470] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function