1009 lines
31 KiB
PHP
1009 lines
31 KiB
PHP
<?php
|
|
|
|
if ( ! function_exists( 'is_plugin_active' ) ) {
|
|
include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
|
|
}
|
|
|
|
/**
|
|
* Get home URL
|
|
*
|
|
* @return string
|
|
*/
|
|
function ppw_core_get_home_url_with_ssl() {
|
|
return is_ssl() ? home_url( '/', 'https' ) : home_url( '/' );
|
|
}
|
|
|
|
/**
|
|
* Get current role
|
|
*
|
|
* @return array
|
|
*/
|
|
function ppw_core_get_current_role() {
|
|
if ( ! is_user_logged_in() ) {
|
|
return array();
|
|
}
|
|
|
|
$current_user = wp_get_current_user();
|
|
if ( is_multisite() && is_super_admin( $current_user->ID ) ) {
|
|
return array( 'administrator' );
|
|
}
|
|
|
|
return $current_user->roles;
|
|
}
|
|
|
|
/**
|
|
* Get settings
|
|
*
|
|
* @param $name_settings
|
|
* @param $blog_id
|
|
*
|
|
* @return mixed
|
|
*/
|
|
function ppw_core_get_settings( $name_settings, $blog_id = false ) {
|
|
return ppw_core_get_settings_by_option_name( $name_settings, PPW_Constants::GENERAL_OPTIONS, $blog_id );
|
|
}
|
|
|
|
/**
|
|
* Get settings
|
|
*
|
|
* @param string $setting_name Setting name.
|
|
* @param string $option_name Option name.
|
|
* @param int|false $blog_id Blog ID.
|
|
*
|
|
* @return mixed
|
|
* @since 1.4.2
|
|
*/
|
|
function ppw_core_get_settings_by_option_name( $setting_name, $option_name, $blog_id = false ) {
|
|
$settings = ! $blog_id ? get_option( $option_name, false ) : get_blog_option( $blog_id, $option_name, false );
|
|
$default_result = null;
|
|
if ( ! $settings ) {
|
|
return $default_result;
|
|
}
|
|
|
|
$options = json_decode( $settings );
|
|
if ( ! isset( $options->$setting_name ) ) {
|
|
return $default_result;
|
|
}
|
|
|
|
return $options->$setting_name;
|
|
}
|
|
|
|
/**
|
|
* Get settings entire site
|
|
*
|
|
* @param $name_settings
|
|
*
|
|
* @return mixed
|
|
*/
|
|
function ppw_core_get_settings_entire_site( $name_settings ) {
|
|
$settings = get_option( PPW_Constants::ENTIRE_SITE_OPTIONS, false );
|
|
$default_result = null;
|
|
$options = ppw_free_fix_serialize_data( $settings, false );
|
|
if ( empty( $options ) || ! isset( $options[ $name_settings ] ) ) {
|
|
return $default_result;
|
|
}
|
|
|
|
return $options[ $name_settings ];
|
|
}
|
|
|
|
/**
|
|
* Get setting type is bool
|
|
*
|
|
* @param string $setting_name Setting name.
|
|
* @param int|false $blog_id Blog ID.
|
|
*
|
|
* @return bool
|
|
*/
|
|
function ppw_core_get_setting_type_bool( $setting_name, $blog_id = false ) {
|
|
$setting = ppw_core_get_settings( $setting_name, $blog_id );
|
|
|
|
return 'true' === $setting || '1' === $setting;
|
|
}
|
|
|
|
/**
|
|
* Get setting type is bool
|
|
*
|
|
* @param string $setting_name Setting name.
|
|
* @param string $option_name Option name.
|
|
* @param int|false $blog_id Blog ID.
|
|
*
|
|
* @return bool
|
|
* @since 1.4.2
|
|
*
|
|
*/
|
|
function ppw_core_get_setting_type_bool_by_option_name( $setting_name, $option_name, $blog_id = false ) {
|
|
$setting = ppw_core_get_settings_by_option_name( $setting_name, $option_name, $blog_id );
|
|
|
|
return 'true' === $setting || '1' === $setting;
|
|
}
|
|
|
|
/**
|
|
* Get setting type is string
|
|
*
|
|
* @param string $setting_name The setting name.
|
|
* @param string $option_name Option name.
|
|
*
|
|
* @return string
|
|
* @since 1.4.2
|
|
*/
|
|
function ppw_core_get_setting_type_string_by_option_name( $setting_name, $option_name ) {
|
|
$setting = ppw_core_get_settings_by_option_name( $setting_name, $option_name );
|
|
|
|
return is_string( $setting ) ? $setting : '';
|
|
}
|
|
|
|
/**
|
|
* Get setting type is array
|
|
*
|
|
* @param string $setting_name Setting name.
|
|
* @param string $option_name Option name.
|
|
*
|
|
* @return array
|
|
* @since 1.4.2
|
|
*/
|
|
function ppw_core_get_setting_type_array_by_option_name( $setting_name, $option_name ) {
|
|
$setting = ppw_core_get_settings_by_option_name( $setting_name, $option_name );
|
|
|
|
return ! is_array( $setting ) ? array() : $setting;
|
|
}
|
|
|
|
/**
|
|
* Get setting type is string
|
|
*
|
|
* @param string $name_settings The setting name.
|
|
*
|
|
* @return string
|
|
*/
|
|
function ppw_core_get_setting_type_string( $name_settings ) {
|
|
$setting = ppw_core_get_settings( $name_settings );
|
|
|
|
return is_string( $setting ) ? $setting : '';
|
|
}
|
|
|
|
/**
|
|
* Get setting type is array
|
|
*
|
|
* @param $name_settings
|
|
*
|
|
* @return array
|
|
*/
|
|
function ppw_core_get_setting_type_array( $name_settings ) {
|
|
$setting = ppw_core_get_settings( $name_settings );
|
|
|
|
return ! is_array( $setting ) ? array() : $setting;
|
|
}
|
|
|
|
/**
|
|
* Get setting entire site type is bool
|
|
*
|
|
* @param $name_settings
|
|
*
|
|
* @return bool
|
|
*/
|
|
function ppw_core_get_setting_entire_site_type_bool( $name_settings ) {
|
|
return 'true' === ppw_core_get_settings_entire_site( $name_settings );
|
|
}
|
|
|
|
/**
|
|
* Get setting entire site type is string
|
|
*
|
|
* @param $name_settings
|
|
*
|
|
* @return string
|
|
*/
|
|
function ppw_core_get_setting_entire_site_type_string( $name_settings ) {
|
|
$setting = ppw_core_get_settings_entire_site( $name_settings );
|
|
|
|
return is_string( $setting ) ? $setting : '';
|
|
}
|
|
|
|
/**
|
|
* Get setting entire site type is array
|
|
*
|
|
* @param $name_settings
|
|
*
|
|
* @return array
|
|
*/
|
|
function ppw_core_get_setting_entire_site_type_array( $name_settings ) {
|
|
$setting = ppw_core_get_settings_entire_site( $name_settings );
|
|
|
|
return ! is_array( $setting ) ? array() : $setting;
|
|
}
|
|
|
|
function ppw_core_get_query_param() {
|
|
$_server = wp_unslash( $_SERVER );
|
|
$current_url = esc_url_raw( ( isset( $_server['HTTPS'] ) && 'on' === $_server['HTTPS'] ? 'https' : 'http' ) . "://$_server[HTTP_HOST]$_server[REQUEST_URI]" );
|
|
$query_str = parse_url( $current_url, PHP_URL_QUERY );
|
|
parse_str( $query_str, $query_params );
|
|
|
|
return $query_params;
|
|
}
|
|
|
|
/**
|
|
* Render form login
|
|
*
|
|
* @return mixed
|
|
*/
|
|
function ppw_core_render_login_form() {
|
|
/**
|
|
* Get value for Password Form
|
|
*/
|
|
global $post;
|
|
$post_id = $post->ID;
|
|
$query_params = ppw_core_get_query_param();
|
|
$wrong_password = array_key_exists( PPW_Constants::WRONG_PASSWORD_PARAM, $query_params ) && 'true' === $query_params[ PPW_Constants::WRONG_PASSWORD_PARAM ];
|
|
$default_wrong_error_message = apply_filters( PPW_Constants::HOOK_MESSAGE_ENTERING_WRONG_PASSWORD, PPW_Constants::DEFAULT_WRONG_PASSWORD_MESSAGE );
|
|
$instruction_text = apply_filters( PPW_Constants::HOOK_MESSAGE_PASSWORD_FORM, PPW_Constants::DEFAULT_FORM_MESSAGE );
|
|
$label = 'pwbox-' . ( empty( $post_id ) ? wp_rand() : $post_id );
|
|
|
|
// phpcs:disable
|
|
$submit_label = wp_kses_post( get_theme_mod( 'ppwp_form_button_label', PPW_Constants::DEFAULT_SUBMIT_LABEL ) );
|
|
$password_label = wp_kses_post( get_theme_mod( 'ppwp_form_instructions_password_label', PPW_Constants::DEFAULT_PASSWORD_LABEL ) );
|
|
$place_holder = wp_kses_post( get_theme_mod( 'ppwp_form_instructions_placeholder', PPW_Constants::DEFAULT_PLACEHOLDER ) );
|
|
$headline_text = wp_kses_post( get_theme_mod( 'ppwp_form_instructions_headline', PPW_Constants::DEFAULT_HEADLINE_TEXT ) );
|
|
$form_message = wp_kses_post( get_theme_mod( 'ppwp_form_instructions_text', $instruction_text ) );
|
|
$wrong_password_text = wp_kses_post( get_theme_mod( 'ppwp_form_error_message_text', $default_wrong_error_message ) );
|
|
$show_password_text = wp_kses_post( get_theme_mod( 'ppwp_form_instructions_show_password_text', PPW_Constants::DEFAULT_SHOW_PASSWORD_TEXT ) );
|
|
|
|
/**
|
|
* I18N
|
|
*
|
|
*/
|
|
$submit_label = _x( $submit_label, PPW_Constants::CONTEXT_PASSWORD_FORM, 'password-protect-page' );
|
|
$password_label = _x( $password_label, PPW_Constants::CONTEXT_PASSWORD_FORM, 'password-protect-page' );
|
|
$place_holder = _x( $place_holder, PPW_Constants::CONTEXT_PASSWORD_FORM, 'password-protect-page' );
|
|
$headline_text = _x( $headline_text, PPW_Constants::CONTEXT_PASSWORD_FORM, 'password-protect-page' );
|
|
$form_message = _x( $form_message, PPW_Constants::CONTEXT_PASSWORD_FORM, 'password-protect-page' );
|
|
$wrong_password_text = _x( $wrong_password_text, PPW_Constants::CONTEXT_PASSWORD_FORM, 'password-protect-page' );
|
|
// phpcs:enable
|
|
$show_password_text = _x( $show_password_text, PPW_Constants::CONTEXT_PASSWORD_FORM, 'password-protect-page' );
|
|
|
|
/**
|
|
* Fire hooks that can customize the from text.
|
|
* Update the customize attributes that easier for user to customize.
|
|
*/
|
|
$customized_elements = apply_filters(
|
|
'ppwp_customize_ppf',
|
|
array(
|
|
'submit_label' => $submit_label,
|
|
'password_label' => $password_label,
|
|
'description' => $form_message,
|
|
'headline' => $headline_text,
|
|
'error_msg' => $wrong_password_text,
|
|
'show_password_label' => $show_password_text,
|
|
),
|
|
$post_id
|
|
);
|
|
$submit_label = $customized_elements['submit_label'];
|
|
$password_label = $customized_elements['password_label'];
|
|
$form_message = $customized_elements['description'];
|
|
$headline_text = $customized_elements['headline'];
|
|
$wrong_password_text = $customized_elements['error_msg'];
|
|
$show_password_text = $customized_elements['show_password_label'];
|
|
|
|
// We need to wrap the div for input to prevent the <p> tag generated when view HTML source.
|
|
$show_password = get_theme_mod( 'ppwp_form_instructions_is_show_password', PPW_Constants::DEFAULT_IS_SHOW_PASSWORD ) ? '<div class="ppw-ppf-show-pwd-btn" ><input id="ppw_' . $post_id . '" onclick="ppwShowPassword(' . $post_id . ')" type="checkbox"/><label for="ppw_' . $post_id . '">' . _x( $show_password_text, PPW_Constants::CONTEXT_PASSWORD_FORM, 'password-protect-page' ) . '</label></div>' : '';
|
|
/**
|
|
* Generate Password Form.
|
|
*/
|
|
|
|
if ( ! empty( $wrong_password_text ) ) {
|
|
$wrong_password_message = sprintf(
|
|
'<div class="ppwp-wrong-pw-error ppw-ppf-error-msg">%1$s</div>',
|
|
$wrong_password_text
|
|
);
|
|
} else {
|
|
$wrong_password_message = '';
|
|
}
|
|
$wrong_message = $wrong_password ? $wrong_password_message : '';
|
|
|
|
if ( PPW_Recaptcha::get_instance()->using_single_recaptcha() ) {
|
|
$recaptcha_input = PPW_Recaptcha::get_instance()->get_recaptcha_input();
|
|
} else {
|
|
$recaptcha_input = '';
|
|
}
|
|
|
|
$inputs = array(
|
|
'<label class="ppw-pwd-label" for="' . esc_attr( $label ) . '">' . $password_label . '<input placeholder="' . esc_attr( $place_holder ) . '" name="post_password" id="' . esc_attr( $label ) . '" type="password" size="20"/></label> ',
|
|
$recaptcha_input,
|
|
);
|
|
|
|
$input_button = '<input class="ppw-pwd-submit-btn" type="submit" name="Submit" value="' . esc_attr( $submit_label ) . '"/>';
|
|
|
|
$inputs = apply_filters( 'ppw_single_form_fields', $inputs, $post_id );
|
|
$inputs_html = implode( '', $inputs );
|
|
|
|
// Use Output Buffer Steam instead of HTML string contact because
|
|
// 1. When concat HTML string it will append the <p> tag (view HTML source)
|
|
// 2. Code cleaner and easy to maintain.
|
|
// Warning: DO NOT FORMAT CODE HERE.
|
|
ob_start();
|
|
?>
|
|
<div class="ppw-ppf-input-container">
|
|
<?php
|
|
if ( ! empty( $headline_text ) ) {
|
|
?>
|
|
<div class="ppw-ppf-headline"><?php echo $headline_text; // phpcs:ignore -- we cannot escape html ?></div>
|
|
<?php
|
|
}
|
|
?>
|
|
<div class="ppw-ppf-desc"><?php echo $form_message; // phpcs:ignore -- there are no value to escape from this html ?></div>
|
|
<p class="ppw-ppf-field-container">
|
|
<?php do_action('ppwp_ppf_fields_before_password') ?>
|
|
<?php echo $inputs_html ?>
|
|
<?php do_action('ppwp_ppf_fields_after_password') ?>
|
|
<?php echo $input_button ?>
|
|
</p><?php if ( ! empty( $show_password ) ) echo $show_password; // phpcs:ignore -- we cannot escape html?></div>
|
|
<?php if ( ! empty( $wrong_message ) ) echo $wrong_message; // phpcs:ignore -- we cannot escape html?>
|
|
<?php
|
|
$default_element = ob_get_clean();
|
|
|
|
// Fire hook here that user can customise the Password Form element.
|
|
$form_content = apply_filters( PPW_Constants::HOOK_CUSTOM_PASSWORD_FORM, $default_element, $post_id, $wrong_message );
|
|
$script = '';
|
|
if ( ! empty( $show_password ) ) {
|
|
$script = '
|
|
<div>
|
|
<script>
|
|
function ppwShowPassword(postId) {
|
|
const ppwBox = document.getElementById(\'pwbox-\' + postId);
|
|
if ( document.getElementById(\'ppw_\' + postId ).checked == true ) {
|
|
ppwBox.setAttribute(\'type\', \'text\');
|
|
} else {
|
|
ppwBox.setAttribute(\'type\', \'password\');
|
|
}
|
|
}
|
|
</script>
|
|
</div>';
|
|
}
|
|
|
|
// This is the a hotfix:
|
|
// Need to encode the query string value to prevent Suspicious Query String.
|
|
// https://stackoverflow.com/questions/996139/urlencode-vs-rawurlencode.
|
|
$callback_value = rawurlencode( apply_filters( PPW_Constants::HOOK_CALLBACK_URL, get_permalink() ) );
|
|
// When no-referer policy turns on we need to append the callback's URL in the form action URL.
|
|
// That helps the user can redirect to the right post/page.
|
|
|
|
/**
|
|
* Some plugins or hosting can edit wp-login to another name and prevent it.
|
|
* So need to put wp-login.php path of site_url function.
|
|
*/
|
|
$url = site_url( 'wp-login.php', 'login_post' );
|
|
$url = add_query_arg(
|
|
array(
|
|
'action' => 'ppw_postpass',
|
|
PPW_Constants::CALL_BACK_URL_PARAM => $callback_value
|
|
),
|
|
$url
|
|
);
|
|
|
|
// With this filter user can choose another action URL to use PPF Form.
|
|
$url = apply_filters( 'ppwp_ppf_action_url', $url );
|
|
|
|
// Need to wrap the form by parent div because HTML will pre-append the </br> without parent div.
|
|
// TODO: move to view file.
|
|
ob_start();
|
|
?>
|
|
<div class="ppw-post-password-container">
|
|
<form action="<?php echo esc_attr( esc_url( $url ) ); ?>" class="ppw-post-password-form post-password-form" method="post"><?php echo $form_content; // phpcs:ignore -- we cannot escape html ?><div><input type="hidden" name="post_id" value="<?php echo esc_attr( $post_id ); ?>"/></div></form><?php echo ! empty( $script ) ? $script : ''; // phpcs:ignore -- there are no value to esacpe with js ?>
|
|
</div>
|
|
<?php
|
|
$output = ob_get_clean();
|
|
|
|
if ( ppw_core_get_no_load_page_option() ) {
|
|
static $instance = 0;
|
|
if ( $instance === 0 ) {
|
|
$instance++;
|
|
wp_enqueue_script( 'ppw-single-password-form', PPW_DIR_URL . 'core/js/single-password-form.js', array( 'jquery' ), PPW_VERSION, true );
|
|
wp_localize_script(
|
|
"ppw-single-password-form",
|
|
'ppw_data',
|
|
array(
|
|
'ajaxUrl' => admin_url( 'admin-ajax.php' ),
|
|
'nonce' => wp_create_nonce( 'ppw_password_nonce' ),
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
|
|
/**
|
|
* Get "No reload page" option value
|
|
*
|
|
* @return bool
|
|
*/
|
|
function ppw_core_get_no_load_page_option() {
|
|
if ( defined( 'PPW_PPF_NOT_RELOAD' ) ) {
|
|
return PPW_PPF_NOT_RELOAD;
|
|
}
|
|
// Check user turn on our option.
|
|
$allowed = ppw_core_get_setting_type_bool_by_option_name( 'wpp_no_reload_page', PPW_Constants::MISC_OPTIONS );
|
|
if ( ! $allowed ) {
|
|
return false;
|
|
}
|
|
|
|
// Not handle with product because we are not render product layout so it make wrong UI.
|
|
$excluded = ( function_exists( 'is_product' ) && is_product() )
|
|
|| ( function_exists( 'is_shop') && is_shop() );
|
|
$excluded = apply_filters( 'ppw_not_reload_excluded', $excluded );
|
|
|
|
if ( $excluded ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Get all post types
|
|
*
|
|
* @param string $output Value to output.
|
|
*
|
|
* @return array Array Post types
|
|
*
|
|
*/
|
|
function ppw_core_get_all_post_types( $output = 'objects' ) {
|
|
$args = array(
|
|
'public' => true,
|
|
);
|
|
$post_types = get_post_types( $args, $output );
|
|
unset( $post_types['attachment'] );
|
|
|
|
return $post_types;
|
|
}
|
|
|
|
/**
|
|
* Get unit time
|
|
*
|
|
* @param $password_cookie_expired
|
|
*
|
|
* @return int
|
|
*/
|
|
function ppw_core_get_unit_time( $password_cookie_expired ) {
|
|
$time_die = explode( " ", $password_cookie_expired );
|
|
$unit = 0;
|
|
if ( count( $time_die ) === 2 ) {
|
|
if ( $time_die[1] === "minutes" ) {
|
|
$unit = 60;
|
|
} elseif ( $time_die[1] === "hours" ) {
|
|
$unit = 3600;
|
|
} elseif ( $time_die[1] === "days" ) {
|
|
$unit = 86400;
|
|
} elseif ( $time_die[1] === "seconds" ) {
|
|
$unit = 1;
|
|
}
|
|
}
|
|
|
|
return $unit;
|
|
}
|
|
|
|
/**
|
|
* Get all posts password protected by WordPress
|
|
*
|
|
* @return mixed
|
|
*/
|
|
function ppw_core_get_posts_password_protected_by_wp() {
|
|
$posts_type = apply_filters( PPW_Constants::HOOK_POST_TYPES, array( 'page', 'post' ) );
|
|
|
|
return get_posts(
|
|
array(
|
|
'post_status' => array(
|
|
'publish',
|
|
'pending',
|
|
'draft',
|
|
'auto-draft',
|
|
'future',
|
|
'private',
|
|
'trash',
|
|
),
|
|
'post_type' => $posts_type,
|
|
'numberposts' => - 1,
|
|
'has_password' => true,
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Check Pro version activated and license valid
|
|
*
|
|
* @return bool
|
|
*/
|
|
function is_pro_active_and_valid_license() {
|
|
$activated = ! is_plugin_active( PPW_Constants::PRO_DIRECTORY ) && ! is_plugin_active( PPW_Constants::DEV_PRO_DIRECTORY );
|
|
$activated = apply_filters( 'ppw_pro_activated', $activated );
|
|
|
|
if ( $activated ) {
|
|
return false;
|
|
}
|
|
$license_key = get_option( 'wp_protect_password_license_key', '' );
|
|
$is_valid_license = get_option( 'wp_protect_password_licensed' );
|
|
|
|
return ! empty( $license_key ) && ( '1' === $is_valid_license || true === $is_valid_license );
|
|
}
|
|
|
|
/**
|
|
* Load the pro libs.
|
|
*/
|
|
function ppw_core_load_pro_lib() {
|
|
if ( is_dir( WP_PLUGIN_DIR . '/' . PPW_Constants::PRO_ROOT_DIR ) ) {
|
|
require_once WP_PLUGIN_DIR . '/' . PPW_Constants::PRO_ROOT_DIR . '/yme-plugin-update-checker/plugin-update-checker.php';
|
|
} elseif ( is_dir( WP_PLUGIN_DIR . '/' . PPW_Constants::DEV_PRO_ROOT_DIR ) ) {
|
|
require_once WP_PLUGIN_DIR . '/' . PPW_Constants::DEV_PRO_ROOT_DIR . '/yme-plugin-update-checker/plugin-update-checker.php';
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param $cookie_expired
|
|
*
|
|
* @return bool
|
|
*/
|
|
function ppw_core_validate_cookie_expiry( $cookie_expired ) {
|
|
$cookie_expired_array = explode( ' ', $cookie_expired );
|
|
if ( 2 !== count( $cookie_expired_array ) ) {
|
|
return true;
|
|
}
|
|
|
|
$value = $cookie_expired_array[0];
|
|
if ( ! intval( $value ) ) {
|
|
return true;
|
|
}
|
|
|
|
$int_val = intval( $value );
|
|
if ( $int_val <= 0 ) {
|
|
return true;
|
|
}
|
|
|
|
$unit = $cookie_expired_array[1];
|
|
$max_cookie = 365;
|
|
switch ( $unit ) {
|
|
case 'days':
|
|
return $int_val > $max_cookie;
|
|
case 'hours':
|
|
return $int_val > $max_cookie * 24;
|
|
case 'minutes':
|
|
return $int_val > $max_cookie * 24 * 60;
|
|
case 'seconds':
|
|
return $int_val > $max_cookie * 24 * 60 * 60;
|
|
default:
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get param in url
|
|
*
|
|
* @param $url
|
|
*
|
|
* @return mixed
|
|
*/
|
|
function ppw_core_get_param_in_url( $url ) {
|
|
$query_str = parse_url( $url, PHP_URL_QUERY );
|
|
parse_str( $query_str, $query_params );
|
|
|
|
return $query_params;
|
|
}
|
|
|
|
/**
|
|
* Clean data in post meta
|
|
*
|
|
* @param $meta_key
|
|
* @param bool $blog_prefix
|
|
*
|
|
* @return mixed
|
|
*/
|
|
function ppw_core_delete_data_in_post_meta_by_meta_key( $meta_key, $blog_prefix = false ) {
|
|
global $wpdb;
|
|
$table_post_meta = ! $blog_prefix ? $wpdb->prefix . 'postmeta' : $blog_prefix . 'postmeta';
|
|
|
|
return $wpdb->delete( // phpcs:ignore -- WPCS: db call ok, cache ok.
|
|
$table_post_meta,
|
|
array(
|
|
'meta_key' => $meta_key, // phpcs:ignore -- WPCS: slow query ok.
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Clear cache for Cache plugin, includes: WP Super Cache, WP Fastest Cache and W3 Total Cache
|
|
*
|
|
* @param int|string $post_id The post ID.
|
|
*/
|
|
function ppw_core_clear_cache_by_id( $post_id ) {
|
|
// Clear cache for WP Super Cache plugin.
|
|
if ( function_exists( 'prune_super_cache' ) && function_exists( 'get_supercache_dir' ) ) {
|
|
global $blog_cache_dir;
|
|
prune_super_cache( $blog_cache_dir, true );
|
|
prune_super_cache( get_supercache_dir(), true );
|
|
}
|
|
|
|
// Clear cache for WP Fastest Cache plugin.
|
|
do_action( 'wpfc_clear_post_cache_by_id', false, $post_id );
|
|
|
|
// Clear cache for W3 Total Cache plugin.
|
|
do_action( 'w3tc_flush_url', get_permalink( $post_id ) );
|
|
}
|
|
|
|
/**
|
|
* Get default post options for feature "hide protect content"
|
|
*
|
|
* @param string $post_type The post type.
|
|
*
|
|
* @return array
|
|
*/
|
|
function ppw_core_get_default_post_options( $post_type ) {
|
|
$default_options = array();
|
|
if ( ppw_core_check_yoast_seo_turn_on_site_maps() ) {
|
|
$default_options = array(
|
|
PPW_Constants::XML_YOAST_SEO_SITEMAPS,
|
|
);
|
|
}
|
|
|
|
switch ( $post_type ) {
|
|
case 'page':
|
|
$default_page_options = array(
|
|
PPW_Constants::FRONT_PAGE,
|
|
PPW_Constants::EVERYWHERE_PAGE,
|
|
PPW_Constants::SEARCH_RESULTS,
|
|
);
|
|
|
|
return array_merge( $default_options, $default_page_options );
|
|
case 'post':
|
|
$default_post_options = array(
|
|
PPW_Constants::FRONT_PAGE,
|
|
PPW_Constants::CATEGORY_PAGE,
|
|
PPW_Constants::TAG_PAGE,
|
|
PPW_Constants::AUTHOR_PAGE,
|
|
PPW_Constants::ARCHIVES_PAGE,
|
|
PPW_Constants::NEXT_PREVIOUS,
|
|
PPW_Constants::RECENT_POST,
|
|
PPW_Constants::SEARCH_RESULTS,
|
|
PPW_Constants::FEEDS,
|
|
);
|
|
|
|
return array_merge( $default_options, $default_post_options );
|
|
default:
|
|
return array();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get post options for feature "Hide protect content"
|
|
*
|
|
* @param string $post_type The post type.
|
|
*
|
|
* @return array
|
|
*/
|
|
function ppw_core_get_position_hide_post( $post_type ) {
|
|
$options = array();
|
|
if ( ppw_core_check_yoast_seo_turn_on_site_maps() ) {
|
|
$options = array(
|
|
array(
|
|
'value' => PPW_Constants::XML_YOAST_SEO_SITEMAPS,
|
|
'label' => esc_html__( 'XML sitemaps', 'password-protect-page' ),
|
|
),
|
|
);
|
|
}
|
|
|
|
switch ( $post_type ) {
|
|
case 'page':
|
|
$page_options = array(
|
|
array(
|
|
'value' => PPW_Constants::FRONT_PAGE,
|
|
'label' => esc_html__( 'Front page', 'password-protect-page' ),
|
|
),
|
|
array(
|
|
'value' => PPW_Constants::EVERYWHERE_PAGE,
|
|
'label' => esc_html__( 'Everywhere pages are listed', 'password-protect-page' ),
|
|
),
|
|
array(
|
|
'value' => PPW_Constants::SEARCH_RESULTS,
|
|
'label' => esc_html__( 'Search results', 'password-protect-page' ),
|
|
),
|
|
);
|
|
|
|
return array_merge( $options, $page_options );
|
|
case 'post':
|
|
$post_options = array(
|
|
array(
|
|
'value' => PPW_Constants::FRONT_PAGE,
|
|
'label' => esc_html__( 'Front page', 'password-protect-page' ),
|
|
),
|
|
array(
|
|
'value' => PPW_Constants::CATEGORY_PAGE,
|
|
'label' => esc_html__( 'Category pages', 'password-protect-page' ),
|
|
),
|
|
array(
|
|
'value' => PPW_Constants::TAG_PAGE,
|
|
'label' => esc_html__( 'Tag pages', 'password-protect-page' ),
|
|
),
|
|
array(
|
|
'value' => PPW_Constants::AUTHOR_PAGE,
|
|
'label' => esc_html__( 'Author pages', 'password-protect-page' ),
|
|
),
|
|
array(
|
|
'value' => PPW_Constants::ARCHIVES_PAGE,
|
|
'label' => esc_html__( 'Archives', 'password-protect-page' ),
|
|
),
|
|
array(
|
|
'value' => PPW_Constants::NEXT_PREVIOUS,
|
|
'label' => esc_html__( 'Next & Previous', 'password-protect-page' ),
|
|
),
|
|
array(
|
|
'value' => PPW_Constants::RECENT_POST,
|
|
'label' => esc_html__( 'Recent posts', 'password-protect-page' ),
|
|
),
|
|
array(
|
|
'value' => PPW_Constants::SEARCH_RESULTS,
|
|
'label' => esc_html__( 'Search results', 'password-protect-page' ),
|
|
),
|
|
array(
|
|
'value' => PPW_Constants::FEEDS,
|
|
'label' => esc_html__( 'RSS', 'password-protect-page' ),
|
|
),
|
|
);
|
|
|
|
return array_merge( $options, $post_options );
|
|
default:
|
|
return array();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check site maps in Yoast SEO plugin
|
|
*
|
|
* @return bool
|
|
*/
|
|
function ppw_core_check_yoast_seo_turn_on_site_maps() {
|
|
if ( ! is_plugin_active( 'wordpress-seo/wp-seo.php' ) && ! is_plugin_active( 'wordpress-seo-premium/wp-seo-premium.php' ) ) {
|
|
return false;
|
|
}
|
|
|
|
if ( ! method_exists( 'WPSEO_Options', 'get' ) ) {
|
|
return false;
|
|
}
|
|
|
|
return WPSEO_Options::get( 'enable_xml_sitemap' );
|
|
}
|
|
|
|
/**
|
|
* Get post type for feature hide protected content
|
|
*
|
|
* @return array
|
|
*/
|
|
function ppw_core_get_post_type_for_hide_protect_content() {
|
|
$post_types = array_filter(
|
|
array_map(
|
|
function ( $type ) {
|
|
return array(
|
|
'value' => $type->name,
|
|
'label' => $type->label,
|
|
);
|
|
},
|
|
ppw_core_get_all_post_types()
|
|
),
|
|
function ( $type ) {
|
|
return 'post' !== $type['value'] && 'page' !== $type['value'];
|
|
}
|
|
);
|
|
|
|
array_unshift(
|
|
$post_types,
|
|
array(
|
|
'value' => 'page_post',
|
|
'label' => 'Pages & Posts',
|
|
)
|
|
);
|
|
|
|
return array_values( $post_types );
|
|
}
|
|
|
|
/**
|
|
* Check logic and add query
|
|
*
|
|
* @param string $position The position, example: front page, category, tag,....
|
|
* @param array $position_selected List position selected.
|
|
* @param array $protected_ids List ids protected.
|
|
* @param string $where The WHERE clause of the query.
|
|
* @param string $type page/post.
|
|
*
|
|
* @return string
|
|
*/
|
|
function ppw_core_add_query_by_position( $position, $position_selected, $protected_ids, $where, $type ) {
|
|
if ( ! in_array( $position, $position_selected, true ) ) {
|
|
return $where;
|
|
}
|
|
global $wpdb;
|
|
foreach ( $protected_ids as $id ) {
|
|
if ( get_post_type( $id ) !== $type ) {
|
|
continue;
|
|
}
|
|
$where .= " AND {$wpdb->posts}.ID != {$id}";
|
|
}
|
|
|
|
return $where;
|
|
}
|
|
|
|
/**
|
|
* Check logic and add query for posts
|
|
*
|
|
* @param array $position_selected List position selected.
|
|
* @param array $protected_ids all ids protected.
|
|
* @param string $where The WHERE clause of the query.
|
|
* @param string $type page/post.
|
|
*
|
|
* @return string
|
|
*/
|
|
function ppw_core_handle_logic_add_query( $position_selected, $protected_ids, $where, $type ) {
|
|
// Hide posts protected in home page.
|
|
if ( is_home() ) {
|
|
$where = ppw_core_add_query_by_position( PPW_Constants::FRONT_PAGE, $position_selected, $protected_ids, $where, $type );
|
|
}
|
|
// Hide posts protected in category page.
|
|
if ( is_category() ) {
|
|
$where = ppw_core_add_query_by_position( PPW_Constants::CATEGORY_PAGE, $position_selected, $protected_ids, $where, $type );
|
|
}
|
|
// Hide posts protected in search results page.
|
|
if ( is_search() ) {
|
|
$where = ppw_core_add_query_by_position( PPW_Constants::SEARCH_RESULTS, $position_selected, $protected_ids, $where, $type );
|
|
}
|
|
// Hide posts protected in tag page.
|
|
if ( is_tag() ) {
|
|
$where = ppw_core_add_query_by_position( PPW_Constants::TAG_PAGE, $position_selected, $protected_ids, $where, $type );
|
|
}
|
|
// Hide posts protected in author page.
|
|
if ( is_author() ) {
|
|
$where = ppw_core_add_query_by_position( PPW_Constants::AUTHOR_PAGE, $position_selected, $protected_ids, $where, $type );
|
|
}
|
|
// Hide posts protected in archive page.
|
|
if ( is_date() && is_archive() ) {
|
|
$where = ppw_core_add_query_by_position( PPW_Constants::ARCHIVES_PAGE, $position_selected, $protected_ids, $where, $type );
|
|
}
|
|
// Hide posts protected in feeds.
|
|
if ( is_feed() ) {
|
|
$where = ppw_core_add_query_by_position( PPW_Constants::FEEDS, $position_selected, $protected_ids, $where, $type );
|
|
}
|
|
|
|
return $where;
|
|
}
|
|
|
|
/**
|
|
* Check condition and push post_id/page_id protected to list exclude in site maps
|
|
*
|
|
* @param array $position_selected List position selected.
|
|
* @param array $protected_ids List ids protected.
|
|
* @param array $ids List page_id/post_id exclude in Yoast SEO XML Sitemaps.
|
|
* @param string $type page/post.
|
|
*
|
|
* @return array
|
|
*/
|
|
function ppw_core_list_posts_exclude_in_site_maps( $position_selected, $protected_ids, $ids, $type ) {
|
|
if ( ! in_array( PPW_Constants::XML_YOAST_SEO_SITEMAPS, $position_selected, true ) ) {
|
|
return $ids;
|
|
}
|
|
foreach ( $protected_ids as $id ) {
|
|
if ( get_post_type( $id ) !== $type ) {
|
|
continue;
|
|
}
|
|
array_push( $ids, $id );
|
|
}
|
|
|
|
return $ids;
|
|
}
|
|
|
|
/**
|
|
* Get positions selected for feature "Hide Protected Content"
|
|
* Default full options, if user customs then follow options in DB.
|
|
*
|
|
* @param string $post_type The post type.
|
|
*
|
|
* @return array
|
|
*/
|
|
function ppw_core_get_options_selected( $post_type ) {
|
|
$ppw_type_selected = ppw_core_get_setting_type_array( PPW_Constants::HIDE_SELECTED . $post_type );
|
|
$default_options_selected = apply_filters( PPW_Constants::HOOK_CUSTOM_DEFAULT_OPTIONS_HIDE_PROTECTED_POST, ppw_core_get_default_post_options( $post_type ), $post_type );
|
|
|
|
return empty( $ppw_type_selected ) ? $default_options_selected : $ppw_type_selected;
|
|
}
|
|
|
|
/**
|
|
* Render UI for feature "Hide Protected Content"
|
|
*
|
|
* @param array $ppw_post_types List post types.
|
|
*/
|
|
function ppw_core_check_logic_before_render_ui( $ppw_post_types ) {
|
|
foreach ( $ppw_post_types as $ppw_post_type ) {
|
|
if ( 'page_post' !== $ppw_post_type['value'] ) {
|
|
$is_pro_activated = apply_filters( PPW_Constants::HOOK_IS_PRO_ACTIVATE, false );
|
|
if ( $is_pro_activated ) {
|
|
$ppw_type = $ppw_post_type['value'];
|
|
$ppw_is_hide = ppw_core_get_setting_type_bool( PPW_Constants::HIDE_PROTECTED . $ppw_type );
|
|
$ppw_options_selected = ppw_core_get_options_selected( $ppw_type );
|
|
$ppw_options = apply_filters( PPW_Constants::HOOK_CUSTOM_POSITIONS_HIDE_PROTECTED_POST, ppw_core_get_position_hide_post( $ppw_type ), $ppw_type );
|
|
ppw_core_ui_hide_protected_content( $ppw_is_hide, $ppw_options, $ppw_options_selected, $ppw_type, $ppw_post_type['label'] );
|
|
}
|
|
} else {
|
|
foreach ( PPW_Constants::DEFAULT_POST_TYPE as $ppw_type ) {
|
|
$ppw_label = $ppw_type . 's';
|
|
$ppw_is_hide = ppw_core_get_setting_type_bool( PPW_Constants::HIDE_PROTECTED . $ppw_type );
|
|
$ppw_options_selected = ppw_core_get_options_selected( $ppw_type );
|
|
$ppw_options = apply_filters( PPW_Constants::HOOK_CUSTOM_POSITIONS_HIDE_PROTECTED_POST, ppw_core_get_position_hide_post( $ppw_type ), $ppw_type );
|
|
ppw_core_ui_hide_protected_content( $ppw_is_hide, $ppw_options, $ppw_options_selected, $ppw_type, $ppw_label );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Render UI for feature Hide Protected Content
|
|
*
|
|
* @param bool $ppw_hide On/Off option "Hide protected pages/posts from the following places".
|
|
* @param array $ppw_options All options of pages/posts.
|
|
* @param array $ppw_selected All option selected of pages/post.
|
|
* @param string $ppw_type type is Page/Post.
|
|
* @param string $ppw_label Label of Page/Post.
|
|
*/
|
|
function ppw_core_ui_hide_protected_content( $ppw_hide, $ppw_options, $ppw_selected, $ppw_type, $ppw_label ) {
|
|
$checked = $ppw_hide ? esc_attr( 'checked' ) : '';
|
|
$hide_element = $ppw_hide ? '' : esc_attr( 'ppw_hide_element' );
|
|
$required = $ppw_hide ? esc_attr( 'required' ) : '';
|
|
$options = '';
|
|
foreach ( $ppw_options as $ppw_page_option ) {
|
|
$post_selected = in_array( $ppw_page_option['value'], $ppw_selected, true ) ? esc_attr( 'selected' ) : '';
|
|
$value = esc_attr( $ppw_page_option['value'] );
|
|
$label = esc_attr( $ppw_page_option['label'] );
|
|
$options .= "<option $post_selected value='$value' >$label</option>";
|
|
}
|
|
// translators: %s: Subtitle.
|
|
$sub_title = sprintf( esc_html__( 'Exclude the password protected %s from the following views', 'password-protect-page' ), strtolower( $ppw_label ) );
|
|
$ppw_type = esc_attr( $ppw_type );
|
|
$checked = esc_attr( $checked );
|
|
$html_content = "
|
|
<tr class='ppw_wrap_$ppw_type ppw_hide_protect_content' style='display: none'>
|
|
<td></td>
|
|
<td>
|
|
<div class='ppw-wrap-hide-file-protected'>
|
|
<label class='pda_switch ppw-label-hide-file-protected'>
|
|
<input type='checkbox' id='ppw_hide_protected_{$ppw_type}' $checked />
|
|
<span class='pda-slider round'></span>
|
|
</label>
|
|
<p class='ppw-wrap-des-hide-file-protected'>
|
|
$sub_title
|
|
</p>
|
|
</div>
|
|
<div id='ppw_wrap_hide_selected_{$ppw_type}' class='ppw-wrap-select2-hide-file-protected $hide_element'>
|
|
<select $required id='ppw_hide_selected_{$ppw_type}' multiple='multiple' class='ppwp_select2'>
|
|
$options
|
|
</select>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
";
|
|
echo $html_content; // phpcs:ignores -- we already escape value inside the html
|
|
}
|
|
|
|
/**
|
|
* Error Message Handling
|
|
* @param int $post_id Post ID
|
|
* @return array $customize customize
|
|
*/
|
|
function ppw_core_get_error_msg( $post_id ) {
|
|
$default_message = apply_filters( PPW_Constants::HOOK_MESSAGE_ENTERING_WRONG_PASSWORD, PPW_Constants::DEFAULT_WRONG_PASSWORD_MESSAGE );
|
|
$message = wp_kses_post( get_theme_mod( 'ppwp_form_error_message_text', $default_message ) );
|
|
$customize = apply_filters(
|
|
'ppwp_customize_ppf',
|
|
array(
|
|
'submit_label' => '',
|
|
'password_label' => '',
|
|
'description' => '',
|
|
'headline' => '',
|
|
'error_msg' => $message,
|
|
'show_password_label' => '',
|
|
),
|
|
$post_id
|
|
);
|
|
return $customize['error_msg'];
|
|
}
|