modified file plugins

This commit is contained in:
2023-10-22 22:21:44 +00:00
committed by Gitium
parent c72a65abc1
commit 96c0ee892f
4817 changed files with 752216 additions and 0 deletions

View File

@ -0,0 +1,57 @@
.sections-no-sidebars.generate-sections-enabled .container.grid-container {
max-width: 100%;
}
.sections-sidebars.no-sidebar.generate-sections-enabled .container.grid-container {
max-width: 100%;
}
.sections-no-sidebars.generate-sections-enabled #primary.content-area {
width: 100%;
}
.sections-sidebars.no-sidebar.generate-sections-enabled #primary.content-area {
width: 100%;
}
.sections-no-sidebars.generate-sections-enabled.separate-containers #main.site-main,
.sections-no-sidebars.generate-sections-enabled.separate-containers .hentry {
margin: 0;
}
.sections-sidebars.no-sidebar.generate-sections-enabled.separate-containers #main.site-main,
.sections-sidebars.no-sidebar.generate-sections-enabled.separate-containers .hentry {
margin: 0;
}
.generate-sections-inside-container > *:last-child {
margin-bottom: 0;
}
.generate-sections-container {
background-size: cover;
}
.generate-sections-container.no-padding .generate-sections-inside-container {
padding: 0px !important;
}
.generate-sections-enabled.one-container .site-content {
padding: 0;
}
.generate-sections-enabled.one-container .container {
background: transparent;
}
.generate-sections-enabled.one-container .site-main {
margin: 0 !important;
}
.generate-sections-enabled .entry-content {
text-align: center;
}
.separate-containers .site-main > .generate-sections-container {
margin-bottom: 0;
}

View File

@ -0,0 +1 @@
.sections-no-sidebars.generate-sections-enabled .container.grid-container,.sections-sidebars.no-sidebar.generate-sections-enabled .container.grid-container{max-width:100%}.sections-no-sidebars.generate-sections-enabled #primary.content-area,.sections-sidebars.no-sidebar.generate-sections-enabled #primary.content-area{width:100%}.sections-no-sidebars.generate-sections-enabled.separate-containers #main.site-main,.sections-no-sidebars.generate-sections-enabled.separate-containers .hentry,.sections-sidebars.no-sidebar.generate-sections-enabled.separate-containers #main.site-main,.sections-sidebars.no-sidebar.generate-sections-enabled.separate-containers .hentry{margin:0}.generate-sections-inside-container>:last-child{margin-bottom:0}.generate-sections-container{background-size:cover}.generate-sections-container.no-padding .generate-sections-inside-container{padding:0!important}.generate-sections-enabled.one-container .site-content{padding:0}.generate-sections-enabled.one-container .container{background:0 0}.generate-sections-enabled.one-container .site-main{margin:0!important}.generate-sections-enabled .entry-content{text-align:center}.separate-containers .site-main>.generate-sections-container{margin-bottom:0}

View File

@ -0,0 +1,329 @@
<?php
// No direct access, please
if ( ! defined( 'ABSPATH' ) ) exit;
include_once( 'metaboxes/metabox-functions.php' );
if ( ! function_exists( 'generate_sections_page_template' ) ) {
add_filter( 'template_include', 'generate_sections_page_template' );
/**
* Use our custom template if sections are enabled
*/
function generate_sections_page_template( $template ) {
global $post;
$use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : '';
if ( is_home() || is_archive() || is_search() || is_attachment() || is_tax() ) {
return $template;
}
if ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) {
$new_template = dirname( __FILE__ ) . '/templates/template.php';
if ( '' != $new_template ) {
return $new_template;
}
}
return $template;
}
}
if ( ! function_exists( 'generate_sections_show_excerpt' ) ) {
add_filter( 'generate_show_excerpt', 'generate_sections_show_excerpt' );
/**
* If Sections is enabled on a post, make sure we use the excerpt field on the blog page
*/
function generate_sections_show_excerpt( $show_excerpt ) {
global $post;
$use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : '';
if ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) {
return true;
}
return $show_excerpt;
}
}
if ( ! function_exists( 'generate_sections_styles' ) ) {
add_action( 'wp_enqueue_scripts', 'generate_sections_styles' );
/**
* Enqueue necessary scripts if sections are enabled
*/
function generate_sections_styles() {
global $post;
$use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : '';
// Bail if we're on a posts page
if ( is_home() || is_archive() || is_search() || is_attachment() || is_tax() ) {
return;
}
if ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) {
wp_enqueue_style( 'generate-sections-styles', plugin_dir_url( __FILE__ ) . 'css/style.min.css' );
wp_enqueue_script( 'generate-sections-parallax', plugin_dir_url( __FILE__ ) . 'js/parallax.min.js', array(), GENERATE_SECTIONS_VERSION, true );
}
}
}
if ( ! function_exists( 'generate_sections_body_classes' ) ) {
add_filter( 'body_class', 'generate_sections_body_classes' );
/**
* Add classes to our <body> element when sections are enabled
*/
function generate_sections_body_classes( $classes ) {
global $post;
$use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : '';
$sidebars = apply_filters( 'generate_sections_sidebars', false );
// Bail if we're on a posts page
if ( is_home() || is_archive() || is_search() || is_attachment() || is_tax() ) {
return $classes;
}
if ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) {
$classes[] = 'generate-sections-enabled';
}
if ( ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) && ! $sidebars ) {
$classes[] = 'sections-no-sidebars';
}
if ( ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) && $sidebars ) {
$classes[] = 'sections-sidebars';
}
return $classes;
}
}
if ( ! function_exists( 'generate_sections_add_css' ) ) {
add_action( 'wp_enqueue_scripts', 'generate_sections_add_css', 500 );
/**
* Create the CSS for our sections
*/
function generate_sections_add_css() {
global $post;
$use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : '';
if ( ! isset( $use_sections['use_sections'] ) ) {
return;
}
if ( 'true' !== $use_sections['use_sections'] ) {
return;
}
if ( is_home() || is_archive() || is_search() || is_attachment() || is_tax() ) {
return;
}
if ( function_exists( 'generate_spacing_get_defaults' ) ) {
$spacing_settings = wp_parse_args(
get_option( 'generate_spacing_settings', array() ),
generate_spacing_get_defaults()
);
$left_padding = $spacing_settings['content_left'];
$right_padding = $spacing_settings['content_right'];
$mobile_padding_left = ( isset( $spacing_settings[ 'mobile_content_left' ] ) ) ? $spacing_settings[ 'mobile_content_left' ] : 30;
$mobile_padding_right = ( isset( $spacing_settings[ 'mobile_content_right' ] ) ) ? $spacing_settings[ 'mobile_content_right' ] : 30;
} else {
$right_padding = 40;
$left_padding = 40;
$mobile_padding = 30;
}
$sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_sections', TRUE) : '';
// check if the repeater field has rows of data
if ( $sections && '' !== $sections ) {
$css = '.generate-sections-inside-container {padding-left:' . $left_padding . 'px;padding-right:' . $right_padding . 'px;}';
// loop through the rows of data
$i = 0;
foreach ( $sections['sections'] as $section ) :
$i++;
// Get image details
$image_id = ( isset( $section['background_image'] ) && '' !== $section['background_image'] ) ? intval( $section['background_image'] ) : '';
$image_url = ( '' !== $image_id ) ? wp_get_attachment_image_src( $image_id, 'full' ) : '';
// Get the padding type
$padding_type = apply_filters( 'generate_sections_padding_type','px' );
// If someone has changed the padding type using a filter, use their value
if ( 'px' !== $padding_type ) {
$top_padding_type = $padding_type;
$bottom_padding_type = $padding_type;
} else {
$top_padding_type = ( isset( $section['top_padding_unit'] ) && '' !== $section['top_padding_unit'] ) ? $section['top_padding_unit'] : $padding_type;
$bottom_padding_type = ( isset( $section['bottom_padding_unit'] ) && '' !== $section['bottom_padding_unit'] ) ? $section['bottom_padding_unit'] : $padding_type;
}
// Default padding top
$padding_top = apply_filters( 'generate_sections_default_padding_top','40' );
// Default padding bottom
$padding_bottom = apply_filters( 'generate_sections_default_padding_bottom','40' );
$custom_id = ( isset( $section['custom_id'] ) ) ? $section['custom_id'] : '';
$custom_id = ( '' == $custom_id ) ? "generate-section-$i" : $custom_id;
// Get the values
$background_color = ( isset( $section['background_color'] ) && '' !== $section['background_color'] ) ? 'background-color:' . esc_attr( $section['background_color'] ) . ';' : '';
$background_image = ( ! empty( $image_url[0] ) ) ? 'background-image:url(' . esc_url( $image_url[0] ) . ');' : '';
if ( isset( $section['background_color_overlay'] ) && '' !== $section['background_color_overlay'] ) {
if ( '' !== $background_image && '' !== $background_color ) {
$background_image = 'background-image:linear-gradient(0deg, ' . $section['background_color'] . ',' . $section['background_color'] . '), url(' . esc_url( $image_url[0] ) . ');';
$background_color = '';
}
}
$text_color = ( isset( $section['text_color'] ) && '' !== $section['text_color'] ) ? 'color:' . esc_attr( $section['text_color'] ) . ';' : '';
$link_color = ( isset( $section['link_color'] ) && '' !== $section['link_color'] ) ? 'color:' . esc_attr( $section['link_color'] ) . ';' : '';
$link_color_hover = ( isset( $section['link_color_hover'] ) && '' !== $section['link_color_hover'] ) ? 'color:' . esc_attr( $section['link_color_hover'] ) . ';' : '';
$top_padding = ( isset( $section['top_padding'] ) && '' !== $section['top_padding'] ) ? 'padding-top:' . absint( $section['top_padding'] ) . $top_padding_type . ';' : 'padding-top:' . $padding_top . 'px;';
$bottom_padding = ( isset( $section['bottom_padding'] ) && '' !== $section['bottom_padding'] ) ? 'padding-bottom:' . absint( $section['bottom_padding'] ) . $bottom_padding_type . ';' : 'padding-bottom:' . $padding_bottom . 'px;';
// Outer container
if ( '' !== $background_color || '' !== $background_image ) {
$css .= '#' . $custom_id . '.generate-sections-container{' . $background_color . $background_image . '}';
}
// Inner container
if ( '' !== $top_padding || '' !== $bottom_padding || '' !== $text_color ) {
$css .= '#' . $custom_id . ' .generate-sections-inside-container{' . $top_padding . $bottom_padding . $text_color . '}';
}
// Link color
if ( '' !== $link_color ) {
$css .= '#' . $custom_id . ' a,#generate-section-' . $i . ' a:visited{' . $link_color . '}';
}
// Link color hover
if ( '' !== $link_color_hover ) {
$css .= '#' . $custom_id . ' a:hover{' . $link_color_hover . '}';
}
$mobile = generate_premium_get_media_query( 'mobile' );
$css .= '@media ' . esc_attr( $mobile ) . ' {.generate-sections-inside-container {padding-left: ' . $mobile_padding_left . 'px;padding-right: ' . $mobile_padding_right . 'px;}}';
endforeach;
// Build CSS
wp_add_inline_style( 'generate-style', $css );
}
}
}
if ( ! function_exists( 'generate_sections_filter_admin_init' ) ) {
add_action( 'admin_init', 'generate_sections_filter_admin_init' );
/*
* Recreate the default filters on the_content
* this will make it much easier to output the meta content with proper/expected formatting
*/
function generate_sections_filter_admin_init() {
if ( user_can_richedit() ) {
add_filter( 'generate_section_content', 'convert_smilies' );
add_filter( 'generate_section_content', 'convert_chars' );
add_filter( 'generate_section_content', 'wpautop' );
add_filter( 'generate_section_content', 'shortcode_unautop' );
add_filter( 'generate_section_content', 'prepend_attachment' );
}
}
}
if ( ! function_exists( 'generate_sections_filter' ) ) {
add_action( 'init', 'generate_sections_filter' );
/*
* Recreate the default filters on the_content
* this will make it much easier to output the meta content with proper/expected formatting
*/
function generate_sections_filter() {
if ( is_admin() ) {
return;
}
add_filter( 'generate_section_content', 'convert_smilies' );
add_filter( 'generate_section_content', 'convert_chars' );
add_filter( 'generate_section_content', 'wpautop' );
add_filter( 'generate_section_content', 'shortcode_unautop' );
add_filter( 'generate_section_content', 'prepend_attachment' );
add_filter( 'generate_section_content', 'do_shortcode');
add_filter( 'generate_the_section_content', array($GLOBALS['wp_embed'], 'autoembed'), 9 );
}
}
if ( ! function_exists( 'generate_sections_save_content' ) ) {
add_action( 'save_post', 'generate_sections_save_content', 99, 4 );
/*
* When we save our post, grab all of the section content and save it as regular content.
*
* This will prevent content loss/theme lock.
*/
function generate_sections_save_content( $post_id, $post ) {
if ( ! isset( $_POST['_generate_sections_nonce'] ) || ! wp_verify_nonce( $_POST['_generate_sections_nonce'], 'generate_sections_nonce' ) ) {
return;
}
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
return;
}
if ( ! current_user_can('edit_post', $post_id ) ) {
return;
}
// See if we're using sections
$use_sections = get_post_meta( $post_id, '_generate_use_sections', true);
// Make sure use sections exists and that we're not saving a revision
if ( ! isset( $use_sections['use_sections'] ) || wp_is_post_revision( $post_id ) ) {
return;
}
// Return if sections are set to false
if ( 'true' !== $use_sections['use_sections'] ) {
return;
}
// Get our sections
$sections = get_post_meta( $post_id, '_generate_sections', true );
// Return if there's nothing in our sections
if ( ! isset( $sections ) || '' == $sections ) {
return;
}
// Prevent infinite loop
remove_action( 'save_post', 'generate_sections_save_content', 99, 4 );
// Let's do some stuff if sections aren't empty
if ( '' !== $sections ) {
// Set up our content variable
$content = '';
// Loop through each section and add our content to the content variable
foreach ( $sections['sections'] as $section ) {
$content .= ( isset( $section['content'] ) && '' !== $section['content'] ) ? $section['content'] . "\n\n" : '';
}
// Now update our post if we have section content
if ( '' !== $content ) {
$post->post_content = $content;
wp_update_post( $post, true );
}
}
// Re-hook the save_post action
add_action('save_post', 'generate_sections_save_content', 99, 4);
}
}

