File: //home/mirz4654/www/wp-content/plugins/wp-rocket/inc/classes/admin/settings/class-render.php
<?php
namespace WP_Rocket\Admin\Settings;
use WP_Rocket\Abstract_Render;
defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
/**
* Handle rendering of HTML content for the settings page.
*
* @since 3.0
* @author Remy Perona
*/
class Render extends Abstract_render {
/**
* Settings array
*
* @since 3.0
* @author Remy Perona
*
* @var array
*/
private $settings = array();
/**
* Hidden settings array
*
* @since 3.0
* @author Remy Perona
*
* @var array
*/
private $hidden_settings;
/**
* Sets the settings value
*
* @since 3.0
* @author Remy Perona
*
* @param array $settings Array of settings.
* @return void
*/
public function set_settings( $settings ) {
$this->settings = (array) $settings;
}
/**
* Sets the hidden settings value
*
* @since 3.0
* @author Remy Perona
*
* @param array $hidden_settings Array of hidden settings.
* @return void
*/
public function set_hidden_settings( $hidden_settings ) {
$this->hidden_settings = $hidden_settings;
}
/**
* Renders the page sections navigation
*
* @since 3.0
* @author Remy Perona
*
* @return void
*/
public function render_navigation() {
/**
* Filters WP Rocket settings page navigation items.
*
* @since 3.0
* @author Remy Perona
*
* @param array $navigation {
* Items to populate the navigation.
*
* @type string $id Page section identifier.
* @type string $title Menu item title.
* @type string $menu_description Menu item description.
* @type string $class Menu item classes
* }
*/
$navigation = apply_filters( 'rocket_settings_menu_navigation', $this->settings );
$default = [
'id' => '',
'title' => '',
'menu_description' => '',
'class' => '',
];
$navigation = array_map(
function( array $item ) use ( $default ) {
$item = wp_parse_args( $item, $default );
if ( ! empty( $item['class'] ) ) {
$item['class'] = implode( ' ', array_map( 'sanitize_html_class', $item['class'] ) );
}
unset( $item['sections'] );
return $item;
},
$navigation
);
echo $this->generate( 'navigation', $navigation );
}
/**
* Render the page sections.
*
* @since 3.0
* @author Remy Perona
*/
public function render_form_sections() {
if ( ! isset( $this->settings ) ) {
return;
}
foreach ( $this->settings as $id => $args ) {
$default = [
'title' => '',
'menu_description' => '',
'class' => '',
];
$args = wp_parse_args( $args, $default );
$id = str_replace( '_', '-', $id );
echo $this->generate( 'page-sections/' . $id, $args );
}
}
/**
* Render the Imagify page section.
*
* @since 3.2
* @author Remy Perona
*/
public function render_imagify_section() {
echo $this->generate( 'page-sections/imagify' );
}
/**
* Render the Tutorials page section.
*
* @since 3.4
* @author Remy Perona
*/
public function render_tutorials_section() {
echo $this->generate( 'page-sections/tutorials' );
}
/**
* Render the tools page section.
*
* @since 3.0
* @author Remy Perona
*/
public function render_tools_section() {
echo $this->generate( 'page-sections/tools' );
}
/**
* Renders the settings sections for a page section.
*
* @since 3.0
* @author Remy Perona
*
* @param string $page Page section identifier.
* @return void
*/
public function render_settings_sections( $page ) {
if ( ! isset( $this->settings[ $page ]['sections'] ) ) {
return;
}
foreach ( $this->settings[ $page ]['sections'] as $args ) {
$default = [
'type' => 'fields_container',
'title' => '',
'description' => '',
'class' => '',
'help' => '',
'helper' => '',
'page' => '',
];
$args = wp_parse_args( $args, $default );
if ( ! empty( $args['class'] ) ) {
$args['class'] = implode( ' ', array_map( 'sanitize_html_class', $args['class'] ) );
}
call_user_func_array( array( $this, $args['type'] ), array( $args ) );
}
}
/**
* Renders the settings fields for a setting section and page.
*
* @since 3.0
* @author Remy Perona
*
* @param string $page Page section identifier.
* @param string $section Settings section identifier.
* @return void
*/
public function render_settings_fields( $page, $section ) {
if ( ! isset( $this->settings[ $page ]['sections'][ $section ]['fields'] ) ) {
return;
}
foreach ( $this->settings[ $page ]['sections'][ $section ]['fields'] as $args ) {
$default = [
'type' => 'text',
'label' => '',
'description' => '',
'class' => '',
'container_class' => '',
'default' => '',
'helper' => '',
'placeholder' => '',
'parent' => '',
'section' => '',
'page' => '',
'sanitize_callback' => 'sanitize_text_field',
'input_attr' => '',
'warning' => [],
];
$args = wp_parse_args( $args, $default );
if ( ! empty( $args['input_attr'] ) ) {
$input_attr = '';
foreach ( $args['input_attr'] as $key => $value ) {
if ( 'disabled' === $key ) {
if ( 1 === $value ) {
$input_attr .= ' disabled';
}
continue;
}
$input_attr .= ' ' . sanitize_key( $key ) . '="' . esc_attr( $value ) . '"';
}
$args['input_attr'] = $input_attr;
}
if ( ! empty( $args['parent'] ) ) {
$args['parent'] = ' data-parent="' . esc_attr( $args['parent'] ) . '"';
}
if ( ! empty( $args['class'] ) ) {
$args['class'] = implode( ' ', array_map( 'sanitize_html_class', $args['class'] ) );
}
if ( ! empty( $args['container_class'] ) ) {
$args['container_class'] = implode( ' ', array_map( 'sanitize_html_class', $args['container_class'] ) );
}
call_user_func_array( array( $this, $args['type'] ), array( $args ) );
}
}
/**
* Renders hidden fields in the form.
*
* @since 3.0
* @author Remy Perona
*
* @return void
*/
public function render_hidden_fields() {
foreach ( $this->hidden_settings as $setting ) {
call_user_func_array( array( $this, 'hidden' ), array( $setting ) );
}
}
/**
* Displays the fields container section template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function fields_container( $args ) {
echo $this->generate( 'sections/fields-container', $args );
}
/**
* Displays the no container section template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function nocontainer( $args ) {
echo $this->generate( 'sections/nocontainer', $args );
}
/**
* Displays the add-ons container section template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function addons_container( $args ) {
echo $this->generate( 'sections/addons-container', $args );
}
/**
* Displays the text field template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function text( $args ) {
echo $this->generate( 'fields/text', $args );
}
/**
* Displays the checkbox field template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function checkbox( $args ) {
echo $this->generate( 'fields/checkbox', $args );
}
/**
* Displays the textarea field template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function textarea( $args ) {
if ( is_array( $args['value'] ) ) {
$args['value'] = implode( "\n", $args['value'] );
}
$args['value'] = empty( $args['value'] ) ? '' : $args['value'];
echo $this->generate( 'fields/textarea', $args );
}
/**
* Displays the sliding checkbox field template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function sliding_checkbox( $args ) {
echo $this->generate( 'fields/sliding-checkbox', $args );
}
/**
* Displays the number input field template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function number( $args ) {
echo $this->generate( 'fields/number', $args );
}
/**
* Displays the select field template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function select( $args ) {
echo $this->generate( 'fields/select', $args );
}
/**
* Displays the clear cache lifespan block template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function cache_lifespan( $args ) {
echo $this->generate( 'fields/cache-lifespan', $args );
}
/**
* Displays the hidden field template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function hidden( $args ) {
echo $this->generate( 'fields/hidden', $args );
}
/**
* Displays the CDN CNAMES template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function cnames( $args ) {
echo $this->generate( 'fields/cnames', $args );
}
/**
* Displays the one-click add-on field template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function one_click_addon( $args ) {
echo $this->generate( 'fields/one-click-addon', $args );
}
/**
* Displays the Rocket add-on field template.
*
* @since 3.0
* @author Remy Perona
*
* @param array $args Array of arguments to populate the template.
* @return void
*/
public function rocket_addon( $args ) {
echo $this->generate( 'fields/rocket-addon', $args );
}
/**
* Displays the import form template.
*
* @since 3.0
* @author Remy Perona
*
* @return void
*/
public function render_import_form() {
$args = array();
/**
* Filter the maximum allowed upload size for import files.
*
* @since (WordPress) 2.3.0
*
* @see wp_max_upload_size()
*
* @param int $max_upload_size Allowed upload size. Default 1 MB.
*/
$args['bytes'] = apply_filters( 'import_upload_size_limit', wp_max_upload_size() ); // Filter from WP Core.
$args['size'] = size_format( $args['bytes'] );
$args['upload_dir'] = wp_upload_dir();
$args['action'] = 'rocket_import_settings';
$args['submit_text'] = __( 'Upload file and import settings', 'rocket' );
echo $this->generate( 'fields/import-form', $args );
}
/**
* Displays the button template.
*
* @since 3.0
* @author Remy Perona
*
* @param string $type Type of button (can be button or link).
* @param string $action Action to be performed.
* @param array $args Optional array of arguments to populate the button attributes.
* @return void
*/
public function render_action_button( $type, $action, $args = array() ) {
$default = [
'label' => '',
'action' => '',
'url' => '',
'parameter' => '',
'attributes' => '',
];
$args = wp_parse_args( $args, $default );
if ( ! empty( $args['attributes'] ) ) {
$attributes = '';
foreach ( $args['attributes'] as $key => $value ) {
$attributes .= ' ' . sanitize_key( $key ) . '="' . esc_attr( $value ) . '"';
}
$args['attributes'] = $attributes;
}
switch ( $type ) {
case 'link':
switch ( $action ) {
case 'ask_support':
$args['url'] = rocket_get_external_url( 'support', array(
'utm_source' => 'wp_plugin',
'utm_medium' => 'wp_rocket',
) );
break;
case 'view_account':
$args['url'] = rocket_get_external_url( 'account', array(
'utm_source' => 'wp_plugin',
'utm_medium' => 'wp_rocket',
) );
break;
case 'purge_cache':
$url = admin_url( 'admin-post.php?action=' . $action );
if ( isset( $args['parameters'] ) ) {
$url = add_query_arg( $args['parameters'], $url );
}
$args['url'] = wp_nonce_url( $url, $action . '_all' );
break;
case 'preload':
case 'rocket_purge_opcache':
case 'rocket_purge_cloudflare':
case 'rocket_purge_sucuri':
case 'rocket_rollback':
case 'rocket_export':
case 'rocket_generate_critical_css':
$url = admin_url( 'admin-post.php?action=' . $action );
if ( ! empty( $args['parameters'] ) ) {
$url = add_query_arg( $args['parameters'], $url );
}
$args['url'] = wp_nonce_url( $url, $action );
break;
case 'documentation':
$args['url'] = get_rocket_documentation_url();
break;
}
echo $this->generate( 'buttons/link', $args );
break;
default:
$args['action'] = $action;
echo $this->generate( 'buttons/button', $args );
break;
}
}
/**
* Displays a partial template.
*
* @since 3.0
* @author Remy Perona
*
* @param string $part Partial template name.
*
* @return void
*/
public function render_part( $part ) {
echo $this->generate( 'partials/' . $part );
}
}