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/popup-ma.../trunk/classes/Extensio...
File: License.php
<?php
[0] Fix | Delete
/**
[1] Fix | Delete
* Extension License Handler
[2] Fix | Delete
*
[3] Fix | Delete
* @package PUM
[4] Fix | Delete
* @copyright Copyright (c) 2023, Code Atlantic LLC
[5] Fix | Delete
*/
[6] Fix | Delete
[7] Fix | Delete
// Exit if accessed directly.
[8] Fix | Delete
defined( 'ABSPATH' ) || exit;
[9] Fix | Delete
[10] Fix | Delete
/**
[11] Fix | Delete
* License handler for Popup Maker
[12] Fix | Delete
*
[13] Fix | Delete
* This class should simplify the process of adding license information to new Popup Maker extensions.
[14] Fix | Delete
*
[15] Fix | Delete
* Note for wordpress.org admins. This is not called in the free hosted version and is simply used for hooking in addons to one update system rather than including it in each plugin.
[16] Fix | Delete
*
[17] Fix | Delete
* @version 1.1
[18] Fix | Delete
*/
[19] Fix | Delete
class PUM_Extension_License {
[20] Fix | Delete
[21] Fix | Delete
/**
[22] Fix | Delete
* Plugin file.
[23] Fix | Delete
*
[24] Fix | Delete
* @var string
[25] Fix | Delete
*/
[26] Fix | Delete
private $file;
[27] Fix | Delete
[28] Fix | Delete
/**
[29] Fix | Delete
* License key.
[30] Fix | Delete
*
[31] Fix | Delete
* @var string
[32] Fix | Delete
*/
[33] Fix | Delete
private $license;
[34] Fix | Delete
[35] Fix | Delete
/**
[36] Fix | Delete
* Plugin name.
[37] Fix | Delete
*
[38] Fix | Delete
* @var string
[39] Fix | Delete
*/
[40] Fix | Delete
private $item_name;
[41] Fix | Delete
[42] Fix | Delete
/**
[43] Fix | Delete
* Plugin EDD item ID.
[44] Fix | Delete
*
[45] Fix | Delete
* @var int
[46] Fix | Delete
*/
[47] Fix | Delete
private $item_id;
[48] Fix | Delete
[49] Fix | Delete
/**
[50] Fix | Delete
* Plugin shortname.
[51] Fix | Delete
*
[52] Fix | Delete
* @var string
[53] Fix | Delete
*/
[54] Fix | Delete
private $item_shortname;
[55] Fix | Delete
[56] Fix | Delete
/**
[57] Fix | Delete
* Plugin version.
[58] Fix | Delete
*
[59] Fix | Delete
* @var string
[60] Fix | Delete
*/
[61] Fix | Delete
private $version;
[62] Fix | Delete
[63] Fix | Delete
/**
[64] Fix | Delete
* Plugin author.
[65] Fix | Delete
*
[66] Fix | Delete
* @var string
[67] Fix | Delete
*/
[68] Fix | Delete
private $author;
[69] Fix | Delete
[70] Fix | Delete
/**
[71] Fix | Delete
* API URL.
[72] Fix | Delete
*
[73] Fix | Delete
* @var string
[74] Fix | Delete
*/
[75] Fix | Delete
private $api_url = 'https://wppopupmaker.com/edd-sl-api/';
[76] Fix | Delete
[77] Fix | Delete
/**
[78] Fix | Delete
* Class constructor
[79] Fix | Delete
*
[80] Fix | Delete
* @param string $_file
[81] Fix | Delete
* @param string $_item_name
[82] Fix | Delete
* @param string $_version
[83] Fix | Delete
* @param string $_author
[84] Fix | Delete
* @param string $_optname
[85] Fix | Delete
* @param string $_api_url
[86] Fix | Delete
* @param int $_item_id
[87] Fix | Delete
*/
[88] Fix | Delete
function __construct( $_file, $_item_name, $_version, $_author, $_optname = null, $_api_url = null, $_item_id = null ) {
[89] Fix | Delete
$this->file = $_file;
[90] Fix | Delete
$this->item_name = $_item_name;
[91] Fix | Delete
[92] Fix | Delete
if ( is_numeric( $_item_id ) ) {
[93] Fix | Delete
$this->item_id = absint( $_item_id );
[94] Fix | Delete
}
[95] Fix | Delete
[96] Fix | Delete
$this->item_shortname = 'popmake_' . preg_replace( '/[^a-zA-Z0-9_\s]/', '', str_replace( ' ', '_', strtolower( $this->item_name ) ) );
[97] Fix | Delete
$this->version = $_version;
[98] Fix | Delete
$this->license = trim( PUM_Utils_Options::get( $this->item_shortname . '_license_key', '' ) );
[99] Fix | Delete
$this->author = $_author;
[100] Fix | Delete
$this->api_url = is_null( $_api_url ) ? $this->api_url : $_api_url;
[101] Fix | Delete
[102] Fix | Delete
/**
[103] Fix | Delete
* Allows for backwards compatibility with old license options,
[104] Fix | Delete
* i.e. if the plugins had license key fields previously, the license
[105] Fix | Delete
* handler will automatically pick these up and use those in lieu of the
[106] Fix | Delete
* user having to reactive their license.
[107] Fix | Delete
*/
[108] Fix | Delete
if ( ! empty( $_optname ) ) {
[109] Fix | Delete
$opt = PUM_Utils_Options::get( $_optname );
[110] Fix | Delete
[111] Fix | Delete
if ( isset( $opt ) && empty( $this->license ) ) {
[112] Fix | Delete
$this->license = trim( $opt );
[113] Fix | Delete
}
[114] Fix | Delete
}
[115] Fix | Delete
[116] Fix | Delete
// Setup hooks
[117] Fix | Delete
$this->includes();
[118] Fix | Delete
$this->hooks();
[119] Fix | Delete
}
[120] Fix | Delete
[121] Fix | Delete
/**
[122] Fix | Delete
* Include the updater class
[123] Fix | Delete
*
[124] Fix | Delete
* @access private
[125] Fix | Delete
* @return void
[126] Fix | Delete
*/
[127] Fix | Delete
private function includes() {
[128] Fix | Delete
}
[129] Fix | Delete
[130] Fix | Delete
/**
[131] Fix | Delete
* Setup hooks
[132] Fix | Delete
*
[133] Fix | Delete
* @access private
[134] Fix | Delete
* @return void
[135] Fix | Delete
*/
[136] Fix | Delete
private function hooks() {
[137] Fix | Delete
[138] Fix | Delete
// Register settings
[139] Fix | Delete
add_filter( 'pum_settings_fields', [ $this, 'settings' ], 1 );
[140] Fix | Delete
[141] Fix | Delete
// Activate license key on settings save
[142] Fix | Delete
add_action( 'admin_init', [ $this, 'activate_license' ] );
[143] Fix | Delete
[144] Fix | Delete
// Deactivate license key
[145] Fix | Delete
add_action( 'admin_init', [ $this, 'deactivate_license' ] );
[146] Fix | Delete
[147] Fix | Delete
// Check that license is valid once per week
[148] Fix | Delete
add_action( 'popmake_weekly_scheduled_events', [ $this, 'weekly_license_check' ] );
[149] Fix | Delete
[150] Fix | Delete
// For testing license notices, uncomment this line to force checks on every page load
[151] Fix | Delete
// add_action( 'admin_init', array( $this, 'weekly_license_check' ) );
[152] Fix | Delete
[153] Fix | Delete
// Updater
[154] Fix | Delete
add_action( 'admin_init', [ $this, 'auto_updater' ], 0 );
[155] Fix | Delete
[156] Fix | Delete
// Display notices to admins
[157] Fix | Delete
// add_action( 'admin_notices', array( $this, 'notices' ) );
[158] Fix | Delete
[159] Fix | Delete
// Display notices to admins
[160] Fix | Delete
add_filter( 'pum_alert_list', [ $this, 'alerts' ] );
[161] Fix | Delete
[162] Fix | Delete
add_action( 'in_plugin_update_message-' . plugin_basename( $this->file ), [ $this, 'plugin_row_license_missing' ], 10, 2 );
[163] Fix | Delete
[164] Fix | Delete
// Register plugins for beta support
[165] Fix | Delete
add_filter( 'pum_beta_enabled_extensions', [ $this, 'register_beta_support' ] );
[166] Fix | Delete
}
[167] Fix | Delete
[168] Fix | Delete
/**
[169] Fix | Delete
* Auto updater
[170] Fix | Delete
*
[171] Fix | Delete
* @access private
[172] Fix | Delete
* @return void
[173] Fix | Delete
*/
[174] Fix | Delete
public function auto_updater() {
[175] Fix | Delete
$args = [
[176] Fix | Delete
'version' => $this->version,
[177] Fix | Delete
'license' => $this->license,
[178] Fix | Delete
'author' => $this->author,
[179] Fix | Delete
'beta' => PUM_Admin_Tools::extension_has_beta_support( $this->item_shortname ),
[180] Fix | Delete
];
[181] Fix | Delete
[182] Fix | Delete
if ( ! empty( $this->item_id ) ) {
[183] Fix | Delete
$args['item_id'] = $this->item_id;
[184] Fix | Delete
} else {
[185] Fix | Delete
$args['item_name'] = $this->item_name;
[186] Fix | Delete
}
[187] Fix | Delete
[188] Fix | Delete
// Setup the updater
[189] Fix | Delete
$popmake_updater = new PUM_Extension_Updater( $this->api_url, $this->file, $args );
[190] Fix | Delete
}
[191] Fix | Delete
[192] Fix | Delete
[193] Fix | Delete
/**
[194] Fix | Delete
* Add license field to settings
[195] Fix | Delete
*
[196] Fix | Delete
* @access public
[197] Fix | Delete
*
[198] Fix | Delete
* @param array $tabs
[199] Fix | Delete
*
[200] Fix | Delete
* @return array
[201] Fix | Delete
*/
[202] Fix | Delete
public function settings( $tabs = [] ) {
[203] Fix | Delete
static $license_help_text = false;
[204] Fix | Delete
[205] Fix | Delete
if ( ! $license_help_text && ! isset( $tabs['licenses']['main']['license_help_text'] ) ) {
[206] Fix | Delete
$license_help_text = true;
[207] Fix | Delete
[208] Fix | Delete
$tabs['licenses']['main']['license_help_text'] = [
[209] Fix | Delete
'type' => 'html',
[210] Fix | Delete
'content' => '<p><strong>' . sprintf( __( 'Enter your extension license keys here to receive updates for purchased extensions. If your license key has expired, please %1$srenew your license%2$s.', 'popup-maker' ), '<a href="https://docs.wppopupmaker.com/article/177-license-renewal?utm_medium=license-help-text&utm_campaign=Licensing&utm_source=plugin-settings-page-licenses-tab" target="_blank">', '</a>' ) . '</strong></p>',
[211] Fix | Delete
'priority' => 0,
[212] Fix | Delete
];
[213] Fix | Delete
}
[214] Fix | Delete
[215] Fix | Delete
$tabs['licenses']['main'][ $this->item_shortname . '_license_key' ] = [
[216] Fix | Delete
'type' => 'license_key',
[217] Fix | Delete
'label' => sprintf( __( '%1$s', 'popup-maker' ), $this->item_name ),
[218] Fix | Delete
'options' => [
[219] Fix | Delete
'is_valid_license_option' => $this->item_shortname . '_license_active',
[220] Fix | Delete
'activation_callback' => [ $this, 'activate_license' ],
[221] Fix | Delete
],
[222] Fix | Delete
];
[223] Fix | Delete
[224] Fix | Delete
return $tabs;
[225] Fix | Delete
}
[226] Fix | Delete
[227] Fix | Delete
/**
[228] Fix | Delete
* Activate the license key
[229] Fix | Delete
*
[230] Fix | Delete
* @access public
[231] Fix | Delete
* @return void
[232] Fix | Delete
*/
[233] Fix | Delete
public function activate_license() {
[234] Fix | Delete
[235] Fix | Delete
if ( ! isset( $_POST['pum_settings'] ) ) {
[236] Fix | Delete
return;
[237] Fix | Delete
}
[238] Fix | Delete
[239] Fix | Delete
if ( ! isset( $_POST['pum_settings'][ $this->item_shortname . '_license_key' ] ) ) {
[240] Fix | Delete
return;
[241] Fix | Delete
}
[242] Fix | Delete
[243] Fix | Delete
// Don't activate a key when deactivating a different key
[244] Fix | Delete
if ( ! empty( $_POST['pum_license_deactivate'] ) ) {
[245] Fix | Delete
return;
[246] Fix | Delete
}
[247] Fix | Delete
[248] Fix | Delete
if ( ! current_user_can( 'manage_options' ) ) {
[249] Fix | Delete
return;
[250] Fix | Delete
}
[251] Fix | Delete
[252] Fix | Delete
$details = get_option( $this->item_shortname . '_license_active' );
[253] Fix | Delete
[254] Fix | Delete
if ( is_object( $details ) && 'valid' === $details->license ) {
[255] Fix | Delete
return;
[256] Fix | Delete
}
[257] Fix | Delete
[258] Fix | Delete
$license = sanitize_text_field( $_POST['pum_settings'][ $this->item_shortname . '_license_key' ] );
[259] Fix | Delete
[260] Fix | Delete
if ( empty( $license ) && empty( $_POST['pum_license_activate'][ $this->item_shortname . '_license_key' ] ) ) {
[261] Fix | Delete
return;
[262] Fix | Delete
}
[263] Fix | Delete
[264] Fix | Delete
// Data to send to the API
[265] Fix | Delete
$api_params = [
[266] Fix | Delete
'edd_action' => 'activate_license',
[267] Fix | Delete
'license' => $license,
[268] Fix | Delete
'item_id' => $this->item_id,
[269] Fix | Delete
'item_name' => rawurlencode( $this->item_name ),
[270] Fix | Delete
'url' => home_url(),
[271] Fix | Delete
'environment' => function_exists( 'wp_get_environment_type' ) ? wp_get_environment_type() : 'production',
[272] Fix | Delete
];
[273] Fix | Delete
[274] Fix | Delete
// Call the API
[275] Fix | Delete
$response = wp_remote_get(
[276] Fix | Delete
$this->api_url,
[277] Fix | Delete
[
[278] Fix | Delete
'timeout' => 15,
[279] Fix | Delete
'sslverify' => false,
[280] Fix | Delete
'body' => $api_params,
[281] Fix | Delete
]
[282] Fix | Delete
);
[283] Fix | Delete
[284] Fix | Delete
// Make sure there are no errors
[285] Fix | Delete
if ( is_wp_error( $response ) ) {
[286] Fix | Delete
return;
[287] Fix | Delete
}
[288] Fix | Delete
[289] Fix | Delete
// Tell WordPress to look for updates
[290] Fix | Delete
set_site_transient( 'update_plugins', null );
[291] Fix | Delete
[292] Fix | Delete
// Decode license data
[293] Fix | Delete
$license_data = json_decode( wp_remote_retrieve_body( $response ) );
[294] Fix | Delete
[295] Fix | Delete
update_option( $this->item_shortname . '_license_active', $license_data );
[296] Fix | Delete
}
[297] Fix | Delete
[298] Fix | Delete
[299] Fix | Delete
/**
[300] Fix | Delete
* Deactivate the license key
[301] Fix | Delete
*
[302] Fix | Delete
* @access public
[303] Fix | Delete
* @return void
[304] Fix | Delete
*/
[305] Fix | Delete
public function deactivate_license() {
[306] Fix | Delete
[307] Fix | Delete
if ( ! isset( $_POST['pum_settings'] ) ) {
[308] Fix | Delete
return;
[309] Fix | Delete
}
[310] Fix | Delete
[311] Fix | Delete
if ( ! isset( $_POST['pum_settings'][ $this->item_shortname . '_license_key' ] ) ) {
[312] Fix | Delete
return;
[313] Fix | Delete
}
[314] Fix | Delete
[315] Fix | Delete
if ( ! current_user_can( 'manage_options' ) ) {
[316] Fix | Delete
return;
[317] Fix | Delete
}
[318] Fix | Delete
[319] Fix | Delete
// Run on deactivate button press
[320] Fix | Delete
if ( isset( $_POST['pum_license_deactivate'][ $this->item_shortname . '_license_key' ] ) ) {
[321] Fix | Delete
[322] Fix | Delete
// Data to send to the API
[323] Fix | Delete
$api_params = [
[324] Fix | Delete
'edd_action' => 'deactivate_license',
[325] Fix | Delete
'license' => $this->license,
[326] Fix | Delete
'item_id' => $this->item_id,
[327] Fix | Delete
'item_name' => rawurlencode( $this->item_name ),
[328] Fix | Delete
'url' => home_url(),
[329] Fix | Delete
'environment' => function_exists( 'wp_get_environment_type' ) ? wp_get_environment_type() : 'production',
[330] Fix | Delete
];
[331] Fix | Delete
[332] Fix | Delete
// Call the API
[333] Fix | Delete
$response = wp_remote_get(
[334] Fix | Delete
$this->api_url,
[335] Fix | Delete
[
[336] Fix | Delete
'timeout' => 15,
[337] Fix | Delete
'sslverify' => false,
[338] Fix | Delete
'body' => $api_params,
[339] Fix | Delete
]
[340] Fix | Delete
);
[341] Fix | Delete
[342] Fix | Delete
// Make sure there are no errors
[343] Fix | Delete
if ( is_wp_error( $response ) ) {
[344] Fix | Delete
return;
[345] Fix | Delete
}
[346] Fix | Delete
[347] Fix | Delete
// Decode the license data
[348] Fix | Delete
$license_data = json_decode( wp_remote_retrieve_body( $response ) );
[349] Fix | Delete
[350] Fix | Delete
delete_option( $this->item_shortname . '_license_active' );
[351] Fix | Delete
[352] Fix | Delete
}
[353] Fix | Delete
}
[354] Fix | Delete
[355] Fix | Delete
[356] Fix | Delete
/**
[357] Fix | Delete
* Check if license key is valid once per week
[358] Fix | Delete
*
[359] Fix | Delete
* @access public
[360] Fix | Delete
* @since 2.5
[361] Fix | Delete
* @return void
[362] Fix | Delete
*/
[363] Fix | Delete
public function weekly_license_check() {
[364] Fix | Delete
[365] Fix | Delete
if ( ! empty( $_POST['popmake_settings'] ) ) {
[366] Fix | Delete
return; // Don't fire when saving settings
[367] Fix | Delete
}
[368] Fix | Delete
[369] Fix | Delete
if ( empty( $this->license ) ) {
[370] Fix | Delete
return;
[371] Fix | Delete
}
[372] Fix | Delete
[373] Fix | Delete
// data to send in our API request
[374] Fix | Delete
$api_params = [
[375] Fix | Delete
'edd_action' => 'check_license',
[376] Fix | Delete
'license' => $this->license,
[377] Fix | Delete
'item_id' => $this->item_id,
[378] Fix | Delete
'item_name' => rawurlencode( $this->item_name ),
[379] Fix | Delete
'url' => home_url(),
[380] Fix | Delete
'environment' => function_exists( 'wp_get_environment_type' ) ? wp_get_environment_type() : 'production',
[381] Fix | Delete
];
[382] Fix | Delete
[383] Fix | Delete
// Call the API
[384] Fix | Delete
$response = wp_remote_get(
[385] Fix | Delete
$this->api_url,
[386] Fix | Delete
[
[387] Fix | Delete
'timeout' => 15,
[388] Fix | Delete
'sslverify' => false,
[389] Fix | Delete
'body' => $api_params,
[390] Fix | Delete
]
[391] Fix | Delete
);
[392] Fix | Delete
[393] Fix | Delete
// make sure the response came back okay
[394] Fix | Delete
if ( is_wp_error( $response ) ) {
[395] Fix | Delete
return;
[396] Fix | Delete
}
[397] Fix | Delete
[398] Fix | Delete
$license_data = json_decode( wp_remote_retrieve_body( $response ) );
[399] Fix | Delete
[400] Fix | Delete
update_option( $this->item_shortname . '_license_active', $license_data );
[401] Fix | Delete
[402] Fix | Delete
}
[403] Fix | Delete
[404] Fix | Delete
/**
[405] Fix | Delete
* Adds an alert to the Popup Maker notification area when the license is invalid, expired, or empty
[406] Fix | Delete
*
[407] Fix | Delete
* @param array $alerts The existing alerts from the pum_alert_list filter
[408] Fix | Delete
* @return array Our modified array of alerts
[409] Fix | Delete
*/
[410] Fix | Delete
public function alerts( $alerts = [] ) {
[411] Fix | Delete
[412] Fix | Delete
static $showed_invalid_message;
[413] Fix | Delete
[414] Fix | Delete
// If user can't manage it, or we already showed this alert abort.
[415] Fix | Delete
if ( ! current_user_can( 'manage_options' ) || $showed_invalid_message ) {
[416] Fix | Delete
return $alerts;
[417] Fix | Delete
}
[418] Fix | Delete
[419] Fix | Delete
// If this alert is already in the list of alerts, abort.
[420] Fix | Delete
foreach ( $alerts as $alert ) {
[421] Fix | Delete
if ( 'license_not_valid' === $alert['code'] ) {
[422] Fix | Delete
return $alerts;
[423] Fix | Delete
}
[424] Fix | Delete
}
[425] Fix | Delete
[426] Fix | Delete
// If this license key is not empty, check if it's valid.
[427] Fix | Delete
if ( ! empty( $this->license ) ) {
[428] Fix | Delete
$license = get_option( $this->item_shortname . '_license_active' );
[429] Fix | Delete
[430] Fix | Delete
if ( ! is_object( $license ) || 'valid' === $license->license ) {
[431] Fix | Delete
return $alerts;
[432] Fix | Delete
}
[433] Fix | Delete
}
[434] Fix | Delete
[435] Fix | Delete
$showed_invalid_message = true;
[436] Fix | Delete
[437] Fix | Delete
if ( empty( $this->license ) ) {
[438] Fix | Delete
$alerts[] = [
[439] Fix | Delete
'code' => 'license_not_valid',
[440] Fix | Delete
'message' => sprintf( __( 'One or more of your extensions are missing license keys. You will not be able to receive updates until the extension has a valid license key entered. Please go to the %1$sLicenses page%2$s to add your license keys.', 'popup-maker' ), '<a href="' . admin_url( 'edit.php?post_type=popup&page=pum-settings&tab=licenses' ) . '">', '</a>' ),
[441] Fix | Delete
'type' => 'error',
[442] Fix | Delete
'dismissible' => '4 weeks',
[443] Fix | Delete
'priority' => 0,
[444] Fix | Delete
];
[445] Fix | Delete
} else {
[446] Fix | Delete
$alerts[] = [
[447] Fix | Delete
'code' => 'license_not_valid',
[448] Fix | Delete
'message' => sprintf( __( 'You have invalid or expired license keys for Popup Maker. Please go to the %1$sLicenses page%2$s to correct this issue.', 'popup-maker' ), '<a href="' . admin_url( 'edit.php?post_type=popup&page=pum-settings&tab=licenses' ) . '">', '</a>' ),
[449] Fix | Delete
'type' => 'error',
[450] Fix | Delete
'dismissible' => '4 weeks',
[451] Fix | Delete
'priority' => 0,
[452] Fix | Delete
];
[453] Fix | Delete
}
[454] Fix | Delete
[455] Fix | Delete
return $alerts;
[456] Fix | Delete
}
[457] Fix | Delete
[458] Fix | Delete
/**
[459] Fix | Delete
* Admin notices for errors
[460] Fix | Delete
*
[461] Fix | Delete
* @access public
[462] Fix | Delete
* @return void
[463] Fix | Delete
*/
[464] Fix | Delete
public function notices() {
[465] Fix | Delete
[466] Fix | Delete
static $showed_invalid_message;
[467] Fix | Delete
[468] Fix | Delete
if ( empty( $this->license ) ) {
[469] Fix | Delete
return;
[470] Fix | Delete
}
[471] Fix | Delete
[472] Fix | Delete
if ( ! current_user_can( 'manage_options' ) || $showed_invalid_message ) {
[473] Fix | Delete
return;
[474] Fix | Delete
}
[475] Fix | Delete
[476] Fix | Delete
$messages = [];
[477] Fix | Delete
[478] Fix | Delete
$license = get_option( $this->item_shortname . '_license_active' );
[479] Fix | Delete
[480] Fix | Delete
if ( is_object( $license ) && 'valid' !== $license->license ) {
[481] Fix | Delete
[482] Fix | Delete
if ( empty( $_GET['tab'] ) || 'licenses' !== $_GET['tab'] ) {
[483] Fix | Delete
[484] Fix | Delete
$messages[] = sprintf( __( 'You have invalid or expired license keys for Popup Maker. Please go to the %1$sLicenses page%2$s to correct this issue.', 'popup-maker' ), '<a href="' . admin_url( 'edit.php?post_type=popup&page=pum-settings&tab=licenses' ) . '">', '</a>' );
[485] Fix | Delete
[486] Fix | Delete
$showed_invalid_message = true;
[487] Fix | Delete
[488] Fix | Delete
}
[489] Fix | Delete
}
[490] Fix | Delete
[491] Fix | Delete
if ( ! empty( $messages ) ) {
[492] Fix | Delete
[493] Fix | Delete
foreach ( $messages as $message ) {
[494] Fix | Delete
[495] Fix | Delete
echo '<div class="error">';
[496] Fix | Delete
echo '<p>' . esc_html( $message ) . '</p>';
[497] Fix | Delete
echo '</div>';
[498] Fix | Delete
[499] Fix | Delete
12
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function