View File

@ -0,0 +1,17 @@
function generate_sections_parallax_element( selector, context ) {
context = context || document;
var elements = context.querySelectorAll( selector );
return Array.prototype.slice.call( elements );
}
window.addEventListener( "scroll", function() {
var scrolledHeight= window.pageYOffset;
generate_sections_parallax_element( ".generate-sections-container.enable-parallax" ).forEach( function( el, index, array ) {
var limit = el.offsetTop + el.offsetHeight;
if( scrolledHeight > el.offsetTop && scrolledHeight <= limit ) {
el.style.backgroundPositionY = ( scrolledHeight - el.offsetTop ) / el.getAttribute( 'data-speed' ) + "px";
} else {
el.style.backgroundPositionY = "0";
}
});
});

View File

@ -0,0 +1 @@
function generate_sections_parallax_element(e,t){var o=(t=t||document).querySelectorAll(e);return Array.prototype.slice.call(o)}window.addEventListener("scroll",function(){var e=window.pageYOffset;generate_sections_parallax_element(".generate-sections-container.enable-parallax").forEach(function(t,o,n){var a=t.offsetTop+t.offsetHeight;e>t.offsetTop&&e<=a?t.style.backgroundPositionY=(e-t.offsetTop)/t.getAttribute("data-speed")+"px":t.style.backgroundPositionY="0"})});

View File

@ -0,0 +1,348 @@
body {
-webkit-backface-visibility: hidden;
}
#_generate_sections_metabox {
opacity: 0;
height: 0;
overflow: hidden;
}
#_generate_use_sections_metabox {
display: block !important;
}
.generate_sections_control {
padding-top: 8px;
}
.generate-sections-enabled #postdivrich {
opacity: 0;
height: 0;
overflow: hidden;
}
.generate-sections-enabled #_generate_sections_metabox {
opacity: 1;
height: auto;
}
.generate_sections_control .warning {
color: red;
}
.generate_sections_control .dodelete-repeating_textareas {
float: right;
}
.generate_sections_control .section {
border: 1px solid #DFDFDF;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
margin: 6px 0px 8px;
overflow: hidden;
position: relative;
background: white;
}
.generate_sections_control .section .section-title {
font-size: 14px;
padding: 0 0 0 15px;
margin: 0;
max-height: 50px;
}
.generate_sections_control .section .section-title > span {
cursor: pointer;
overflow:hidden;
display:block;
max-height:50px;
line-height:50px;
width:100%;
}
.generate_sections_control .section .section-controls {
position: absolute;
top:0;
right:0;
text-align: right;
}
.rtl .generate_sections_control .section .section-controls {
right:auto;left:0;
}
.generate_sections_control .section .section-controls a {
color: #aaa;
display:block;
float:left;
border-left: 1px solid #efefef;
}
.generate_sections_control .section .section-controls a:hover {
color: #777;
}
.generate_sections_control .section textarea {
display: none;
}
.generate_sections_control .section h3 {
color: #999;
font-size: 1em;
margin: 15px 6px;
text-transform: uppercase;
}
.generate_sections_control .section .ui-sortable-placeholder {
line-height: 1.4em;
border: 3px dashed #DDD;
}
.generate-sections-modal .media-menu-item {
cursor: pointer;
}
.custom-classes input {
width:100%;
}
.js .generate_sections_control .move-section {
cursor: move;
}
.generate-sections-modal p {
margin-top:5px;
}
#_generate_sections_metabox {
box-shadow: 0 0 0 transparent;
}
.section-controls a {
line-height:50px;
padding: 0 15px;
width:initial;
height:initial;
}
.generate_sections_control .section .section-controls a.delete-section:hover {
color: red;
}
.generate_sections_control p {
margin: 5px;
}
textarea#generate-sections-editor {
border:0;
}
#generate-sections-editor_ifr {
min-height: 400px;
}
a#generate-add-section, a#generate-delete-sections {
height: auto;
line-height: inherit;
padding: 10px 20px;
}
#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > * {
display:none;
}
#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > .generate-sections-add-media,
#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > .su-generator-button,
#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > .envira-gallery-choose-gallery,
#wp-generate-sections-editor-wrap.old-sections-js .wp-media-buttons > .gridable-insert-row-button {
display: inline-block;
}
#custom-media-buttons > * {
display: none;
}
#custom-media-buttons > .insert-media,
#custom-media-buttons > .su-generator-button,
#custom-media-buttons > .envira-gallery-choose-gallery,
#custom-media-buttons > .gridable-insert-row-button,
#custom-media-buttons > .bfa-iconpicker {
display: inline-block;
}
#_generate_sections_metabox {
background: transparent;
border: 0;
}
#_generate_sections_metabox > .handlediv, #_generate_sections_metabox > .hndle {
display: none;
}
#_generate_sections_metabox > .inside {
padding-left: 0;
padding-right: 0;
}
body.wp-admin .grid-container {
max-width: 100%;
}
.generate-sections-modal h3 {
margin-top: 0;
}
input#custom_classes,
input#custom_id {
width: 100%;
max-width: 300px;
}
.box-type select,
.inner-box-type select,
.parallax-effect select,
.top-padding input,
.bottom-padding input {
width: 100%;
box-sizing: border-box;
}
.send-to-editor {
display: inline-block;
margin-top: 15px !important;
}
#generate-sections-modal-dialog .media-frame-title .dashicons-arrow-down {
display: none;
}
.gs-grid-container {
margin-left: auto;
margin-right: auto;
max-width: 100%;
padding-left: 10px;
padding-right: 10px;
}
.gs-grid-parent {
padding-left: 0;
padding-right: 0;
}
.gs-grid-container:before,
.gs-grid-container:after {
content: ".";
display: block;
overflow: hidden;
visibility: hidden;
font-size: 0;
line-height: 0;
width: 0;
height: 0;
clear: both;
}
@media screen and (min-width: 769px) {
.gs-grid-50:before,
.gs-grid-50:after,
.gs-grid-33:before,
.gs-grid-33:after,
.gs-grid-25:before,
.gs-grid-25:after
.gs-grid-20:before,
.gs-grid-20:after
.gs-grid-12:before,
.gs-grid-12:after {
content: ".";
display: block;
overflow: hidden;
visibility: hidden;
font-size: 0;
line-height: 0;
width: 0;
height: 0;
clear: both;
}
.gs-grid-50,
.gs-grid-33,
.gs-grid-25,
.gs-grid-20,
.gs-grid-12 {
box-sizing: border-box;
padding-left: 10px;
padding-right: 10px;
}
.gs-grid-50 {
width: 50% !important;
float: left;
}
.gs-grid-33 {
width: 33.333% !important;
float: left;
}
.gs-grid-25 {
width: 25% !important;
float: left;
}
.gs-grid-20 {
width: 20% !important;
float: left;
}
.gs-grid-12 {
width: 12.5% !important;
float: left;
}
.top-border {
border-top: 1px solid #EFEFEF;
}
.bottom-border {
border-bottom: 1px solid #EFEFEF;
}
.border-right {
border-right: 1px solid #EFEFEF;
}
.border-left {
border-left: 1px solid #EFEFEF;
}
}
@media screen and (max-width: 768px) {
.gs-grid-50, .gs-grid-33, .gs-grid-25, .gs-grid-12 {
width: 100% !important;
}
.generate_sections_control .section .section-controls {
position: relative;
}
}
@media screen and (max-width: 500px) {
.generate_sections_control .section .section-controls a:first-child {
border-left: 0;
}
}
#generate-sections-modal-dialog .media-modal-close {
text-decoration: none;
text-align: center;
}
/*
The styles below were ripped from the Media Modal in WordPress 3.5
~~ Thanks for building a beautiful Modal UI ( that I could steal )
*/
body.generate-modal-open { overflow: hidden; }
.generate-sections-modal .media-modal { z-index: 65535; }
.generate-sections-modal .media-modal-backdrop { z-index: 65534; }
.generate-sections-modal .media-frame-content .panel { display: none; padding: 2em; }
.generate-sections-modal .media-frame-content .panel.active { display: block; }
.generate-sections-modal .media-frame-content .panel .section-title input { width:100%;padding:10px; }
.generate-sections-modal .media-frame-content .panel .html-active .mce-panel { display: none; }
.generate-sections-modal .media-frame-content .panel .html-active .wp-editor-area { display: block !important; min-height: 300px; }
.generate-sections-modal .media-frame-content .panel .mce-wp-dfw, .generate-sections-modal .media-frame-content .panel .qt-dfw { display: none; }
.generate-sections-modal .media-frame-content .panel .generate-sections-remove-image { display: none; }
textarea.no-rich-edit {
width: 100%;
min-height: 300px;
}
.wp-picker-container .wp-color-result.button {
height: 24px;
margin: 0 6px 6px 0px;
padding: 0 0 0 30px;
font-size: 11px;
}
.wp-color-result:after {
display: none;
}
.wp-color-result-text {
background: #f7f7f7;
border-radius: 0 2px 2px 0;
border-left: 1px solid #ccc;
color: #555;
display: block;
line-height: 22px;
padding: 0 6px;
text-align: center;
}

View File

