Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/wpforms-.../src/Admin/Pages
File: Duplicator.php
<?php
[0] Fix | Delete
[1] Fix | Delete
namespace WPForms\Admin\Pages;
[2] Fix | Delete
[3] Fix | Delete
/**
[4] Fix | Delete
* Duplicator Subpage.
[5] Fix | Delete
*
[6] Fix | Delete
* @since 1.9.8.6
[7] Fix | Delete
*/
[8] Fix | Delete
class Duplicator extends Page {
[9] Fix | Delete
[10] Fix | Delete
/**
[11] Fix | Delete
* Admin menu page slug.
[12] Fix | Delete
*
[13] Fix | Delete
* @since 1.9.8.6
[14] Fix | Delete
*
[15] Fix | Delete
* @var string
[16] Fix | Delete
*/
[17] Fix | Delete
public const SLUG = 'wpforms-duplicator';
[18] Fix | Delete
[19] Fix | Delete
/**
[20] Fix | Delete
* Configuration.
[21] Fix | Delete
*
[22] Fix | Delete
* @since 1.9.8.6
[23] Fix | Delete
*
[24] Fix | Delete
* @var array
[25] Fix | Delete
*/
[26] Fix | Delete
protected $config = [
[27] Fix | Delete
'lite_plugin' => 'duplicator/duplicator.php',
[28] Fix | Delete
'lite_wporg_url' => 'https://wordpress.org/plugins/duplicator/',
[29] Fix | Delete
'lite_download_url' => 'https://downloads.wordpress.org/plugin/duplicator.zip',
[30] Fix | Delete
'pro_plugin' => 'duplicator-pro/duplicator-pro.php',
[31] Fix | Delete
'duplicator_addon' => 'duplicator-pro/duplicator-pro.php',
[32] Fix | Delete
'duplicator_addon_page' => 'https://duplicator.com/?utm_source=wpformsplugin&utm_medium=link&utm_campaign=duplicator-page',
[33] Fix | Delete
'duplicator_onboarding' => 'admin.php?page=duplicator',
[34] Fix | Delete
];
[35] Fix | Delete
[36] Fix | Delete
/**
[37] Fix | Delete
* Constructor.
[38] Fix | Delete
*
[39] Fix | Delete
* @since 1.9.8.6
[40] Fix | Delete
*/
[41] Fix | Delete
public function __construct() {
[42] Fix | Delete
[43] Fix | Delete
// Set the correct onboarding page based on the active version.
[44] Fix | Delete
if ( $this->is_pro_active() ) {
[45] Fix | Delete
$this->config['duplicator_onboarding'] = 'admin.php?page=duplicator-pro';
[46] Fix | Delete
}
[47] Fix | Delete
[48] Fix | Delete
parent::__construct();
[49] Fix | Delete
}
[50] Fix | Delete
[51] Fix | Delete
/**
[52] Fix | Delete
* Get the plugin name for use in IDs, CSS classes, and config keys.
[53] Fix | Delete
*
[54] Fix | Delete
* @since 1.9.8.6
[55] Fix | Delete
*
[56] Fix | Delete
* @return string Plugin name.
[57] Fix | Delete
*/
[58] Fix | Delete
protected static function get_plugin_name(): string {
[59] Fix | Delete
[60] Fix | Delete
return 'duplicator';
[61] Fix | Delete
}
[62] Fix | Delete
[63] Fix | Delete
/**
[64] Fix | Delete
* Get heading title text.
[65] Fix | Delete
*
[66] Fix | Delete
* @since 1.9.8.6
[67] Fix | Delete
*
[68] Fix | Delete
* @return string Heading title.
[69] Fix | Delete
*/
[70] Fix | Delete
protected function get_heading_title(): string {
[71] Fix | Delete
[72] Fix | Delete
return esc_html__( 'WPForms Collects It. Duplicator Protects It.', 'wpforms-lite' );
[73] Fix | Delete
}
[74] Fix | Delete
[75] Fix | Delete
/**
[76] Fix | Delete
* Get heading alt text for logo.
[77] Fix | Delete
*
[78] Fix | Delete
* @since 1.9.8.6
[79] Fix | Delete
*
[80] Fix | Delete
* @return string Heading alt text.
[81] Fix | Delete
*/
[82] Fix | Delete
protected function get_heading_alt_text(): string {
[83] Fix | Delete
[84] Fix | Delete
return esc_attr__( 'WPForms ♥ Duplicator', 'wpforms-lite' );
[85] Fix | Delete
}
[86] Fix | Delete
[87] Fix | Delete
/**
[88] Fix | Delete
* Get heading description strings.
[89] Fix | Delete
*
[90] Fix | Delete
* @since 1.9.8.6
[91] Fix | Delete
*
[92] Fix | Delete
* @return array Array of description strings.
[93] Fix | Delete
*/
[94] Fix | Delete
protected function get_heading_strings(): array {
[95] Fix | Delete
[96] Fix | Delete
return [
[97] Fix | Delete
esc_html__( 'Every form entry lives in your database. One bad update, one crash, and it\'s gone. Duplicator backs up your entire site automatically so you can restore everything with one click.', 'wpforms-lite' ),
[98] Fix | Delete
esc_html__( 'Trusted by over 1.5 million websites.', 'wpforms-lite' ),
[99] Fix | Delete
];
[100] Fix | Delete
}
[101] Fix | Delete
[102] Fix | Delete
/**
[103] Fix | Delete
* Get screenshot features list.
[104] Fix | Delete
*
[105] Fix | Delete
* @since 1.9.8.6
[106] Fix | Delete
*
[107] Fix | Delete
* @return array Array of feature strings.
[108] Fix | Delete
*/
[109] Fix | Delete
protected function get_screenshot_features(): array {
[110] Fix | Delete
[111] Fix | Delete
return [
[112] Fix | Delete
'Back up your entire site automatically: forms, entries, everything.',
[113] Fix | Delete
'Restore your site with one click if anything goes wrong.',
[114] Fix | Delete
'Store backups safely in Google Drive, Dropbox, or Amazon S3.',
[115] Fix | Delete
'Schedule daily backups so you never have to think about it.',
[116] Fix | Delete
];
[117] Fix | Delete
}
[118] Fix | Delete
[119] Fix | Delete
/**
[120] Fix | Delete
* Get screenshot alt text.
[121] Fix | Delete
*
[122] Fix | Delete
* @since 1.9.8.6
[123] Fix | Delete
*
[124] Fix | Delete
* @return string Alt text for screenshot image.
[125] Fix | Delete
*/
[126] Fix | Delete
protected function get_screenshot_alt_text(): string {
[127] Fix | Delete
[128] Fix | Delete
return esc_attr__( 'Duplicator screenshot', 'wpforms-lite' );
[129] Fix | Delete
}
[130] Fix | Delete
[131] Fix | Delete
/**
[132] Fix | Delete
* Generate and output step 'Result' section HTML.
[133] Fix | Delete
*
[134] Fix | Delete
* @since 1.9.8.6
[135] Fix | Delete
*
[136] Fix | Delete
* @noinspection HtmlUnknownTarget
[137] Fix | Delete
*/
[138] Fix | Delete
protected function output_section_step_result(): void {
[139] Fix | Delete
[140] Fix | Delete
$step = $this->get_data_step_result();
[141] Fix | Delete
[142] Fix | Delete
if ( empty( $step ) ) {
[143] Fix | Delete
return;
[144] Fix | Delete
}
[145] Fix | Delete
[146] Fix | Delete
printf(
[147] Fix | Delete
'<section class="step step-result %1$s">
[148] Fix | Delete
<aside class="num">
[149] Fix | Delete
<img src="%2$s" alt="%3$s" />
[150] Fix | Delete
</aside>
[151] Fix | Delete
<div>
[152] Fix | Delete
<h2>%4$s</h2>
[153] Fix | Delete
<p>%5$s</p>
[154] Fix | Delete
<button class="button %6$s" data-url="%7$s">%8$s</button>
[155] Fix | Delete
</div>
[156] Fix | Delete
</section>',
[157] Fix | Delete
esc_attr( $step['section_class'] ),
[158] Fix | Delete
esc_url( WPFORMS_PLUGIN_URL . 'assets/images/' . $step['icon'] ),
[159] Fix | Delete
esc_attr__( 'Step 3', 'wpforms-lite' ),
[160] Fix | Delete
esc_html__( 'Set Up Scheduled Cloud Backups', 'wpforms-lite' ),
[161] Fix | Delete
esc_html__( 'Keep your data safe forever with automatic daily backups to Google Drive, Dropbox, or Amazon S3.', 'wpforms-lite' ),
[162] Fix | Delete
esc_attr( $step['button_class'] ),
[163] Fix | Delete
esc_url( admin_url( $this->is_pro_active() ? 'admin.php?page=duplicator-pro-schedules' : 'admin.php?page=duplicator-schedules' ) ),
[164] Fix | Delete
esc_html( $step['button_text'] )
[165] Fix | Delete
);
[166] Fix | Delete
}
[167] Fix | Delete
[168] Fix | Delete
/**
[169] Fix | Delete
* Whether the plugin is finished setup or not.
[170] Fix | Delete
*
[171] Fix | Delete
* @since 1.9.8.6
[172] Fix | Delete
*/
[173] Fix | Delete
protected function is_plugin_finished_setup(): bool {
[174] Fix | Delete
[175] Fix | Delete
if ( ! $this->is_plugin_configured() ) {
[176] Fix | Delete
return false;
[177] Fix | Delete
}
[178] Fix | Delete
[179] Fix | Delete
$count = $this->get_package_count();
[180] Fix | Delete
$schedule_count = 0;
[181] Fix | Delete
[182] Fix | Delete
if ( $count && class_exists( '\Duplicator\Models\ScheduleEntity' ) && $this->is_pro_active() ) {
[183] Fix | Delete
$schedule_count = \Duplicator\Models\ScheduleEntity::count(); // phpcs:ignore WPForms.PHP.BackSlash.RemoveBackslash, WPForms.PHP.BackSlash.UseShortSyntax
[184] Fix | Delete
}
[185] Fix | Delete
[186] Fix | Delete
return $count && $schedule_count;
[187] Fix | Delete
}
[188] Fix | Delete
[189] Fix | Delete
/**
[190] Fix | Delete
* Generate and output footer section HTML.
[191] Fix | Delete
*
[192] Fix | Delete
* @since 1.9.8.6
[193] Fix | Delete
*/
[194] Fix | Delete
protected function output_section_footer(): void {
[195] Fix | Delete
[196] Fix | Delete
printf(
[197] Fix | Delete
'<section class="bottom">
[198] Fix | Delete
<p>%s</p>
[199] Fix | Delete
</section>',
[200] Fix | Delete
esc_html__( 'Because the data you collect with WPForms is too valuable to lose.', 'wpforms-lite' )
[201] Fix | Delete
);
[202] Fix | Delete
}
[203] Fix | Delete
[204] Fix | Delete
/**
[205] Fix | Delete
* Step 'Result' data.
[206] Fix | Delete
*
[207] Fix | Delete
* @since 1.9.8.6
[208] Fix | Delete
*
[209] Fix | Delete
* @return array Step data.
[210] Fix | Delete
*/
[211] Fix | Delete
protected function get_data_step_result(): array {
[212] Fix | Delete
[213] Fix | Delete
$count = $this->get_package_count();
[214] Fix | Delete
[215] Fix | Delete
$data = [
[216] Fix | Delete
'section_class' => $count ? '' : 'grey',
[217] Fix | Delete
'button_class' => ! $count ? 'grey disabled' : 'button-primary',
[218] Fix | Delete
'icon' => 'step-3.svg',
[219] Fix | Delete
'button_text' => esc_html__( 'Set Up Cloud Backups', 'wpforms-lite' ),
[220] Fix | Delete
];
[221] Fix | Delete
[222] Fix | Delete
if ( $count && class_exists( '\Duplicator\Models\ScheduleEntity' ) && $this->is_pro_active() ) {
[223] Fix | Delete
$schedule_count = \Duplicator\Models\ScheduleEntity::count(); // phpcs:ignore WPForms.PHP.BackSlash.RemoveBackslash, WPForms.PHP.BackSlash.UseShortSyntax
[224] Fix | Delete
[225] Fix | Delete
$data['section_class'] = '';
[226] Fix | Delete
$data['button_class'] = 'button-primary';
[227] Fix | Delete
[228] Fix | Delete
if ( $schedule_count ) {
[229] Fix | Delete
$data['icon'] = 'step-complete.svg';
[230] Fix | Delete
$data['button_class'] = 'grey disabled';
[231] Fix | Delete
$data['button_text'] = esc_html__( 'Cloud Backups Set Up', 'wpforms-lite' );
[232] Fix | Delete
}
[233] Fix | Delete
}
[234] Fix | Delete
[235] Fix | Delete
return $data;
[236] Fix | Delete
}
[237] Fix | Delete
[238] Fix | Delete
/**
[239] Fix | Delete
* Whether a plugin is configured or not.
[240] Fix | Delete
*
[241] Fix | Delete
* @since 1.9.8.6
[242] Fix | Delete
*
[243] Fix | Delete
* @return bool True if plugin is configured properly.
[244] Fix | Delete
*/
[245] Fix | Delete
protected function is_plugin_configured(): bool {
[246] Fix | Delete
[247] Fix | Delete
if ( ! $this->is_plugin_activated() ) {
[248] Fix | Delete
return false;
[249] Fix | Delete
}
[250] Fix | Delete
[251] Fix | Delete
$count = $this->get_package_count();
[252] Fix | Delete
[253] Fix | Delete
return $count > 0;
[254] Fix | Delete
}
[255] Fix | Delete
[256] Fix | Delete
/**
[257] Fix | Delete
* Get the number of packages in the database.
[258] Fix | Delete
*
[259] Fix | Delete
* @since 1.9.8.6
[260] Fix | Delete
*
[261] Fix | Delete
* @return int Number of packages.
[262] Fix | Delete
*/
[263] Fix | Delete
protected function get_package_count(): int {
[264] Fix | Delete
[265] Fix | Delete
/**
[266] Fix | Delete
* Check if the plugin is available.
[267] Fix | Delete
* Since we are using a direct query to the database to get the number of records instead of built-in methods,
[268] Fix | Delete
* there is a chance of getting a non-zero value even if the plugin is turned off.
[269] Fix | Delete
*/
[270] Fix | Delete
if ( ! $this->is_plugin_available() ) {
[271] Fix | Delete
return 0;
[272] Fix | Delete
}
[273] Fix | Delete
[274] Fix | Delete
// Check if Duplicator has been configured with basic settings.
[275] Fix | Delete
global $wpdb;
[276] Fix | Delete
[277] Fix | Delete
// Check for the Duplicator packages table.
[278] Fix | Delete
$packages_table = $this->is_pro_active() ? $wpdb->prefix . 'duplicator_backups' : $wpdb->prefix . 'duplicator_packages';
[279] Fix | Delete
[280] Fix | Delete
// Use object caching to minimize direct DB queries here, as there is no core API
[281] Fix | Delete
// to check custom plugin table existence or its contents.
[282] Fix | Delete
$blog_id = function_exists( 'get_current_blog_id' ) ? get_current_blog_id() : 0;
[283] Fix | Delete
$table_exists_cache_key = "wpforms_dup_table_exists_{$blog_id}";
[284] Fix | Delete
$package_count_cache_key = "wpforms_dup_package_count_{$blog_id}";
[285] Fix | Delete
[286] Fix | Delete
$table_exists = wp_cache_get( $table_exists_cache_key, 'wpforms' );
[287] Fix | Delete
[288] Fix | Delete
if ( $table_exists === false ) {
[289] Fix | Delete
// PHPCS: We must use a direct DB query because no WP API exists for custom tables.
[290] Fix | Delete
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
[291] Fix | Delete
$table_exists = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $packages_table ) ) );
[292] Fix | Delete
[293] Fix | Delete
wp_cache_set( $table_exists_cache_key, $table_exists, 'wpforms', 60 );
[294] Fix | Delete
}
[295] Fix | Delete
[296] Fix | Delete
$package_count = 0;
[297] Fix | Delete
[298] Fix | Delete
if ( $table_exists === $packages_table ) {
[299] Fix | Delete
$package_count = wp_cache_get( $package_count_cache_key, 'wpforms' );
[300] Fix | Delete
[301] Fix | Delete
if ( $package_count === false ) {
[302] Fix | Delete
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
[303] Fix | Delete
$package_count = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$packages_table}" );
[304] Fix | Delete
[305] Fix | Delete
wp_cache_set( $package_count_cache_key, $package_count, 'wpforms', 60 );
[306] Fix | Delete
}
[307] Fix | Delete
}
[308] Fix | Delete
[309] Fix | Delete
return (int) $package_count;
[310] Fix | Delete
}
[311] Fix | Delete
[312] Fix | Delete
/**
[313] Fix | Delete
* Whether a plugin is active or not.
[314] Fix | Delete
*
[315] Fix | Delete
* @since 1.9.8.6
[316] Fix | Delete
*
[317] Fix | Delete
* @return bool True if the plugin is active.
[318] Fix | Delete
*/
[319] Fix | Delete
protected function is_plugin_activated(): bool {
[320] Fix | Delete
[321] Fix | Delete
return (
[322] Fix | Delete
( defined( 'DUPLICATOR_VERSION' ) || class_exists( 'Duplicator\Plugin' ) || class_exists( 'Duplicator\Pro\Requirements' ) ) &&
[323] Fix | Delete
(
[324] Fix | Delete
is_plugin_active( $this->config['lite_plugin'] ) ||
[325] Fix | Delete
is_plugin_active( $this->config['pro_plugin'] )
[326] Fix | Delete
)
[327] Fix | Delete
);
[328] Fix | Delete
}
[329] Fix | Delete
[330] Fix | Delete
/**
[331] Fix | Delete
* Whether a plugin is available (class/function exists).
[332] Fix | Delete
*
[333] Fix | Delete
* @since 1.9.8.6
[334] Fix | Delete
*
[335] Fix | Delete
* @return bool True if plugin is available.
[336] Fix | Delete
*/
[337] Fix | Delete
protected function is_plugin_available(): bool {
[338] Fix | Delete
[339] Fix | Delete
return class_exists( 'Duplicator\Plugin' ) || defined( 'DUPLICATOR_VERSION' ) || class_exists( 'DUP_PRO_Plugin' ) || defined( 'DUPLICATOR_PRO_VERSION' );
[340] Fix | Delete
}
[341] Fix | Delete
[342] Fix | Delete
/**
[343] Fix | Delete
* Whether pro version is active.
[344] Fix | Delete
*
[345] Fix | Delete
* @since 1.9.8.6
[346] Fix | Delete
*
[347] Fix | Delete
* @return bool True if pro version is active.
[348] Fix | Delete
*/
[349] Fix | Delete
protected function is_pro_active(): bool {
[350] Fix | Delete
[351] Fix | Delete
return class_exists( 'DUP_PRO_Plugin' ) || defined( 'DUPLICATOR_PRO_VERSION' );
[352] Fix | Delete
}
[353] Fix | Delete
[354] Fix | Delete
/**
[355] Fix | Delete
* Get the heading for the install step.
[356] Fix | Delete
*
[357] Fix | Delete
* @since 1.9.8.6
[358] Fix | Delete
*
[359] Fix | Delete
* @return string Install step heading.
[360] Fix | Delete
*/
[361] Fix | Delete
protected function get_install_heading(): string {
[362] Fix | Delete
[363] Fix | Delete
return esc_html__( 'Install and Activate Duplicator', 'wpforms-lite' );
[364] Fix | Delete
}
[365] Fix | Delete
[366] Fix | Delete
/**
[367] Fix | Delete
* Get the description for the install step.
[368] Fix | Delete
*
[369] Fix | Delete
* @since 1.9.8.6
[370] Fix | Delete
*
[371] Fix | Delete
* @return string Install step description.
[372] Fix | Delete
*/
[373] Fix | Delete
protected function get_install_description(): string {
[374] Fix | Delete
[375] Fix | Delete
return esc_html__( 'Your first step toward bulletproof backups.', 'wpforms-lite' );
[376] Fix | Delete
}
[377] Fix | Delete
[378] Fix | Delete
/**
[379] Fix | Delete
* Get the plugin title.
[380] Fix | Delete
*
[381] Fix | Delete
* @since 1.9.8.6
[382] Fix | Delete
*
[383] Fix | Delete
* @return string Plugin title.
[384] Fix | Delete
*/
[385] Fix | Delete
protected function get_plugin_title(): string {
[386] Fix | Delete
[387] Fix | Delete
return esc_html__( 'Duplicator', 'wpforms-lite' );
[388] Fix | Delete
}
[389] Fix | Delete
[390] Fix | Delete
/**
[391] Fix | Delete
* Get the install button text.
[392] Fix | Delete
*
[393] Fix | Delete
* @since 1.9.8.6
[394] Fix | Delete
*
[395] Fix | Delete
* @return string Install button text.
[396] Fix | Delete
*/
[397] Fix | Delete
protected function get_install_button_text(): string {
[398] Fix | Delete
[399] Fix | Delete
return esc_html__( 'Install Duplicator', 'wpforms-lite' );
[400] Fix | Delete
}
[401] Fix | Delete
[402] Fix | Delete
/**
[403] Fix | Delete
* Get the text when a plugin is installed and activated.
[404] Fix | Delete
*
[405] Fix | Delete
* @since 1.9.8.6
[406] Fix | Delete
*
[407] Fix | Delete
* @return string Installed & activated text.
[408] Fix | Delete
*/
[409] Fix | Delete
protected function get_installed_activated_text(): string {
[410] Fix | Delete
[411] Fix | Delete
return esc_html__( 'Duplicator Installed & Activated', 'wpforms-lite' );
[412] Fix | Delete
}
[413] Fix | Delete
[414] Fix | Delete
/**
[415] Fix | Delete
* Get the activate button text.
[416] Fix | Delete
*
[417] Fix | Delete
* @since 1.9.8.6
[418] Fix | Delete
*
[419] Fix | Delete
* @return string Activate button text.
[420] Fix | Delete
*/
[421] Fix | Delete
protected function get_activate_text(): string {
[422] Fix | Delete
[423] Fix | Delete
return esc_html__( 'Activate Duplicator', 'wpforms-lite' );
[424] Fix | Delete
}
[425] Fix | Delete
[426] Fix | Delete
/**
[427] Fix | Delete
* Get the heading for the setup step.
[428] Fix | Delete
*
[429] Fix | Delete
* @since 1.9.8.6
[430] Fix | Delete
*
[431] Fix | Delete
* @return string Setup step heading.
[432] Fix | Delete
*/
[433] Fix | Delete
protected function get_setup_heading(): string {
[434] Fix | Delete
[435] Fix | Delete
return esc_html__( 'Create Your First Backup', 'wpforms-lite' );
[436] Fix | Delete
}
[437] Fix | Delete
[438] Fix | Delete
/**
[439] Fix | Delete
* Get the description for the setup step.
[440] Fix | Delete
*
[441] Fix | Delete
* @since 1.9.8.6
[442] Fix | Delete
*
[443] Fix | Delete
* @return string Setup step description.
[444] Fix | Delete
*/
[445] Fix | Delete
protected function get_setup_description(): string {
[446] Fix | Delete
[447] Fix | Delete
return esc_html__( 'Back up your site — forms, entries, settings, everything — in just one click.', 'wpforms-lite' );
[448] Fix | Delete
}
[449] Fix | Delete
[450] Fix | Delete
/**
[451] Fix | Delete
* Get the setup button text.
[452] Fix | Delete
*
[453] Fix | Delete
* @since 1.9.8.6
[454] Fix | Delete
*
[455] Fix | Delete
* @return string Setup button text.
[456] Fix | Delete
*/
[457] Fix | Delete
protected function get_setup_button_text(): string {
[458] Fix | Delete
[459] Fix | Delete
return esc_html__( 'Create First Backup', 'wpforms-lite' );
[460] Fix | Delete
}
[461] Fix | Delete
[462] Fix | Delete
/**
[463] Fix | Delete
* Get the text when setup is completed.
[464] Fix | Delete
*
[465] Fix | Delete
* @since 1.9.8.6
[466] Fix | Delete
*
[467] Fix | Delete
* @return string Setup completed text.
[468] Fix | Delete
*/
[469] Fix | Delete
protected function get_setup_completed_text(): string {
[470] Fix | Delete
[471] Fix | Delete
return esc_html__( 'Backup Created', 'wpforms-lite' );
[472] Fix | Delete
}
[473] Fix | Delete
[474] Fix | Delete
/**
[475] Fix | Delete
* Get the text when a pro-version is installed and activated.
[476] Fix | Delete
*
[477] Fix | Delete
* @since 1.9.8.6
[478] Fix | Delete
*
[479] Fix | Delete
* @return string Pro installed and activated text.
[480] Fix | Delete
*/
[481] Fix | Delete
protected function get_pro_installed_activated_text(): string {
[482] Fix | Delete
[483] Fix | Delete
return esc_html__( 'Duplicator Pro Installed & Activated', 'wpforms-lite' );
[484] Fix | Delete
}
[485] Fix | Delete
}
[486] Fix | Delete
[487] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function