@ -0,0 +1,92 @@
.lcs_wrap {
display: inline-block;
direction: ltr;
height: 28px;
vertical-align: middle;
}
.lcs_wrap input {
display: none;
}
.lcs_switch {
display: inline-block;
position: relative;
width: 73px;
height: 28px;
border-radius: 30px;
background: #ddd;
overflow: hidden;
cursor: pointer;
transition: all .2s ease-in-out;
}
.lcs_cursor {
display: inline-block;
position: absolute;
top: 3px;
width: 22px;
height: 22px;
border-radius: 100%;
background: #fff;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2), 0 3px 4px 0 rgba(0, 0, 0, 0.1);
z-index: 10;
transition: all .2s linear;
}
.lcs_label {
font-family: "Trebuchet MS", Helvetica, sans-serif;
font-size: 12px;
letter-spacing: 1px;
line-height: 18px;
color: #fff;
font-weight: bold;
position: absolute;
width: 33px;
top: 5px;
overflow: hidden;
text-align: center;
opacity: 0;
transition: all .2s ease-in-out .1s;
}
.lcs_label.lcs_label_on {
left: -70px;
z-index: 6;
}
.lcs_label.lcs_label_off {
right: -70px;
z-index: 5;
}
/* on */
.lcs_switch.lcs_on {
background: #75b936;
box-shadow: 0 0 2px #579022 inset;
}
.lcs_switch.lcs_on .lcs_cursor {
left: 48px;
}
.lcs_switch.lcs_on .lcs_label_on {
left: 10px;
opacity: 1;
}
/* off */
.lcs_switch.lcs_off {
background: #b2b2b2;
box-shadow: 0px 0px 2px #a4a4a4 inset;
}
.lcs_switch.lcs_off .lcs_cursor {
left: 3px;
}
.lcs_switch.lcs_off .lcs_label_off {
right: 10px;
opacity: 1;
}
/* disabled */
.lcs_switch.lcs_disabled {
opacity: 0.65;
filter: alpha(opacity=65);
cursor: default;
}

View File

@ -0,0 +1,835 @@
/*-----------------------------------------------------------------------------------*/
/* Generate Sections Metabox
/*
/* © Kathy Darling http://www.kathyisawesome.com
/* 2016-07-19. */
/*-----------------------------------------------------------------------------------*/
/**
* @type {Object} JavaScript namespace for our application.
*/
var Generate_Sections = {
backbone_modal: {
__instance: undefined
}
};
(function($, Generate_Sections) {
// Model
Generate_Sections.Section = Backbone.Model.extend({
defaults: {
"title": "",
"box_type": "",
"inner_box_type": "",
"custom_classes": "",
"custom_id": "",
"top_padding": "",
"bottom_padding": "",
"top_padding_unit": "",
"bottom_padding_unit": "",
"background_color": "",
"background_image": "",
"background_image_preview": "",
"parallax_effect": "",
"background_color_overlay": "",
"text_color": "",
"link_color": "",
"link_color_hover": "",
"content": ""
}
});
// Collection
Generate_Sections.SectionsCollection = Backbone.Collection.extend({
model: Generate_Sections.Section,
el: "#generate_sections_container",
comparator: function(model) {
return model.get('index');
}
});
/**
* Primary Modal Application Class
*/
Generate_Sections.backbone_modal.Application = Backbone.View.extend({
attributes: {
id: "generate-sections-modal-dialog",
class: "generate-sections-modal",
role: "dialog"
},
template: wp.template("generate-sections-modal-window"),
mediaUploader: null,
/*-----------------------------------------------------------------------------------*/
/* tinyMCE settings
/*-----------------------------------------------------------------------------------*/
tmc_settings: {},
/*-----------------------------------------------------------------------------------*/
/* tinyMCE defaults
/*-----------------------------------------------------------------------------------*/
tmc_defaults: {
theme: "modern",
menubar: false,
wpautop: true,
indent: false,
toolbar1: "bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,link,unlink,fullscreen",
plugins: "fullscreen,image,wordpress,wpeditimage,wplink",
max_height: 500
},
/*-----------------------------------------------------------------------------------*/
/* quicktags settings
/*-----------------------------------------------------------------------------------*/
qt_settings: {},
/*-----------------------------------------------------------------------------------*/
/* quicktags defaults
/*-----------------------------------------------------------------------------------*/
qt_defaults: {
buttons: "strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,fullscreen"
},
model: Generate_Sections.Section,
events: {
"click .media-modal-backdrop, .media-modal-close, .media-button-close": "closeModal",
"click .media-button-insert": "saveModal",
"click .media-menu-item": "switchTab",
"keydown": "keydown",
"click .generate-sections-upload-button": "openMediaUploader",
"click .generate-sections-remove-image": "removeImage",
"click div.media-frame-title h1": "toggleMenu"
},
/**
* Simple object to store any UI elements we need to use over the life of the application.
*/
ui: {
nav: undefined,
content: undefined
},
/**
* Instantiates the Template object and triggers load.
*/
initialize: function() {
_.bindAll(this, "render", "closeModal", "saveModal", "switchTab");
this.focusManager = new wp.media.view.FocusManager({
el: this.el
});
this.changeInsertText();
this.tinyMCEsettings();
this.render();
},
/**
* switch the insert button text to "insert section"
*/
changeInsertText: function(restore) {
var restore = typeof restore !== 'undefined' && restore == true ? true : false;
if (restore == false && typeof(wp.media.view.l10n.insertIntoPost) !== "undefined") {
this.insertIntoPost = wp.media.view.l10n.insertIntoPost;
wp.media.view.l10n.insertIntoPost = generate_sections_metabox_i18n.insert_into_section;
// switch the insert button text back
} else if (restore == true && typeof(this.insertIntoPost) !== "undefined") {
wp.media.view.l10n.insertIntoPost = this.insertIntoPost;
}
},
/**
* Merge the default TinyMCE settings
*/
tinyMCEsettings: function() {
// get the #content"s tinyMCE settings or use default
var init_settings = typeof tinyMCEPreInit == "object" && "mceInit" in tinyMCEPreInit && "content" in tinyMCEPreInit.mceInit ? tinyMCEPreInit.mceInit.content : this.tmc_defaults;
// get the #content"s quicktags settings or use default
var qt_settings = typeof tinyMCEPreInit == "object" && "qtInit" in tinyMCEPreInit && "content" in tinyMCEPreInit.qtInit ? tinyMCEPreInit.qtInit.content : this.qt_defaults;
var _this = this;
var custom_settings = {
selector: "#generate-sections-editor",
wp_autoresize_on: false,
cache_suffix: "",
min_height: 400,
}
// merge our settings with WordPress" and store for later use
this.tmc_settings = $.extend({}, init_settings, custom_settings);
this.qt_settings = $.extend({}, qt_settings, {
id: "generate-sections-editor"
});
},
/**
* Assembles the UI from loaded template.
* @internal Obviously, if the template fail to load, our modal never launches.
*/
render: function() {
"use strict";
// Build the base window and backdrop, attaching them to the $el.
// Setting the tab index allows us to capture focus and redirect it in Application.preserveFocus
this.$el.attr("tabindex", "0")
.html(this.template);
// Handle any attempt to move focus out of the modal.
//jQuery(document).on("focusin", this.preserveFocus);
// set overflow to "hidden" on the body so that it ignores any scroll events while the modal is active
// and append the modal to the body.
jQuery("body").addClass("generate-modal-open").prepend(this.$el);
// aria hide the background
jQuery("#wpwrap").attr("aria-hidden", "true");
this.renderContent();
this.renderPreview();
this.selected();
this.colorPicker();
this.startTinyMCE();
// Set focus on the modal to prevent accidental actions in the underlying page
this.$el.focus();
return this;
},
/**
* Make the menu mobile-friendly
*/
toggleMenu: function() {
this.$el.find('.media-menu').toggleClass('visible');
},
/**
* Create the nav tabs & panels
*/
renderContent: function() {
var model = this.model;
var menu_item = wp.template("generate-sections-modal-menu-item");
// Save a reference to the navigation bar"s unordered list and populate it with items.
this.ui.nav = this.$el.find(".media-menu");
// reference to content area
this.ui.panels = this.$el.find(".media-frame-content");
// loop through the tabs
if (generate_sections_metabox_i18n.tabs.length) {
// for...of is nicer, but not supported by minify, so stay with for...in for now
for (var tab in generate_sections_metabox_i18n.tabs) {
if (generate_sections_metabox_i18n.tabs.hasOwnProperty(tab)) {
tab = generate_sections_metabox_i18n.tabs[tab];
var $new_tab = $(menu_item({
target: tab.target,
name: tab.title
}));
var panel = wp.template("generate-sections-edit-" + tab.target);
var $new_panel = $(panel(model.toJSON()));
if (tab.active == "true") {
$new_tab.addClass("active");
$new_panel.addClass("active");
}
jQuery( 'body' ).on( 'generate_section_show_settings', function() {
jQuery( '.generate-sections-modal .media-menu-item' ).removeClass('active');
jQuery( '.generate-sections-modal .panel' ).removeClass('active');
jQuery( '.generate-section-item-style' ).addClass('active');
jQuery( '.generate-section-settings' ).addClass('active');
});
this.ui.nav.append($new_tab);
this.ui.panels.append($new_panel);
}
}
}
},
/**
* Render the background image preview
*/
renderPreview: function(image_id) {
var image_id = typeof image_id !== 'undefined' ? image_id : this.model.get("background_image");
var $preview = $("#generate-section-image-preview");
$preview.children().remove();
if (image_id > 0) {
this.background = new wp.media.model.Attachment.get(image_id);
this.background.fetch({
success: function(att) {
if (_.contains(['png', 'jpg', 'gif', 'jpeg'], att.get('subtype'))) {
$("<img/>").attr("src", att.attributes.sizes.thumbnail.url).appendTo($preview);
$preview.next().find(".generate-sections-remove-image").show();
}
}
});
}
},
/**
* Set the default option for the select boxes
*/
selected: function() {
var _this = this;
this.$el.find("select").each(function(index, select) {
var attribute = jQuery(select).attr("name");
var selected = _this.model.get(attribute);
jQuery(select).val(selected);
});
},
/**
* Start the colorpicker
*/
colorPicker: function() {
this.$el.find(".generate-sections-color").wpColorPicker();
},
/**
* Start TinyMCE on the textarea
*/
startTinyMCE: function() {
// set the default editor
this.ui.panels.find("#wp-generate-sections-editor-wrap").addClass(generate_sections_metabox_i18n.default_editor);
// remove tool buttons if richedit disabled
if (!generate_sections_metabox_i18n.user_can_richedit) {
this.ui.panels.find(".wp-editor-tabs").remove();
}
// add our copy to the collection in the tinyMCEPreInit object because switch editors
if (typeof tinyMCEPreInit == 'object') {
tinyMCEPreInit.mceInit["generate-sections-editor"] = this.tmc_settings;
tinyMCEPreInit.qtInit["generate-sections-editor"] = this.qt_settings;
tinyMCEPreInit.mceInit["generate-sections-editor"].wp_keep_scroll_position = false;
}
try {
var rich = (typeof tinyMCE != "undefined");
// turn on the quicktags editor
quicktags(this.qt_settings);
// attempt to fix problem of quicktags toolbar with no buttons
QTags._buttonsInit();
if (rich !== false) {
// turn on tinyMCE
tinyMCE.init(this.tmc_settings);
}
} catch (e) {}
},
/**
* Launch Media Uploader
*/
openMediaUploader: function(e) {
var _this = this;
$input = jQuery(e.currentTarget).prev("#generate-sections-background-image");
e.preventDefault();
// If the uploader object has already been created, reopen the dialog
if (this.mediaUploader) {
this.mediaUploader.open();
return;
}
// Extend the wp.media object
this.mediaUploader = wp.media.frames.file_frame = wp.media({
title: generate_sections_metabox_i18n.media_library_title,
button: {
text: generate_sections_metabox_i18n.media_library_button
},
multiple: false
});
// When a file is selected, grab the URL and set it as the text field"s value
this.mediaUploader.on("select", function() {
attachment = _this.mediaUploader.state().get("selection").first().toJSON();
$input.val(attachment.id);
_this.renderPreview(attachment.id);
});
// Open the uploader dialog
this.mediaUploader.open();
},
/**
* Remove the background image
*/
removeImage: function(e) {
e.preventDefault();
$("#generate-section-image-preview").children().remove();
$("#generate-section-image-preview").next().find(".generate-sections-remove-image").hide();
$("#generate-sections-background-image").val("");
},
/**
* Closes the modal and cleans up after the instance.
* @param e {object} A jQuery-normalized event object.
*/
closeModal: function(e) {
"use strict";
e.preventDefault();
this.undelegateEvents();
jQuery(document).off("focusin");
jQuery("body").removeClass("generate-modal-open");
jQuery("body").removeClass("generate-section-content");
// remove restricted media modal tab focus once it's closed
this.$el.undelegate('keydown');
// remove the tinymce editor
// this needs to be called before the modal is closed or it will fail in Firefox (that was fun to figure out...)
if (typeof tinyMCE != "undefined") {
tinymce.EditorManager.execCommand("mceRemoveEditor", true, "generate-sections-editor");
}
// remove modal and unset instances
this.remove();
Generate_Sections.backbone_modal.__instance = undefined;
this.mediaUploader = null;
Generate_Sections.modalOpen = null;
// switch the insert button text back
this.changeInsertText(true);
// send focus back to where it was prior to modal open
Generate_Sections.lastFocus.focus();
// aria unhide the background
jQuery("#wpwrap").attr("aria-hidden", "false");
// Fix bug where the window scrolls down 50px on close
var topDistance = jQuery("body").offset().top;
if ( topDistance >= jQuery("body").scrollTop() ) {
jQuery("body").scrollTop(0);
}
},
/**
* Responds to the btn-ok.click event
* @param e {object} A jQuery-normalized event object.
* @todo You should make this your own.
*/
saveModal: function(e) {
"use strict";
this.model.get("index");
var model = this.model;
// send the tinymce content to the textarea
if (typeof tinyMCE != "undefined") {
tinymce.triggerSave();
}
var $inputs = this.ui.panels.find("input, select, textarea");
$inputs.each(function(index, input) {
var name = $(input).attr("name");
if (model.attributes.hasOwnProperty(name)) {
var value = $(input).val();
model.set(name, value);
}
});
this.closeModal(e);
},
/**
* Handles tab clicks and switches to corresponding panel
* @param e {object} A jQuery-normalized event object.
*/
switchTab: function(e) {
"use strict";
e.preventDefault();
// close lingering wp link windows
if (typeof tinyMCE != "undefined" && 'style' == jQuery( e.currentTarget ).data( 'target' ) && this.ui.panels.find( '#wp-generate-sections-editor-wrap' ).hasClass( 'tmce-active' )) {
tinyMCE.activeEditor.execCommand('wp_link_cancel');
tinyMCE.activeEditor.execCommand('wp_media_cancel');
}
this.ui.nav.children().removeClass("active");
this.ui.panels.children().removeClass("active");
var target = jQuery(e.currentTarget).addClass("active").data("target");
this.ui.panels.find("div[data-id=" + target + "]").addClass("active");
},
/**
* close on keyboard shortcuts
* @param {Object} event
*/
keydown: function(e) {
// Close the modal when escape is pressed.
if (27 === e.which && this.$el.is(':visible')) {
this.closeModal(e);
e.stopImmediatePropagation();
}
}
});
// Singular View
Generate_Sections.sectionView = Backbone.View.extend({
model: Generate_Sections.Section,
tagName: 'div',
initialize: function() {
// re-render on all changes EXCEPT index
this.listenTo(this.model, "change", this.maybeRender);
},
attributes: {
class: "ui-state-default section"
},
// Get the template from the DOM
template: wp.template("generate-sections-section"),
events: {
'click .edit-section': 'editSection',
'click .section-title > span': 'editSection',
'click .delete-section': 'removeSection',
'click .toggle-section': 'toggleSection',
'reorder': 'reorder',
},
maybeRender: function(e) {
if (this.model.hasChanged('index')) return;
this.render();
},
// Render the single model - include an index.
render: function() {
this.model.set('index', this.model.collection.indexOf(this.model));
this.$el.html(this.template(this.model.toJSON()));
if (!this.model.get('title')) {
this.$el.find('h3.section-title > span').text(generate_sections_metabox_i18n.default_title);
}
this.$el.find('textarea').val(JSON.stringify(this.model));
return this;
},
// launch the edit modal
editSection: function(e) {
// stash the current focus
Generate_Sections.lastFocus = document.activeElement;
Generate_Sections.modalOpen = true;
e.preventDefault();
if (Generate_Sections.backbone_modal.__instance === undefined) {
Generate_Sections.backbone_modal.__instance = new Generate_Sections.backbone_modal.Application({
model: this.model
});
}
},
// reorder after sort
reorder: function(event, index) {
this.$el.trigger('update-sort', [this.model, index]);
},
// remove/destroy a model
removeSection: function(e) {
e.preventDefault();
if (confirm(generate_sections_metabox_i18n.confirm)) {
this.model.destroy();
Generate_Sections.sectionList.render(); // manually calling instead of listening since listening interferes with sorting
}
},
});
// List View
Generate_Sections.sectionListView = Backbone.View.extend({
el: "#generate_sections_container",
events: {
'update-sort': 'updateSort',
// 'add-section': 'addOne'
},
// callback for clone button
addSection: function(model) {
this.collection.add(model);
this.addOne(model);
},
addOne: function(model) {
var view = new Generate_Sections.sectionView({
model: model
});
this.$el.append(view.render().el);
},
render: function() {
this.$el.children().remove();
this.collection.each(this.addOne, this);
return this;
},
updateSort: function(event, model, position) {
this.collection.remove(model);
// renumber remaining models around missing model
this.collection.each(function(model, index) {
var new_index = index;
if (index >= position) {
new_index += 1;
}
model.set('index', new_index);
});
// set the index of the missing model
model.set('index', position);
// add the model back to the collection
this.collection.add(model, {
at: position
});
this.render();
},
});
// The Buttons & Nonce
Generate_Sections.ButtonControls = Backbone.View.extend({
attributes: {
class: "generate_sections_buttons"
},
tagName: 'p',
el: "#_generate_sections_metabox",
template: wp.template("generate-sections-buttons"),
// Attach events
events: {
"click .button-primary": "newSection",
"click #generate-delete-sections": "clearAll",
'click .edit-section': 'editSection',
},
// create new
newSection: function(e) {
e.preventDefault();
var newSection = new Generate_Sections.Section();
Generate_Sections.sectionList.addSection(newSection);
},
// clear all models
clearAll: function(e) {
e.preventDefault();
if (confirm(generate_sections_metabox_i18n.confirm)) {
Generate_Sections.sectionCollection.reset();
Generate_Sections.sectionList.render();
}
},
render: function() {
this.$el.find(".generate_sections_control").append(this.template);
return this;
},
});
// init
Generate_Sections.initApplication = function() {
// Create Collection From Existing Meta
Generate_Sections.sectionCollection = new Generate_Sections.SectionsCollection(generate_sections_metabox_i18n.sections);
// Create the List View
Generate_Sections.sectionList = new Generate_Sections.sectionListView({
collection: Generate_Sections.sectionCollection
});
Generate_Sections.sectionList.render();
// Buttons
Generate_Sections.Buttons = new Generate_Sections.ButtonControls({
collection: Generate_Sections.sectionCollection
});
Generate_Sections.Buttons.render();
};
/*-----------------------------------------------------------------------------------*/
/* Execute the above methods in the Generate_Sections object.
/*-----------------------------------------------------------------------------------*/
jQuery(document).ready(function($) {
Generate_Sections.initApplication();
$( '#generate_sections_container' ).sortable({
axis: "y",
opacity: 0.5,
grid: [20, 10],
tolerance: "pointer",
handle: ".move-section",
update: function(event, ui) {
ui.item.trigger("reorder", ui.item.index());
}
} );
if ( $( '.use-sections-switch' ).is( ':checked' ) ) {
setTimeout( function() {
generateShowSections();
}, 200 );
} else {
generateHideSections();
}
$( '.use-sections-switch' ).on( 'change', function( e ) {
var status = ( $(this).is( ':checked' ) ) ? 'checked' : 'unchecked';
if ( 'checked' == status ) {
generateShowSections();
} else if ( 'unchecked' == status ) {
generateHideSections();
}
} );
function generateShowSections() {
// Hide send to editor button
$('.send-to-editor').css('display', 'none');
// Hide the editor
$('#postdivrich').css({
'opacity': '0',
'height': '0',
'overflow': 'hidden'
});
// Show the sections
$('#_generate_sections_metabox').css({
'opacity': '1',
'height': 'auto'
});
// Remove and add the default editor - this removes any visible toolbars etc..
// We need to set a timeout for this to work
// if (typeof tinyMCE != "undefined") {
// tinyMCE.EditorManager.execCommand("mceRemoveEditor", true, "content");
// $( '.use-sections-cover' ).css( 'z-index','10000' );
// setTimeout('tinyMCE.EditorManager.execCommand("mceAddEditor", true, "content");', 1);
// setTimeout('jQuery( ".use-sections-cover" ).css( "z-index","-1" );', 1000);
// }
// Set a trigger
$('body').trigger('generate_show_sections');
}
function generateHideSections() {
// Show send to editor button
$('.send-to-editor').css('display', 'inline-block');
// Show the editor
$('#postdivrich').css({
'opacity': '1',
'height': 'auto'
});
// Hide the sections
$('#_generate_sections_metabox').css({
'opacity': '0',
'height': '0',
'overflow': 'hidden'
});
$('body').trigger('generate_hide_sections');
}
$( document ).on( 'click', '.edit-section.edit-settings', function() {
$( 'body' ).trigger( 'generate_section_show_settings' );
});
});
})(jQuery, Generate_Sections);

View File

@ -0,0 +1,858 @@
/*-----------------------------------------------------------------------------------*/
/* Generate Sections Metabox
/*
/* © Kathy Darling http://www.kathyisawesome.com
/* 2016-07-19. */
/*-----------------------------------------------------------------------------------*/
/**
* @type {Object} JavaScript namespace for our application.
*/
var Generate_Sections = {
backbone_modal: {
__instance: undefined
}
};
(function($, Generate_Sections) {
// Model
Generate_Sections.Section = Backbone.Model.extend({
defaults: {
"title": "",
"box_type": "",
"inner_box_type": "",
"custom_classes": "",
"custom_id": "",
"top_padding": "",
"bottom_padding": "",
"top_padding_unit": "",
"bottom_padding_unit": "",
"background_color": "",
"background_image": "",
"background_image_preview": "",
"parallax_effect": "",
"background_color_overlay": "",
"text_color": "",
"link_color": "",
"link_color_hover": "",
"content": ""
}
});
// Collection
Generate_Sections.SectionsCollection = Backbone.Collection.extend({
model: Generate_Sections.Section,
el: "#generate_sections_container",
comparator: function(model) {
return model.get('index');
}
});
/**
* Primary Modal Application Class
*/
Generate_Sections.backbone_modal.Application = Backbone.View.extend({
attributes: {
id: "generate-sections-modal-dialog",
class: "generate-sections-modal",
role: "dialog"
},
template: wp.template("generate-sections-modal-window"),
mediaUploader: null,
/*-----------------------------------------------------------------------------------*/
/* tinyMCE settings
/*-----------------------------------------------------------------------------------*/
tmc_settings: {},
/*-----------------------------------------------------------------------------------*/
/* tinyMCE defaults
/*-----------------------------------------------------------------------------------*/
tmc_defaults: {
theme: "modern",
menubar: false,
wpautop: true,
indent: false,
toolbar1: "bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,link,unlink,fullscreen",
plugins: "fullscreen,image,wordpress,wpeditimage,wplink",
max_height: 500
},
/*-----------------------------------------------------------------------------------*/
/* quicktags settings
/*-----------------------------------------------------------------------------------*/
qt_settings: {},
/*-----------------------------------------------------------------------------------*/
/* quicktags defaults
/*-----------------------------------------------------------------------------------*/
qt_defaults: {
buttons: "strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,fullscreen"
},
model: Generate_Sections.Section,
events: {
"click .media-modal-backdrop, .media-modal-close, .media-button-close": "closeModal",
"click .media-button-insert": "saveModal",
"click .media-menu-item": "switchTab",
"keydown": "keydown",
"click .generate-sections-upload-button": "openMediaUploader",
"click .generate-sections-remove-image": "removeImage",
"click div.media-frame-title h1": "toggleMenu"
},
/**
* Simple object to store any UI elements we need to use over the life of the application.
*/
ui: {
nav: undefined,
content: undefined
},
/**
* Instantiates the Template object and triggers load.
*/
initialize: function() {
_.bindAll(this, "render", "closeModal", "saveModal", "switchTab");
this.focusManager = new wp.media.view.FocusManager({
el: this.el
});
this.changeInsertText();
//this.tinyMCEsettings();
this.render();
},
/**
* switch the insert button text to "insert section"
*/
changeInsertText: function(restore) {
var restore = typeof restore !== 'undefined' && restore == true ? true : false;
if (restore == false && typeof(wp.media.view.l10n.insertIntoPost) !== "undefined") {
this.insertIntoPost = wp.media.view.l10n.insertIntoPost;
wp.media.view.l10n.insertIntoPost = generate_sections_metabox_i18n.insert_into_section;
// switch the insert button text back
} else if (restore == true && typeof(this.insertIntoPost) !== "undefined") {
wp.media.view.l10n.insertIntoPost = this.insertIntoPost;
}
},
/**
* Assembles the UI from loaded template.
* @internal Obviously, if the template fail to load, our modal never launches.
*/
render: function() {
"use strict";
// Build the base window and backdrop, attaching them to the $el.
// Setting the tab index allows us to capture focus and redirect it in Application.preserveFocus
this.$el.attr("tabindex", "0").html(this.template);
// Handle any attempt to move focus out of the modal.
//jQuery(document).on("focusin", this.preserveFocus);
// set overflow to "hidden" on the body so that it ignores any scroll events while the modal is active
// and append the modal to the body.
jQuery("body").addClass("generate-modal-open").prepend(this.$el);
// aria hide the background
jQuery("#wpwrap").attr("aria-hidden", "true");
this.renderContent();
this.renderPreview();
this.selected();
this.colorPicker();
//this.startTinyMCE();
this.launchEditor();
// Set focus on the modal to prevent accidental actions in the underlying page
this.$el.focus();
return this;
},
launchEditor: function() {
var id = this.ui.panels.find( ".generate-sections-editor-wrap" ).find( 'textarea' ).attr( 'id' ),
customButtonsContainer = this.ui.panels.find( '.generate-sections-editor-wrap' ).find( '#custom-media-buttons' );
customButtonsContainer.find( '.insert-media' ).remove();
var customButtons = customButtonsContainer.html();
customButtonsContainer.remove();
var init_settings = true;
if ( typeof tinyMCEPreInit == "object" && "mceInit" in tinyMCEPreInit && "content" in tinyMCEPreInit.mceInit ) {
init_settings = tinyMCEPreInit.mceInit.content;
} else if ( typeof window.wpEditorL10n !== "undefined" ) {
init_settings = window.wpEditorL10n.tinymce.settings;
} else {
init_settings = this.tmc_defaults;
}
var thisPanel = this.ui.panels;
var custom_settings = {
wp_autoresize_on: false,
cache_suffix: "",
min_height: 400,
wp_keep_scroll_position: false,
setup: function( editor ) {
editor.on( 'init', function( e ) {
if ( 'html-active' === generate_sections_metabox_i18n.default_editor && generate_sections_metabox_i18n.user_can_richedit ) {
thisPanel.find( '#wp-generate-sections-editor-wrap' ).removeClass( 'tmce-active' ).addClass( 'html-active' );
editor.hidden = true;
}
} );
}
}
init_settings = $.extend({}, init_settings, custom_settings);
var qt_settings = true;
if ( typeof tinyMCEPreInit == "object" && "qtInit" in tinyMCEPreInit && "content" in tinyMCEPreInit.qtInit ) {
qt_settings = tinyMCEPreInit.qtInit.content;
} else {
qt_settings = this.qt_defaults;
}
if ( ! generate_sections_metabox_i18n.user_can_richedit ) {
init_settings = false;
}
wp.sectionsEditor.initialize( id, {
tinymce: init_settings,
quicktags: qt_settings,
mediaButtons: true
} );
var buttonsElement = this.ui.panels.find( '#wp-generate-sections-editor-wrap' ).find( '.wp-media-buttons' );
buttonsElement.attr( 'id', 'custom-media-buttons' );
$( customButtons ).appendTo( buttonsElement );
if ( ! generate_sections_metabox_i18n.user_can_richedit ) {
this.ui.panels.find( '#generate-sections-editor' ).addClass( 'no-rich-edit' );
}
},
/**
* Make the menu mobile-friendly
*/
toggleMenu: function() {
this.$el.find('.media-menu').toggleClass('visible');
},
/**
* Create the nav tabs & panels
*/
renderContent: function() {
var model = this.model;
var menu_item = wp.template("generate-sections-modal-menu-item");
// Save a reference to the navigation bar"s unordered list and populate it with items.
this.ui.nav = this.$el.find(".media-menu");
// reference to content area
this.ui.panels = this.$el.find(".media-frame-content");
// loop through the tabs
if (generate_sections_metabox_i18n.tabs.length) {
// for...of is nicer, but not supported by minify, so stay with for...in for now
for (var tab in generate_sections_metabox_i18n.tabs) {
if (generate_sections_metabox_i18n.tabs.hasOwnProperty(tab)) {
tab = generate_sections_metabox_i18n.tabs[tab];
var $new_tab = $(menu_item({
target: tab.target,
name: tab.title
}));
var panel = wp.template("generate-sections-edit-" + tab.target);
var $new_panel = $(panel(model.toJSON()));
if (tab.active == "true") {
$new_tab.addClass("active");
$new_panel.addClass("active");
}
jQuery( 'body' ).on( 'generate_section_show_settings', function() {
jQuery( '.generate-sections-modal .media-menu-item' ).removeClass('active');
jQuery( '.generate-sections-modal .panel' ).removeClass('active');
jQuery( '.generate-section-item-style' ).addClass('active');
jQuery( '.generate-section-settings' ).addClass('active');
});
this.ui.nav.append($new_tab);
this.ui.panels.append($new_panel);
}
}
}
},
/**
* Render the background image preview
*/
renderPreview: function(image_id) {
var image_id = typeof image_id !== 'undefined' ? image_id : this.model.get("background_image");
var $preview = $("#generate-section-image-preview");
$preview.children().remove();
if (image_id > 0) {
this.background = new wp.media.model.Attachment.get(image_id);
this.background.fetch({
success: function(att) {
if (_.contains(['png', 'jpg', 'gif', 'jpeg'], att.get('subtype'))) {
$("<img/>").attr("src", att.attributes.sizes.thumbnail.url).appendTo($preview);
$preview.next().find(".generate-sections-remove-image").show();
}
}
});
}
},
/**
* Set the default option for the select boxes
*/
selected: function() {
var _this = this;
this.$el.find("select").each(function(index, select) {
var attribute = jQuery(select).attr("name");
var selected = _this.model.get(attribute);
jQuery(select).val(selected);
});
},
/**
* Start the colorpicker
*/
colorPicker: function() {
this.$el.find(".generate-sections-color").wpColorPicker();
},
/**
* Launch Media Uploader
*/
openMediaUploader: function(e) {
var _this = this;
$input = jQuery(e.currentTarget).prev("#generate-sections-background-image");
e.preventDefault();
// If the uploader object has already been created, reopen the dialog
if (this.mediaUploader) {
this.mediaUploader.open();
return;
}
// Extend the wp.media object
this.mediaUploader = wp.media.frames.file_frame = wp.media({
title: generate_sections_metabox_i18n.media_library_title,
button: {
text: generate_sections_metabox_i18n.media_library_button
},
multiple: false
});
// When a file is selected, grab the URL and set it as the text field"s value
this.mediaUploader.on("select", function() {
attachment = _this.mediaUploader.state().get("selection").first().toJSON();
$input.val(attachment.id);
_this.renderPreview(attachment.id);
});
// Open the uploader dialog
this.mediaUploader.open();
},
/**
* Remove the background image
*/
removeImage: function(e) {
e.preventDefault();
$("#generate-section-image-preview").children().remove();
$("#generate-section-image-preview").next().find(".generate-sections-remove-image").hide();
$("#generate-sections-background-image").val("");
},
/**
* Closes the modal and cleans up after the instance.
* @param e {object} A jQuery-normalized event object.
*/
closeModal: function(e) {
"use strict";
e.preventDefault();
this.undelegateEvents();
jQuery(document).off("focusin");
jQuery("body").removeClass("generate-modal-open");
jQuery("body").removeClass("generate-section-content");
// remove restricted media modal tab focus once it's closed
this.$el.undelegate('keydown');
// remove the tinymce editor
// this needs to be called before the modal is closed or it will fail in Firefox (that was fun to figure out...)
if (typeof tinyMCE != "undefined") {
tinymce.EditorManager.execCommand("mceRemoveEditor", true, "generate-sections-editor");
}
// remove modal and unset instances
this.remove();
Generate_Sections.backbone_modal.__instance = undefined;
this.mediaUploader = null;
Generate_Sections.modalOpen = null;
// switch the insert button text back
this.changeInsertText(true);
// send focus back to where it was prior to modal open
Generate_Sections.lastFocus.focus();
// aria unhide the background
jQuery("#wpwrap").attr("aria-hidden", "false");
// Fix bug where the window scrolls down 50px on close
var topDistance = jQuery("body").offset().top;
if ( topDistance >= jQuery("body").scrollTop() ) {
jQuery("body").scrollTop(0);
}
},
/**
* Responds to the btn-ok.click event
* @param e {object} A jQuery-normalized event object.
* @todo You should make this your own.
*/
saveModal: function(e) {
"use strict";
this.model.get("index");
var model = this.model;
// send the tinymce content to the textarea
if (typeof tinyMCE != "undefined") {
tinymce.triggerSave();
}
var $inputs = this.ui.panels.find("input, select, textarea");
$inputs.each(function(index, input) {
var name = $(input).attr("name");
if (model.attributes.hasOwnProperty(name)) {
var value = $(input).val();
model.set(name, value);
}
});
this.closeModal(e);
},
/**
* Handles tab clicks and switches to corresponding panel
* @param e {object} A jQuery-normalized event object.
*/
switchTab: function(e) {
"use strict";
e.preventDefault();
// close lingering wp link windows
if (typeof tinyMCE != "undefined" && 'style' == jQuery( e.currentTarget ).data( 'target' ) && this.ui.panels.find( '#wp-generate-sections-editor-wrap' ).hasClass( 'tmce-active' )) {
tinyMCE.activeEditor.execCommand('wp_link_cancel');
tinyMCE.activeEditor.execCommand('wp_media_cancel');
}
this.ui.nav.children().removeClass("active");
this.ui.panels.children().removeClass("active");
var target = jQuery(e.currentTarget).addClass("active").data("target");
this.ui.panels.find("div[data-id=" + target + "]").addClass("active");
},
/**
* close on keyboard shortcuts
* @param {Object} event
*/
keydown: function(e) {
// Close the modal when escape is pressed.
if (27 === e.which && this.$el.is(':visible')) {
this.closeModal(e);
e.stopImmediatePropagation();
}
}
});
// Singular View
Generate_Sections.sectionView = Backbone.View.extend({
model: Generate_Sections.Section,
tagName: 'div',
initialize: function() {
// re-render on all changes EXCEPT index
this.listenTo(this.model, "change", this.maybeRender);
},
attributes: {
class: "ui-state-default section"
},
// Get the template from the DOM
template: wp.template("generate-sections-section"),
events: {
'click .edit-section': 'editSection',
'click .section-title > span': 'editSection',
'click .delete-section': 'removeSection',
'click .toggle-section': 'toggleSection',
'reorder': 'reorder',
},
maybeRender: function(e) {
if (this.model.hasChanged('index')) return;
this.render();
},
// Render the single model - include an index.
render: function() {
this.model.set('index', this.model.collection.indexOf(this.model));
this.$el.html(this.template(this.model.toJSON()));
if (!this.model.get('title')) {
this.$el.find('h3.section-title > span').text(generate_sections_metabox_i18n.default_title);
}
this.$el.find('textarea').val(JSON.stringify(this.model));
return this;
},
// launch the edit modal
editSection: function(e) {
// stash the current focus
Generate_Sections.lastFocus = document.activeElement;
Generate_Sections.modalOpen = true;
e.preventDefault();
if (Generate_Sections.backbone_modal.__instance === undefined) {
Generate_Sections.backbone_modal.__instance = new Generate_Sections.backbone_modal.Application({
model: this.model
});
}
},
// reorder after sort
reorder: function(event, index) {
this.$el.trigger('update-sort', [this.model, index]);
},
// remove/destroy a model
removeSection: function(e) {
e.preventDefault();
if (confirm(generate_sections_metabox_i18n.confirm)) {
this.model.destroy();
Generate_Sections.sectionList.render(); // manually calling instead of listening since listening interferes with sorting
}
},
});
// List View
Generate_Sections.sectionListView = Backbone.View.extend({
el: "#generate_sections_container",
events: {
'update-sort': 'updateSort',
// 'add-section': 'addOne'
},
// callback for clone button
addSection: function(model) {
this.collection.add(model);
this.addOne(model);
},
addOne: function(model) {
var view = new Generate_Sections.sectionView({
model: model
});
this.$el.append(view.render().el);
},
render: function() {
this.$el.children().remove();
this.collection.each(this.addOne, this);
return this;
},
updateSort: function(event, model, position) {
this.collection.remove(model);
// renumber remaining models around missing model
this.collection.each(function(model, index) {
var new_index = index;
if (index >= position) {
new_index += 1;
}
model.set('index', new_index);
});
// set the index of the missing model
model.set('index', position);
// add the model back to the collection
this.collection.add(model, {
at: position
});
this.render();
},
});
// The Buttons & Nonce
Generate_Sections.ButtonControls = Backbone.View.extend({
attributes: {
class: "generate_sections_buttons"
},
tagName: 'p',
el: "#_generate_sections_metabox",
template: wp.template("generate-sections-buttons"),
// Attach events
events: {
"click .button-primary": "newSection",
"click #generate-delete-sections": "clearAll",
'click .edit-section': 'editSection',
},
// create new
newSection: function(e) {
e.preventDefault();
var newSection = new Generate_Sections.Section();
Generate_Sections.sectionList.addSection(newSection);
},
// clear all models
clearAll: function(e) {
e.preventDefault();
if (confirm(generate_sections_metabox_i18n.confirm)) {
Generate_Sections.sectionCollection.reset();
Generate_Sections.sectionList.render();
}
},
render: function() {
this.$el.find(".generate_sections_control").append(this.template);
return this;
},
});
// init
Generate_Sections.initApplication = function() {
// Create Collection From Existing Meta
Generate_Sections.sectionCollection = new Generate_Sections.SectionsCollection(generate_sections_metabox_i18n.sections);
// Create the List View
Generate_Sections.sectionList = new Generate_Sections.sectionListView({
collection: Generate_Sections.sectionCollection
});
Generate_Sections.sectionList.render();
// Buttons
Generate_Sections.Buttons = new Generate_Sections.ButtonControls({
collection: Generate_Sections.sectionCollection
});
Generate_Sections.Buttons.render();
};
/*-----------------------------------------------------------------------------------*/
/* Execute the above methods in the Generate_Sections object.
/*-----------------------------------------------------------------------------------*/
jQuery( function( $ ) {
Generate_Sections.initApplication();
$( '#generate_sections_container' ).sortable({
axis: "y",
opacity: 0.5,
grid: [20, 10],
tolerance: "pointer",
handle: ".move-section",
update: function(event, ui) {
ui.item.trigger("reorder", ui.item.index());
}
} );
if ( $( '.use-sections-switch' ).is( ':checked' ) ) {
setTimeout( function() {
generateShowSections();
}, 200 );
} else {
generateHideSections();
}
$( '.use-sections-switch' ).on( 'change', function( e ) {
var status = ( $(this).is( ':checked' ) ) ? 'checked' : 'unchecked';
if ( 'checked' == status ) {
generateShowSections();
} else if ( 'unchecked' == status ) {
generateHideSections();
}
} );
function generateShowSections() {
// Hide send to editor button
$('.send-to-editor').css('display', 'none');
// Hide the editor
$('#postdivrich').css({
'opacity': '0',
'height': '0',
'overflow': 'hidden'
});
$( '.block-editor-block-list__layout' ).hide();
$( '.edit-post-layout .edit-post-visual-editor' ).css( {
'flex-grow': 'unset',
'flex-basis': '0'
} );
$( '.edit-post-visual-editor .block-editor-writing-flow__click-redirect' ).css( {
'min-height': '0'
} );
$( '.edit-post-layout__metaboxes:not(:empty)' ).css( 'border-top', '0' );
// Show the sections
$('#_generate_sections_metabox').css({
'opacity': '1',
'height': 'auto'
});
// Remove and add the default editor - this removes any visible toolbars etc..
// We need to set a timeout for this to work
// if (typeof tinyMCE != "undefined") {
// tinyMCE.EditorManager.execCommand("mceRemoveEditor", true, "content");
// $( '.use-sections-cover' ).css( 'z-index','10000' );
// setTimeout('tinyMCE.EditorManager.execCommand("mceAddEditor", true, "content");', 1);
// setTimeout('jQuery( ".use-sections-cover" ).css( "z-index","-1" );', 1000);
// }
// Set a trigger
$('body').trigger('generate_show_sections');
}
function generateHideSections() {
// Show send to editor button
$('.send-to-editor').css('display', 'inline-block');
// Show the editor
$('#postdivrich').css({
'opacity': '1',
'height': 'auto'
});
$( '.block-editor-block-list__layout' ).show();
$( '.edit-post-layout .edit-post-visual-editor' ).css( {
'flex-grow': '',
'flex-basis': ''
} );
$( '.edit-post-visual-editor .block-editor-writing-flow__click-redirect' ).css( {
'min-height': ''
} );
$( '.edit-post-layout__metaboxes:not(:empty)' ).css( 'border-top', '' );
// Hide the sections
$('#_generate_sections_metabox').css({
'opacity': '0',
'height': '0',
'overflow': 'hidden'
});
$('body').trigger('generate_hide_sections');
}
$( document ).on( 'click', '.edit-section.edit-settings', function() {
$( 'body' ).trigger( 'generate_section_show_settings' );
});
});
})(jQuery, Generate_Sections);

View File

@ -0,0 +1,396 @@
<?php
// No direct access, please
if ( ! defined( 'ABSPATH' ) ) exit;
if ( ! function_exists( 'generate_sections_admin_body_class' ) ) {
add_filter( 'admin_body_class', 'generate_sections_admin_body_class' );
function generate_sections_admin_body_class( $classes ) {
global $post;
$use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : '';
if ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) {
$classes .= ' generate-sections-enabled';
}
return $classes;
}
}
if ( ! function_exists( 'generate_sections_content_width' ) ) {
add_action( 'wp', 'generate_sections_content_width', 50 );
/**
* Set our content width when sections are enabled
*/
function generate_sections_content_width() {
global $post;
$use_sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_use_sections', TRUE) : '';
if ( isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ) {
global $content_width;
$content_width = 2000;
}
}
}
if ( ! function_exists( 'generate_sections_add_metaboxes' ) ) {
add_action( 'add_meta_boxes', 'generate_sections_add_metaboxes', 5 );
/*
* Functions for creating the metaboxes
*/
function generate_sections_add_metaboxes() {
$post_types = apply_filters( 'generate_sections_post_types', array( 'page', 'post' ) );
add_meta_box(
'_generate_use_sections_metabox',
__( 'Sections', 'gp-premium' ),
'generate_sections_use_sections_metabox',
$post_types,
'side',
'high'
);
add_meta_box(
'_generate_sections_metabox',
__( 'Sections', 'gp-premium' ),
'generate_sections_sections_metabox',
$post_types,
'normal',
'high'
);
}
}
if ( ! function_exists( 'generate_sections_sanitize_function' ) ) {
/*
* Sanitize our settings
*/
function generate_sections_sanitize_function( $data, $post_id ) {
$section = array();
if ( isset( $data['title'] ) ) {
$section['title'] = sanitize_text_field( $data['title'] );
}
if ( isset( $data['content'] ) ) {
$section['content'] = sanitize_post_field( 'post_content', $data['content'], $post_id, 'db' );
}
if ( isset( $data['custom_classes'] ) ) {
$section['custom_classes'] = sanitize_text_field( $data['custom_classes'] );
}
if ( isset( $data['custom_id'] ) ) {
$section['custom_id'] = sanitize_text_field( $data['custom_id'] );
}
if ( isset( $data['top_padding'] ) ) {
$section['top_padding'] = '' == $data['top_padding'] ? $data['top_padding'] : absint( $data['top_padding'] );
}
if ( isset( $data['bottom_padding'] ) ) {
$section['bottom_padding'] = '' == $data['bottom_padding'] ? $data['bottom_padding'] : absint( $data['bottom_padding'] );
}
if ( isset( $data['top_padding_unit'] ) ) {
$section['top_padding_unit'] = $data['top_padding_unit'] == '%' ? '%' : '';
}
if ( isset( $data['bottom_padding_unit'] ) ) {
$section['bottom_padding_unit'] = $data['bottom_padding_unit'] == '%' ? '%' : '';
}
if ( isset( $data['background_image'] ) ) {
$section['background_image'] = absint( $data['background_image'] );
}
if ( isset( $data['background_color'] ) ) {
$section['background_color'] = generate_sections_sanitize_rgba( $data['background_color'] );
}
if ( isset( $data['text_color'] ) ) {
$section['text_color'] = generate_sections_sanitize_hex_color( $data['text_color'] );
}
if ( isset( $data['link_color'] ) ) {
$section['link_color'] = generate_sections_sanitize_hex_color( $data['link_color'] );
}
if ( isset( $data['link_color_hover'] ) ) {
$section['link_color_hover'] = generate_sections_sanitize_hex_color( $data['link_color_hover'] );
}
if ( isset( $data['box_type'] ) ) {
$section['box_type'] = $data['box_type'] == 'contained' ? 'contained' : '';
}
if ( isset( $data['inner_box_type'] ) ) {
$section['inner_box_type'] = $data['inner_box_type'] == 'fluid' ? 'fluid' : '';
}
if ( isset( $data['parallax_effect'] ) ) {
$section['parallax_effect'] = $data['parallax_effect'] == 'enable' ? 'enable' : '';
}
if ( isset( $data['background_color_overlay'] ) ) {
$section['background_color_overlay'] = $data['background_color_overlay'] == 'enable' ? 'enable' : '';
}
return $section;
}
}
if ( ! function_exists( 'generate_sections_metabox_scripts' ) ) {
add_action( 'admin_enqueue_scripts', 'generate_sections_metabox_scripts', 20 );
/*
* Enqueue styles and scripts specific to metaboxs
*/
function generate_sections_metabox_scripts( $hook ) {
// I prefer to enqueue the styles only on pages that are using the metaboxes
if ( in_array( $hook, array( "post.php", "post-new.php" ) ) ) {
$post_types = apply_filters( 'generate_sections_post_types', array( 'page', 'post' ) );
$screen = get_current_screen();
$post_type = $screen->id;
if ( in_array( $post_type, (array) $post_types ) ) {
wp_enqueue_style( 'generate-sections-metabox', plugin_dir_url( __FILE__ ) . 'css/generate-sections-metabox.css', false, GENERATE_SECTIONS_VERSION );
wp_enqueue_style( 'generate-lc-switch', plugin_dir_url( __FILE__ ) . 'css/lc_switch.css', false, GENERATE_SECTIONS_VERSION );
//make sure we enqueue some scripts just in case ( only needed for repeating metaboxes )
wp_enqueue_script( 'jquery' );
wp_enqueue_script( 'jquery-ui-core' );
wp_enqueue_script( 'jquery-ui-widget' );
wp_enqueue_script( 'jquery-ui-mouse' );
wp_enqueue_script( 'jquery-ui-sortable' );
wp_enqueue_script( 'editor' );
wp_enqueue_script( 'media-upload' );
wp_enqueue_script( 'wp-color-picker' );
wp_enqueue_style( 'wp-color-picker' );
wp_enqueue_script( 'wp-color-picker-alpha', GP_LIBRARY_DIRECTORY_URL . 'alpha-color-picker/wp-color-picker-alpha.min.js', array( 'wp-color-picker' ), '3.0.0', true );
wp_add_inline_script(
'wp-color-picker-alpha',
'jQuery( function() { jQuery( ".color-picker" ).wpColorPicker(); } );'
);
wp_enqueue_media();
if ( function_exists( 'wp_enqueue_editor' ) ) {
wp_enqueue_editor();
wp_add_inline_script(
'editor',
'window.wp.sectionsEditor = window.wp.editor;',
'after'
);
}
if ( version_compare( get_bloginfo( 'version' ), '5.0', '<' ) ) {
wp_enqueue_script( 'generate-sections-metabox', plugin_dir_url( __FILE__ ) . 'js/generate-sections-metabox-4.9.js', array( 'jquery', 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-mouse', 'jquery-ui-sortable', 'editor', 'media-upload', 'wp-color-picker' ), GENERATE_SECTIONS_VERSION, true );
} else {
wp_enqueue_script( 'generate-sections-metabox', plugin_dir_url( __FILE__ ) . 'js/generate-sections-metabox.js', array( 'jquery', 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-mouse', 'jquery-ui-sortable', 'editor', 'media-upload', 'wp-color-picker' ), GENERATE_SECTIONS_VERSION, true );
}
if ( function_exists( 'wp_add_inline_script' ) ) {
if ( function_exists( 'generate_get_default_color_palettes' ) ) {
// Grab our palette array and turn it into JS
$palettes = json_encode( generate_get_default_color_palettes() );
// Add our custom palettes
// json_encode takes care of escaping
wp_add_inline_script( 'wp-color-picker', 'jQuery.wp.wpColorPicker.prototype.options.palettes = ' . $palettes . ';' );
}
}
}
}
}
}
if ( ! function_exists( 'generate_sections_admin_footer_scripts' ) ) {
add_action( 'admin_footer', 'generate_sections_admin_footer_scripts' );
function generate_sections_admin_footer_scripts() {
// We don't need this if wp_add_inline_script exists
if ( function_exists( 'wp_add_inline_script' ) ) {
return;
}
?>
<script>
if ( typeof lc_switch !== 'undefined' ) {
jQuery(document).ready(function($) { $(".use-sections-switch").lc_switch("","");});
}
</script>
<?php
}
}
if ( ! function_exists( 'generate_sections_use_sections_metabox' ) ) {
function generate_sections_use_sections_metabox() {
include_once( plugin_dir_path( __FILE__ ) . 'views/use-sections.php' );
}
}
if ( ! function_exists( 'generate_sections_sections_metabox' ) ) {
function generate_sections_sections_metabox() {
global $post;
$meta = get_post_meta( $post->ID, '_generate_sections', true );
$sections = isset( $meta['sections'] ) && is_array( $meta['sections' ] ) ? $meta['sections'] : array();
$translation_array = array(
'confirm' => __( 'This action can not be undone, are you sure?', 'gp-premium' ),
'post_id' => $post->ID,
'sections' => $sections,
'default_title' => __( 'Section', 'gp-premium' ),
'default_content_title' => __( 'Content', 'gp-premium' ),
'tabs' => array(
array( 'title' => __( 'Settings', 'gp-premium' ), 'target' => 'style', 'active' => 'false' ),
array( 'title' => __( 'Content', 'gp-premium' ), 'target' => 'content', 'active' => 'true' ),
//array( 'title' => __( 'Layout', 'gp-premium' ), 'target' => 'layout', 'active' => 'false' ),
),
'top_padding' => apply_filters( 'generate_sections_default_padding_top','40' ),
'bottom_padding' => apply_filters( 'generate_sections_default_padding_bottom','40' ),
'media_library_title' => __('Section Background', 'gp-premium' ),
'media_library_button' => __( 'Set as Section Background', 'gp-premium' ),
'generate_nonce' => wp_create_nonce( 'generate_sections_nonce' ),
'default_editor' => user_can_richedit() && wp_default_editor() == 'tinymce' ? 'tmce-active' : 'html-active',
'user_can_richedit' => user_can_richedit(),
'insert_into_section' => __( 'Insert into Section', 'gp-premium' ),
'edit_section' => __( 'Edit Section', 'gp-premium' )
);
wp_localize_script( 'generate-sections-metabox', 'generate_sections_metabox_i18n', $translation_array );
include_once( plugin_dir_path( __FILE__ ) . 'views/sections.php' );
include_once( plugin_dir_path( __FILE__ ) . 'views/sections-template.php' );
add_action( 'print_media_templates', 'generate_sections_print_templates' );
do_action( 'generate_sections_metabox' );
}
}
if ( ! function_exists( 'generate_sections_save_use_metabox' ) ) {
add_action( 'save_post', 'generate_sections_save_use_metabox' );
/*
* Save the "use" metabox
*/
function generate_sections_save_use_metabox( $post_id ) {
if ( ! isset( $_POST['_generate_sections_use_sections_nonce'] ) || ! wp_verify_nonce( $_POST['_generate_sections_use_sections_nonce'], 'generate_sections_use_sections_nonce' ) ) {
return $post_id;
}
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
return $post_id;
}
if ( ! current_user_can('edit_post', $post_id ) ) {
return $post_id;
}
if ( isset ( $_POST['_generate_use_sections'] ) && isset ( $_POST['_generate_use_sections']['use_sections'] ) && $_POST['_generate_use_sections']['use_sections'] == 'true' ) {
update_post_meta( $post_id, '_generate_use_sections', array( 'use_sections' => 'true' ) );
} else {
delete_post_meta( $post_id, '_generate_use_sections' );
}
}
}
if ( ! function_exists( 'generate_sections_save_sections_metabox' ) ) {
add_action( 'save_post', 'generate_sections_save_sections_metabox', 20 );
/*
* Save the sections metabox
*/
function generate_sections_save_sections_metabox( $post_id ) {
if ( ! isset( $_POST['_generate_sections_nonce'] ) || ! wp_verify_nonce( $_POST['_generate_sections_nonce'], 'generate_sections_nonce' ) ) {
return $post_id;
}
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
return $post_id;
}
if ( ! current_user_can('edit_post', $post_id ) ) {
return $post_id;
}
$clean = array();
if ( isset ( $_POST['_generate_sections'] ) && isset( $_POST['_generate_sections']['sections'] ) && is_array( $_POST['_generate_sections']['sections'] ) ) {
foreach( $_POST['_generate_sections']['sections'] as $section ) {
$section = json_decode( stripslashes( trim($section) ), true);
$section = generate_sections_sanitize_function( $section, $post_id );
if ( ! empty( $section ) ){
$clean[] = $section;
}
}
}
// save data
if ( ! empty( $clean ) ) {
// this maintains data structure of previous version
$meta = array( 'sections' => $clean );
update_post_meta( $post_id, '_generate_sections', $meta );
} else {
delete_post_meta( $post_id, '_generate_sections' );
}
}
}
if ( ! function_exists( 'generate_sections_sanitize_hex_color' ) ) {
/*
* Sanitize colors
* We don't use the built in function so we can use empty values
*/
function generate_sections_sanitize_hex_color( $color ) {
if ( '' === $color ) {
return '';
}
// 3 or 6 hex digits, or the empty string.
if ( preg_match('|^#([A-Fa-f0-9]{3}){1,2}$|', $color ) ) {
return $color;
}
return null;
}
}
if ( ! function_exists( 'generate_sections_sanitize_rgba' ) ) {
/**
* Sanitize RGBA colors
* @since 1.3.42
*/
function generate_sections_sanitize_rgba( $color ) {
if ( '' === $color ) {
return '';
}
// If string does not start with 'rgba', then treat as hex
// sanitize the hex color and finally convert hex to rgba
if ( false === strpos( $color, 'rgba' ) ) {
return generate_sections_sanitize_hex_color( $color );
}
// By now we know the string is formatted as an rgba color so we need to further sanitize it.
$color = str_replace( ' ', '', $color );
sscanf( $color, 'rgba(%d,%d,%d,%f)', $red, $green, $blue, $alpha );
return 'rgba('.$red.','.$green.','.$blue.','.$alpha.')';
return '';
}
}

View File

@ -0,0 +1,279 @@
<?php
// No direct access, please
if ( ! defined( 'ABSPATH' ) ) exit;
/**
* Prints the templates used in the sections metabox
*
* @global bool $is_IE
*/
function generate_sections_print_templates() {
global $is_IE;
$class = 'media-modal wp-core-ui';
if ( $is_IE && strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 7') !== false ){
$class .= ' ie7';
}
/**
* Backbone Templates
* This file contains all of the HTML used in our application
*
* Each template is wrapped in a script block ( note the type is set to "text/html" ) and given an ID prefixed with
* 'tmpl'. The wp.template method retrieves the contents of the script block and converts these blocks into compiled
* templates to be used and reused in your application.
*/
/**
* The Singular List View
*/
?>
<script type="text/template" id="tmpl-generate-sections-section">
<h3 class="section-title">
<span class="text generate-section-text" title="<?php _e( 'Click to edit', 'gp-premium' );?>">{{{ data.title }}}</span>
<div class="section-controls">
<a class="edit-section edit-content dashicons dashicons-edit" href="#" title="<?php _e( 'Click to edit content', 'gp-premium' );?>"></a>
<a class="edit-section edit-settings dashicons dashicons-admin-generic" href="#" title="<?php _e( 'Click to edit settings', 'gp-premium' );?>"></a>
<a class="move-section dashicons dashicons-move" href="#" title="<?php _e( 'Click and drag to sort', 'gp-premium' );?>"></a>
<a class="delete-section dashicons dashicons-no" href="#" title="<?php esc_attr_e( 'Click to remove', 'gp-premium' );?>"></a>
</div>
</h3>
<textarea name="_generate_sections[sections][{{{ data.index }}}]" readonly="readonly"></textarea>
</script>
<?php
/**
* The Add/Clear buttons
*/
?>
<script type="text/template" id="tmpl-generate-sections-buttons">
<a href="#" id="generate-add-section" class="button-primary button-large"><?php _e( 'Add Section', 'gp-premium' );?></a>
<a href="#" style="display:none;" id="generate-delete-sections" class="button button-large"><?php _e( 'Remove Sections', 'gp-premium');?></a>
<?php wp_nonce_field( 'generate_sections_nonce', '_generate_sections_nonce' ); ?>
</script>
<?php
/**
* The Modal Window, including sidebar and content area.
* Add menu items to ".media-frame-menu"
* Add content to ".media-frame-content"
*/
?>
<script type="text/html" id="tmpl-generate-sections-modal-window">
<div class="<?php echo esc_attr( $class ); ?>">
<button type="button" class="button-link media-modal-close" aria-label="close"><span class="media-modal-icon"><span class="screen-reader-text"><?php _e( 'Close', 'gp-premium' ); ?></span></span></button>
<div class="media-modal-content">
<div class="media-frame mode-select wp-core-ui hide-router">
<div class="media-frame-menu"><div class="media-menu"></div></div>
<div class="media-frame-title">
<h1><?php _e( 'Edit Section', 'gp-premium' ); ?><span class="dashicons dashicons-arrow-down"></span></h1>
</div>
<div class="media-frame-content"></div>
<div class="media-frame-toolbar">
<div class="media-toolbar">
<div class="media-toolbar-primary">
<button type="button" class="button media-button button-primary button-large media-button-insert"><?php _e( 'Apply', 'gp-premium' ); ?></button>
<button type="button" class="button button media-button button button-large media-button-close"><?php _e( 'Cancel', 'gp-premium' ); ?></button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="media-modal-backdrop"></div>
</script>
<?php
/**
* Base template for a navigation-bar menu item
*/
?>
<script type="text/html" id='tmpl-generate-sections-modal-menu-item'>
<a class="media-menu-item generate-section-item-{{ data.target }}" data-target="{{ data.target }}">{{ data.name }}</a>
</script>
<?php
/**
* the Edit Sections
*/
?>
<script type="text/html" id="tmpl-generate-sections-edit-content">
<div data-id="content" class="panel generate-section-content">
<div class="gs-grid-100 section-title">
<label for="title"><?php _e( 'Section Label', 'gp-premium' );?></label>
<p>
<input type="text" name="title" placeholder="{{{ generate_sections_metabox_i18n.default_title }}}" id="title" value="{{{ data.title }}}"/>
</p>
</div>
<?php if ( version_compare( get_bloginfo( 'version' ), '5.0', '<' ) ) : ?>
<div class="gs-grid-100 wp-core-ui wp-editor-wrap">
<div class="postarea wp-editor-expand">
<div id="wp-generate-sections-editor-wrap" class="wp-core-ui wp-editor-wrap old-sections-js">
<div id="wp-generate-sections-editor-editor-tools" class="wp-editor-tools hide-if-no-js">
<div class="wp-media-buttons">
<button type="button" class="button insert-media add_media generate-sections-add-media" data-editor="generate-sections-editor"><span class="wp-media-buttons-icon"></span><?php _e( 'Add Media', 'gp-premium' );?></button>
<?php do_action( 'media_buttons' ); ?>
</div>
<div class="wp-editor-tabs">
<button type="button" id="content-tmce" class="wp-switch-editor switch-tmce" data-wp-editor-id="generate-sections-editor"><?php _e( 'Visual', 'gp-premium' ); ?></button>
<button type="button" id="content-html" class="wp-switch-editor switch-html" data-wp-editor-id="generate-sections-editor"><?php _ex( 'Text', 'Name for the Text editor tab (formerly HTML)', 'gp-premium' ); ?></button>
</div>
</div><!-- .wp-editor-tools -->
<div class="wp-editor-container">
<textarea id="generate-sections-editor" class="wp-editor-area" autocomplete="off" cols="40" name="content">{{{ data.content }}}</textarea>
</div>
</div>
</div>
</div>
<?php else : ?>
<div class="gs-grid-100 generate-sections-editor-wrap">
<div id="custom-media-buttons">
<?php do_action( 'media_buttons' ); ?>
</div>
<textarea id="generate-sections-editor" class="wp-editor-area" autocomplete="off" cols="40" name="content">{{{ data.content }}}</textarea>
</div>
<?php endif; ?>
</div>
</script>
<script type="text/html" id="tmpl-generate-sections-edit-layout">
<div data-id="layout" class="panel">
</div>
</script>
<script type="text/html" id="tmpl-generate-sections-edit-style">
<div data-id="style" class="panel generate-section-settings">
<div class="gs-grid-container gs-grid-parent">
<div class="gs-grid-33">
<h3><?php _e( 'Layout', 'gp-premium' ); ?></h3>
<label for="box_type"><?php _e('Box Type', 'gp-premium');?></label>
<p>
<select name="box_type" id="box_type">
<option value=""><?php _e( 'Full Width', 'gp-premium' );?></option>
<option value="contained"><?php _ex( 'Contained', 'Width', 'gp-premium' );?></option>
</select>
</p>
<label for="inner_box_type"><?php _e('Inner Box Type', 'gp-premium');?></label>
<p>
<select name="inner_box_type" id="inner_box_type">
<option value=""><?php _ex( 'Contained', 'Width', 'gp-premium' );?></option>
<option value="fluid"><?php _e( 'Full Width', 'gp-premium' );?></option>
</select>
</p>
<label for="custom_id"><?php _e( 'Custom ID', 'gp-premium' );?></label>
<p>
<input type="text" name="custom_id" id="custom_id" value="{{{ data.custom_id }}}"/>
</p>
<label for="custom_classes"><?php _e( 'Custom Classes', 'gp-premium' );?></label>
<p>
<input type="text" name="custom_classes" id="custom_classes" value="{{{ data.custom_classes }}}"/>
</p>
<label for="top_padding"><?php _e( 'Top Padding', 'gp-premium' );?></label>
<p>
<input placeholder="{{{ generate_sections_metabox_i18n.top_padding }}}" type="number" name="top_padding" id="top_padding" value="{{{ data.top_padding }}}"/><select style="margin:0;position:relative;top:-2px;" name="top_padding_unit" id="top_padding_unit">
<option value="">px</option>
<option value="%">%</option>
</select>
</p>
<label for="bottom_padding"><?php _e( 'Bottom Padding', 'gp-premium' );?></label>
<p>
<input placeholder="{{{ generate_sections_metabox_i18n.bottom_padding }}}" type="number" name="bottom_padding" id="bottom_padding" value="{{{ data.bottom_padding }}}"/><select style="margin:0;position:relative;top:-2px;" name="bottom_padding_unit" id="bottom_padding_unit">
<option value="">px</option>
<option value="%">%</option>
</select>
</p>
</div>
<div class="gs-grid-33">
<h3><?php _e( 'Colors', 'gp-premium' ); ?></h3>
<label for="background_color"><?php _e( 'Background Color', 'gp-premium' );?></label>
<p>
<input class="generate-sections-color" type="text" class="color-picker" data-alpha-enabled="true" data-alpha-color-type="hex" name="background_color" id="background_color" value="{{{ data.background_color }}}"/>
</p>
<label for="text_color"><?php _e( 'Text Color', 'gp-premium' );?></label>
<p>
<input class="generate-sections-color" type="text" name="text_color" id="text_color" value="{{{ data.text_color }}}"/>
</p>
<label for="link_color"><?php _e( 'Link Color', 'gp-premium' );?></label>
<p>
<input class="generate-sections-color" type="text" name="link_color" id="link_color" value="{{{ data.link_color }}}"/>
</p>
<label for="link_color_hover"><?php _e('Link Color Hover', 'gp-premium');?></label>
<p>
<input class="generate-sections-color" type="text" name="link_color_hover" id="link_color_hover" value="{{{ data.link_color_hover }}}"/>
</p>
</div>
<div class="gs-grid-33">
<h3><?php _e( 'Background', 'gp-premium' ); ?></h3>
<label for="generate-sections-background-image"><?php _e( 'Background Image', 'gp-premium' );?></label>
<p id="generate-section-image-preview"></p>
<p>
<input class="image_id" type="hidden" id="generate-sections-background-image" name="background_image" value="{{{ data.background_image }}}" />
<button id="image_button" class="generate-sections-upload-button button" type="button" data-uploader_title="<?php _e( 'Background Image', 'gp-premium' );?>"><?php _e('Upload', 'gp-premium') ;?></button>
<button id="remove_image" class="generate-sections-remove-image button" type="button"><?php _e( 'Remove', 'gp-premium' );?></button>
</p>
<label for="parallax_effect"><?php _e('Parallax Effect', 'gp-premium');?></label>
<p>
<select name="parallax_effect" id="parallax_effect">
<option value=""><?php _e( 'Disable', 'gp-premium' );?></option>
<option value="enable"><?php _e( 'Enable', 'gp-premium' );?></option>
</select>
</p>
<label for="background_color_overlay"><?php _e( 'Background Color Overlay', 'gp-premium' );?></label>
<p>
<select name="background_color_overlay" id="background_color_overlay">
<option value=""><?php _e( 'Disable', 'gp-premium' );?></option>
<option value="enable"><?php _e( 'Enable', 'gp-premium' );?></option>
</select>
</p>
</div>
</div>
</div>
</script>
<?php
}

View File

@ -0,0 +1,13 @@
<?php
// No direct access, please
if ( ! defined( 'ABSPATH' ) ) exit;
?>
<div class="generate_sections_control">
<noscript>
<?php _e('Javascript must be enabled to use Generate Sections', 'gp-premium' );?>
</noscript>
<div id="generate_sections_container"></div>
</div>

View File

@ -0,0 +1,17 @@
<?php
// No direct access, please
if ( ! defined( 'ABSPATH' ) ) exit;
?>
<div class="generate_sections_control">
<?php
global $post;
$use_sections = get_post_meta( $post->ID, '_generate_use_sections', true );
//$use_sections = isset( $use_sections['use_sections'] ) && 'true' == $use_sections['use_sections'] ? true : false;
wp_nonce_field( 'generate_sections_use_sections_nonce', '_generate_sections_use_sections_nonce' );
?>
<label for="_generate_use_sections[use_sections]">
<input type="checkbox" class="use-sections-switch" name="_generate_use_sections[use_sections]" id="_generate_use_sections[use_sections]" value="true" <?php if ( isset ( $use_sections['use_sections'] ) ) checked( $use_sections['use_sections'], 'true', true );?> />
<?php _e( 'Use Sections', 'gp-premium' ); ?>
</label>
</div>

View File

@ -0,0 +1,122 @@
<?php
/**
* The template for displaying all pages.
*
* This is the template that displays all pages by default.
* Please note that this is the WordPress construct of pages
* and that other 'pages' on your WordPress site will use a
* different template.
*
* @package Generate
*/
// No direct access, please
if ( ! defined( 'ABSPATH' ) ) exit;
get_header();
$sections = ( isset( $post ) ) ? get_post_meta( $post->ID, '_generate_sections', TRUE) : '';
$sidebars = apply_filters( 'generate_sections_sidebars', false );
?>
<div id="primary" <?php echo $sidebars ? generate_content_class() : 'class="content-area grid-parent grid-100"' ?>>
<main id="main" <?php if ( function_exists( 'generate_main_class' ) ) generate_main_class(); ?>>
<?php do_action('generate_before_main_content'); ?>
<?php if ( post_password_required() ) : ?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?> <?php generate_article_schema( 'CreativeWork' ); ?>>
<div class="inside-article">
<div class="entry-content" itemprop="text">
<?php the_content(); ?>
</div><!-- .entry-content -->
</div><!-- .inside-article -->
</article><!-- #post-## -->
<?php else : ?>
<?php
// check if the repeater field has rows of data
if( $sections && '' !== $sections ) :
// loop through the rows of data
$i = 0;
$return = '';
foreach ( $sections['sections'] as $section ) :
$i++;
// Get the values
$box_type = ( isset( $section['box_type'] ) ) ? $section['box_type'] : 'fluid';
$inner_box_type = ( isset( $section['inner_box_type'] ) ) ? $section['inner_box_type'] : 'contained';
$custom_classes = ( isset( $section['custom_classes'] ) ) ? $section['custom_classes'] : '';
$custom_id = ( isset( $section['custom_id'] ) ) ? $section['custom_id'] : '';
$parallax_effect = ( isset( $section['parallax_effect'] ) ) ? $section['parallax_effect'] : '';
$content = ( isset( $section['content'] ) ) ? apply_filters( 'generate_the_section_content', $section['content'] ) : '';
// Set up parallax
$parallax = ( 'enable' == $parallax_effect ) ? ' enable-parallax' : '';
$parallax_speed = apply_filters( 'generate_sections_parallax_speed', 6 );
$parallax_data = ( 'enable' == $parallax_effect ) ? ' data-speed="' . intval( $parallax_speed ) . '"' : '';
// Set up custom classes
$classes = ( ! empty( $custom_classes ) ) ? ' ' . sanitize_text_field( $custom_classes ) : '';
// Set up custom ID
$custom_id = ( '' == $custom_id ) ? "generate-section-$i" : $custom_id;
// Create container arrays
$container = array();
$inner_container = array();
// Create container
if ( 'contained' == $box_type ) :
$container['before'] = '<div id="' . esc_attr( $custom_id ) . '" class="grid-container grid-parent generate-sections-container' . $parallax . $classes . '"' . $parallax_data . '>';
$container['after'] = '</div>';
else :
$container['before'] = '<div id="' . esc_attr( $custom_id ) . '" class="generate-sections-container' . $parallax . $classes . '"' . $parallax_data . '>';
$container['after'] = '</div>';
endif;
// Create inner container
if ( 'fluid' == $inner_box_type ) :
$inner_container['before'] = '<div class="generate-sections-inside-container" itemprop="text">';
$inner_container['after'] = '</div>';
else :
$inner_container['before'] = '<div class="grid-container grid-parent generate-sections-inside-container" itemprop="text">';
$inner_container['after'] = '</div>';
endif;
// Output the container
$return .= $container['before'];
$return .= $inner_container['before'];
// Output the content
// Add \n\n to fix issue where paragraph wrapping was off
$return .= "\n\n" . $content;
// Output the closing containers
$return .= $container['after'];
$return .= $inner_container['after'];
endforeach;
// Return our sections through the_content filter
echo apply_filters( 'the_content', $return );
else :
?>
<div class="generate-sections-inside-container inside-article">
<div class="grid-container grid-parent generate-sections-inside-container inside-article">
<?php _e( 'No sections added!', 'gp-premium' ); ?>
</div>
</div>
<?php
endif;
?>
<?php endif; ?>
<?php do_action('generate_after_main_content'); ?>
</main><!-- #main -->
</div><!-- #primary -->
<?php
if ( $sidebars) do_action('generate_sidebars');
get_footer();

View File

@ -0,0 +1,21 @@
<?php
/**
* The Sections module.
*
* @since 1.0.0
* @deprecated 2.0.0
*
* @package GP Premium
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // No direct access, please.
}
// Define the version.
if ( ! defined( 'GENERATE_SECTIONS_VERSION' ) ) {
define( 'GENERATE_SECTIONS_VERSION', GP_PREMIUM_VERSION );
}
// Include functions identical between standalone addon and GP Premium.
require plugin_dir_path( __FILE__ ) . 'functions/generate-sections.php';