관리-도구
편집 파일: template-builder.php
<?php ////////////////////////////////////////////////////////////// //=========================================================== // tampalte-builder.php //=========================================================== // PAGELAYER // Inspired by the DESIRE to be the BEST OF ALL // ---------------------------------------------------------- // Started by: Pulkit Gupta // Date: 23rd Jan 2017 // Time: 23:00 hrs // Site: http://pagelayer.com/wordpress (PAGELAYER) // ---------------------------------------------------------- // Please Read the Terms of use at http://pagelayer.com/tos // ---------------------------------------------------------- //=========================================================== // (c)Pagelayer Team //=========================================================== ////////////////////////////////////////////////////////////// // Are we being accessed directly ? if(!defined('PAGELAYER_PRO_VERSION')) { exit('Hacking Attempt !'); } // The function shows the page to add template function pagelayer_builder_template_wizard(){ global $pagelayer; if(!empty($_REQUEST['post'])){ $posts = get_posts([ 'post_type' => $pagelayer->builder['name'], 'post_status' => 'any', 'include' => (int) $_REQUEST['post'], ]); //print_r($posts); // Did we find it ? if(!empty($posts[0])){ $post = $posts[0]; $_post['id'] = $post->ID; $_post['type'] = get_post_meta($post->ID, 'pagelayer_template_type', true); $_post['conditions'] = get_post_meta( $post->ID, 'pagelayer_template_conditions', true ); $_post['post_title'] = $post->post_title; } } // Fill in defaults if nothing found if(empty($_post)){ $_post['id'] = 0; $_post['type'] = ''; $_post['post_title'] = ''; $_post['conditions'] = []; } ?> <style> .pagelayer-temp-search-sel-open{ float: right; font-size: 10px; padding: 0px; line-height: 20px; } .pagelayer-temp-search-sel-remove{ position: absolute; right: 20px; font-size: 11px; top: 10px; z-index: 10; } .pagelayer-temp-search-sel-span{ display: block; margin: 2px; cursor: pointer; box-sizing: border-box; border: 1px solid #dbdbdb; transition: all 0.3s; font-size: 13px; padding: 3px; } .pagelayer-temp-search-sel-span:hover{ border-color: #00A0D2; background-color: #3e8ef7; color: #ffffff; box-shadow: 0px 1px 1px #3e8ef7bf; } .pagelayer-temp-search-sel-span i{ font-size: 15px; line-height: 1em; padding: 3px; color: #555; transition: all 0.3s; vertical-align: middle; } .pagelayer-temp-search-sel-span:hover i{ color: #ffffff; } .pagelayer-temp-search-sel{ vertical-align: top } .pagelayer-temp-toggle{ cursor:pointer; } .pagelayer-temp-label{ display:block; margin-bottom:5px; } .pagelayer-temp-fields{ display:inline-block; position:relative; margin:0 3px; } .pagelayer-temp-condition{ border:1px solid #d0d0d0; margin-bottom:10px; } .pagelayer-temp-tab{ padding: 6px 10px; background: #d0d0d0; display: flow-root; } .pagelayer-temp-condition-div{ padding:10px; } .pagelayer-temp-hide{ display:none; } .pagelayer-temp-search-holder{ position:relative; display:inline-block; } .pagelayer-temp-search-div{ cursor: pointer; padding: 5px; border: solid 1px #d1d1d1; background: #fffffc; color: #333; vertical-align: middle; width: 126px; display: flex; /* min-width: 245px; border-radius: 4px; margin: 0 auto; position: absolute; top: 7px; */ } .pagelayer-temp-search-preview{ position: relative; margin-right: 5px; width: 100%; border: none; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .pagelayer-temp-search-preview i{ padding-right: 5px; font-size: 19px; color: #666; vertical-align: middle; } .pagelayer-temp-search-name{ font-size: 13px; } .pagelayer-temp-search-selector{ position: absolute; z-index: 1000; border: 1px solid rgba(0,0,0,0.2) !important; background: #fff !important; box-shadow: 0 3px 5px rgba(0,0,0,0.2) !important; -webkit-border-radius: 2px !important; text-shadow: none !important; padding: 5px; height: auto; box-sizing: border-box; display: none; width: 100%; border-radius: 2px; margin: 0 0 0 auto; top: 35px; } .pagelayer-temp-search-val{ margin-bottom: 5px !important; padding: 2px 6px; line-height: 20px !important; border-radius: 3px !important; width: 100%; } .pagelayer-temp-search-list{ width: 100%; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; padding: 0; max-height: 183px; overflow-y: auto; } .pagelayer-temp-close{ float:right; font-size:15px; } .pagelayer-close-condition{ font-size: 15px; font-weight: 900; height:7px; margin-top: -2px; padding-left:5px; padding-right:5px; float:right; cursor: pointer; } .pagelayer-temp-add-new, .pagelayer-temp-submit-btn{ font-size: 14px; font-weight: bold; cursor: pointer; border-radius: 2px; padding: 4px 8px; border: #398439 1px solid; color: #fff; background: #449d44; } .pagelayer-temp-pad5{ padding-left:5px; padding-right:5px; } .pagelayer-temp-container{ background-color:#fff; padding:0px; width:95%; border-radius: 4px; margin: 10px auto; } .pagelayer-temp-head{ padding:10px; font-weight:bold; border-bottom: 1px solid #dfdfdf; } .pagelayer-temp-row{ display:table-cell; padding: 10px; } .pagelayer-temp-condition-holder{ padding: 0px 10px; display: none; } .pagelayer-temp-submit{ padding: 10px; } .pagelayer-temp-container select{ font-size:13px; } .postbox{ margin-bottom:5px; } </style> <?php $sel_type = $_post['type']; $dis_conditions = $_post['conditions']; echo ' <div class="pagelayer-temp-container"> <div class="pagelayer-temp-head"> <img src="'.PAGELAYER_URL.'/images/pagelayer-logo-19.png'.'" style="vertical-align: top;" /> '; if(empty($_post['type'])){ echo __pl('add_temp'); }else{ echo __pl('edit_temp').'<span style="float:right" class="pagelayer-temp-edit"><a href="'.esc_url( pagelayer_shortlink($_post['id']).'&pagelayer-live=1' ).'">'.__pl('edit_using').'</a></span>'; } echo ' </div> <div class="pagelayer-temp-row"> <label class="pagelayer-temp-label">'.__('Select Template Type :').'</label> <select name="pagelayer_template_type" class="postbox"> '.pagelayer_create_sel_options( $pagelayer->builder["type"], $sel_type ).' </select> </div> <div class="pagelayer-temp-row"> <label for="pagelayer_lib_title" class="pagelayer-temp-label">'.__('Name :').'</label> <input type="text" name="pagelayer_lib_title" size="30" value="'.$_post['post_title'].'" /> </div> <div class="pagelayer-temp-condition-holder '.((!empty($pagelayer->builder["type"][$sel_type]['no_condition'])) ? ' pagelayer-temp-hide' : '').'"> <label class="pagelayer-temp-label">'.__('Template Display Conditions :').'</label> <div class="pagelayer-temp-condition-container">'; if( !empty($dis_conditions) ){ foreach($dis_conditions as $condi){ echo ' <div class="pagelayer-temp-condition"> <div class="pagelayer-temp-tab"> <span class="pagelayer-temp-toggle pagelayer-temp-pad5">☰</span> <span>'. __('Display Conditions').'</span> <span class="pagelayer-close-condition">×</span> </div> <div class="pagelayer-temp-condition-div"> <div class="pagelayer-temp-fields"> <label for="pagelayer_condition_type" class="pagelayer-temp-label">'. __('Action Type :').'</label> <select name="pagelayer_condition_type[]" class="postbox"> '.pagelayer_create_sel_options( $pagelayer->builder["action"], $condi['type'] ).' </select> </div> <div class="pagelayer-temp-fields"> <label for="pagelayer_condition_name" class="pagelayer-temp-label"> '. __('Display On : ').'</label> <select name="pagelayer_condition_name[]" class="postbox"> '.pagelayer_create_sel_options( $pagelayer->builder['dispay_on'], $condi['template'] ).' </select> </div> <div class="pagelayer-temp-fields '.(empty($condi['template']) ? 'pagelayer-temp-hide' : '').'"> <label for="pagelayer_condition_sub_template" class="pagelayer-temp-label"> '. __('Template : ').'</label> <select name="pagelayer_condition_sub_template[]" class="postbox">'; if($condi['template'] == 'archives'){ echo pagelayer_create_sel_options( $pagelayer->builder['archives_templates'], $condi['sub_template'] ); }else{ echo pagelayer_create_sel_options( $pagelayer->builder['singular_templates'], $condi['sub_template'] ); } echo ' </select> </div> <div class="pagelayer-temp-fields pagelayer-temp-search-sel '. ((empty($condi['sub_template'])) ? ' pagelayer-temp-hide' : '').'"> <label for="pagelayer_condition_id" class="pagelayer-temp-label">'.__('Specific Items').'</label>'; $req_arr['id'] = $condi['id']; $req_arr['filter_type'] = 'post'; if( is_numeric(strpos($condi['sub_template'] , 'author'))){ $req_arr['filter_type'] = 'author'; } if( is_numeric(strpos($condi['sub_template'] , 'category')) || is_numeric(strpos($condi['sub_template'] , 'tag')) ){ $req_arr['filter_type'] = 'taxonomy'; } $title_array = pagelayer_builder_get_title($req_arr['filter_type'], $req_arr['id']); $id = ''; $title = ''; foreach ( $title_array as $tmp_id => $tmp_title ) { $id = $tmp_id; $title = $tmp_title; } echo ' <select name="pagelayer_condition_id[]" class="postbox pagelayer-temp-hide"> <option selected value="'. ((empty($id)) ? '' : $id).'"> '. ((empty($title)) ? __('All') : $title).'</option> </select> <div class="pagelayer-temp-search-holder"> <div class="pagelayer-temp-search-div"> <div class="pagelayer-temp-search-preview"> <span class="pagelayer-temp-search-name"> '. ((empty($title)) ? __('All') : $title).' </span> <span class="pagelayer-temp-close '. ((empty($title)) ? ' pagelayer-temp-hide' : '').'">×</span> </div> <span class="">⯆</span> </div> <div class="pagelayer-temp-search-selector"> <input autocomplete="off" type="text" class="pagelayer-temp-search-val" name="search-icon" placeholder="Search"> <div class="pagelayer-temp-search-list"> </div> </div> </div> </div> </div> </div>'; } } echo ' </div> <div style="margin:15px 10px;"> <span class="pagelayer-temp-add-new" >'. __('Add Conditions').'</span> </div> </div> <div class="pagelayer-temp-submit"> <center><button type="submit" class="pagelayer-temp-submit-btn button button-primary">'.__('Save Template').'</button></center> </div> </div> <script type="text/javascript"> pagelayer_cpt = '.json_encode($pagelayer->builder).'; pagelayer_ajax_url = "'.admin_url( 'admin-ajax.php' ).'?"; pagelayer_builder_nonce = "'.wp_create_nonce('pagelayer_builder').'"; </script>'; ?> <script type="text/javascript"> jQuery(document).ready(function(){ var $ = jQuery; if(typeof pagelayer !== 'undefined'){ var $ = pagelayer.$$ || $; } // The container var pl_temp = $(".pagelayer-temp-container"); var pl_condi = pl_temp.find('.pagelayer-temp-condition-holder'); // Get values from multi-dimensional array by key var pagelayer_multi_array_search = function(array = [], key){ var array_key = []; if (key in array) { array_key = array[key]; } for( var k in array) { if (typeof array[k] === 'object' && key in array[k]) { array_key = array[k][key]; } } return array_key; } // Creates the select options var create_options = function(opt_array){ var options = ''; var tmp_numeric = ''; // Required to handle key 404 in singular templates as json decode puts number first and that spoils our order for (x in opt_array){ // Single item if(typeof opt_array[x] == 'string'){ options += option(x, opt_array[x]); if(tmp_numeric.length > 0){ options += tmp_numeric; tmp_numeric = ''; } // If is array then we get the label string }else if(typeof opt_array[x] == 'object'){ if('label' in opt_array[x]){ if(x == 404){ tmp_numeric = option(x, opt_array[x]['label']); continue; } options += option(x, opt_array[x]['label']); // Groups }else{ options += '<optgroup label="'+x+'">'; options += create_options(opt_array[x]); options += '</optgroup>'; } } } return options; } var option = function(val, lang){ return '<option value="'+val+'">'+lang+'</option>'; } var html_condi = '<div class="pagelayer-temp-condition">'+ '<div class="pagelayer-temp-tab">'+ '<span class="pagelayer-temp-toggle pagelayer-temp-pad5">☰</span>'+ '<span>'+<?php echo "'".__('Display Conditions')."'";?>+'</span>'+ '<span class="pagelayer-close-condition">×</span>'+ '</div>'+ '<div class="pagelayer-temp-condition-div">'+ '<div class="pagelayer-temp-fields">'+ '<label for="pagelayer_condition_type" class="pagelayer-temp-label">'+<?php echo "'".__('Action Type')."'";?>+'</label>'+ '<select name="pagelayer_condition_type[]" class="postbox">'+ create_options(pagelayer_cpt["action"])+ '</select>'+ '</div>'+ ' <div class="pagelayer-temp-fields">'+ '<label for="pagelayer_condition_name" class="pagelayer-temp-label">'+<?php echo "'".__('Display On')."'";?>+'</label>'+ '<select name="pagelayer_condition_name[]" class="postbox">'+ create_options(pagelayer_cpt["dispay_on"])+ '</select>'+ '</div>'+ ' <div class="pagelayer-temp-fields pagelayer-temp-hide">'+ '<label for="pagelayer_condition_sub_template" class="pagelayer-temp-label">'+<?php echo "'".__('Template')."'";?>+'</label>'+ '<select name="pagelayer_condition_sub_template[]" class="postbox">'+ '</select>'+ '</div>'+ ' <div class="pagelayer-temp-fields pagelayer-temp-hide pagelayer-temp-search-sel">'+ '<label for="pagelayer_condition_id" class="pagelayer-temp-label">'+<?php echo "'".__('Specific Items')."'";?>+'</label>'+ '<select name="pagelayer_condition_id[]" class="postbox pagelayer-temp-hide">'+ '<option selected value="">All</option>'+ '</select>'+ '<div class="pagelayer-temp-search-holder">'+ '<div class="pagelayer-temp-search-div">'+ '<div class="pagelayer-temp-search-preview">'+ '<span class="pagelayer-temp-search-name">All</span>'+ '<span class="pagelayer-temp-close pagelayer-temp-hide">×</span>'+ '</div>'+ '<span class="">⯆</span>'+ '</div>'+ '<div class="pagelayer-temp-search-selector">'+ '<input autocomplete="off" type="text" class="pagelayer-temp-search-val" name="search-icon" placeholder="Search">'+ '<div class="pagelayer-temp-search-list">'+ '</div>'+ '</div>'+ '</div>'+ '</div>'+ '</div>'+ '</div>'; // Removes a condition var close_tab = function(){ var condi = pl_temp.find(".pagelayer-temp-condition"); condi.find(".pagelayer-close-condition").click(function(){ jQuery(this).closest(".pagelayer-temp-condition").remove(); }); }; // Toggle a condition content var toggle_tab = function(){ var condi = pl_temp.find(".pagelayer-temp-condition"); condi.find(".pagelayer-temp-tab").unbind("click"); condi.find(".pagelayer-temp-tab").click(function(){ jQuery(this).closest(".pagelayer-temp-condition").find(".pagelayer-temp-condition-div").toggle(); }); }; // Opens the search selector var open_search = function(){ var el = pl_temp.find('.pagelayer-temp-search-div') el.unbind('click'); el.on('click', function(){ jQuery(this).parent().find('.pagelayer-temp-search-selector').slideToggle(); }); }; var pagelayer_set_inter; // A timer // Get closest select box by name in closest "pagelayer-temp-condition" class var pagelayer_get_closest_sel = function(jEle, name){ return jEle.closest(".pagelayer-temp-condition").find("[name='"+name+"']"); } // Handle search of values var search_list = function(){ pl_temp.find('.pagelayer-temp-search-val').on('keyup', function(){ var v = this.value; var iEle = jQuery(this); var template_name, ele_name, template_name_array; //v = v.replace(/\s+/g, '-'); template_name = pagelayer_get_closest_sel(iEle, 'pagelayer_condition_name[]').val(); ele_name = pagelayer_get_closest_sel(iEle, 'pagelayer_condition_sub_template[]').val(); template_name_array = pagelayer_multi_array_search(pagelayer_cpt[template_name+'_templates'], ele_name); data_array = { pagelayer_nonce: pagelayer_builder_nonce, search : v, filter_type : template_name_array['filter_type'] || 'post', object_type : template_name_array['object_type'] || 'post', }; clearTimeout(pagelayer_set_inter); pagelayer_set_inter = setTimeout(function () { v = v.toLowerCase(); jQuery.ajax({ url: pagelayer_ajax_url+'&action=pagelayer_search_ids', type: 'post', data : data_array, success:function(response){ iEle.next().html(response); //console.log(response); } }); //row.find('.pagelayer-temp-search-list').empty().html(span); }, 200); }); // Handle click within the ID selector pl_temp.find('.pagelayer-temp-search-selector').unbind('click'); pl_temp.find('.pagelayer-temp-search-selector').on('click', function(e){ var jEle = jQuery(e.target); var val = jEle.attr('value'); var text = jEle.text(); if(val.length < 1 || text.length < 1){ return false; } // Set the ID in this list var row = jEle.closest('.pagelayer-temp-search-sel'); row.find('[name="pagelayer_condition_id[]"]').html('<option selected value="'+ val +'">'+ text +'</option>'); row.find('.pagelayer-temp-search-preview .pagelayer-temp-search-name').text(text).next().show(); row.find('.pagelayer-temp-search-selector').slideUp(); return false; }); pl_temp.find('.pagelayer-temp-close').click(function(e){ e.stopPropagation(); var sHold = jQuery(this).closest('.pagelayer-temp-search-sel'); sHold.find('[name="pagelayer_condition_id[]"]').html('<option selected value="">All</option>'); sHold.find('.pagelayer-temp-search-preview .pagelayer-temp-search-name').text('All').next().hide(); }); }; // Whenever a condition is to be initialized var reinit_conditions = function(){ close_tab(); toggle_tab(); open_search(); search_list(); pl_temp.find('select').unbind('change'); pl_temp.find('select').on('change', function(event, triggerEle){ var sEle = jQuery(this); var sVal = sEle.val(); var condiEle = triggerEle || pl_condi; //console.log(sVal); // Hide search box if any select is changed var temp_search = jQuery('.pagelayer-temp-search-selector'); if(temp_search.is(':visible') || jQuery('.pagelayer-temp-search-preview > .pagelayer-temp-close').is(':visible')){ temp_search.hide(); temp_search.find('.pagelayer-temp-search-list').empty(); temp_search.find('.pagelayer-temp-search-val').val(''); } switch(sEle.attr('name')){ case 'pagelayer_template_type': var no_condition = pagelayer_cpt["type"][sVal]['no_condition'] || false; if( no_condition ){ pl_condi.hide(); }else if(!pl_condi.is(':visible')){ pl_condi.show(); } condiEle.find("[name='pagelayer_condition_name[]']").each(function(){ var condi_name = jQuery(this); var need_selection = pagelayer_multi_array_search(pagelayer_cpt["type"], sVal); if(typeof need_selection === 'object' && 'need_selection' in need_selection){ if(need_selection['need_selection'] != condi_name.val() ){ condi_name.val(need_selection['need_selection']).trigger('change'); } condi_name.css('pointer-events', 'none'); }else if(condi_name.css('pointer-events') == 'none'){ condi_name.css('pointer-events', 'all'); } }); break; case 'pagelayer_condition_type[]': //console.log(sEle.val()); break; case 'pagelayer_condition_name[]': var ele_name = pagelayer_get_closest_sel(sEle, 'pagelayer_condition_sub_template[]'); //console.log(sEle.val()); if(sVal.length == 0){ ele_name.closest(".pagelayer-temp-fields").addClass('pagelayer-temp-hide'); }else{ if(pagelayer_cpt[sVal+"_templates"]){ ele_name.html(create_options(pagelayer_cpt[sVal+"_templates"])); ele_name.closest(".pagelayer-temp-fields").removeClass('pagelayer-temp-hide'); } } ele_name.trigger('change'); break; case 'pagelayer_condition_sub_template[]': // Get selected template name var template_name = pagelayer_get_closest_sel(sEle, 'pagelayer_condition_name[]').val(); var ele_name = pagelayer_get_closest_sel(sEle, 'pagelayer_condition_id[]'); var template_name_array = pagelayer_multi_array_search(pagelayer_cpt[template_name+'_templates'], sVal); if(sVal.length == 0 || template_name_array['no_id_section'] || !sEle.is(':visible')){ ele_name.closest(".pagelayer-temp-fields").addClass('pagelayer-temp-hide'); }else{ ele_name.closest(".pagelayer-temp-fields").removeClass('pagelayer-temp-hide'); } ele_name.closest(".pagelayer-temp-fields").find('.pagelayer-temp-close').click(); break; case 'pagelayer_condition_id[]': //console.log(sEle.val()); break; } }); } reinit_conditions(); <?php if(!empty($_post['id'])){ $sub_template_sel = "'pagelayer_condition_sub_template[]'"; echo ' //reinit_conditions(); pl_condi.show(); pl_temp.find("select[name=pagelayer_template_type]").trigger("change"); pl_temp.find("select[name='.$sub_template_sel.']").trigger("change"); pl_temp.find("select[name=pagelayer_template_type]").prop("disabled", true); //pl_condi.find("select").trigger("change")'; } ?> // On click add more condition pl_temp.find(".pagelayer-temp-add-new").click(function(){ pl_condi.show(); var hEle = jQuery(html_condi); pl_temp.find('.pagelayer-temp-condition-container').append(hEle); reinit_conditions(); pl_temp.find('select[name="pagelayer_template_type"]').trigger('change', [hEle]); }); // Save the template pl_temp.find(".pagelayer-temp-submit-btn").click(function(e){ e.preventDefault(); var data = pl_temp.find('input, select, textarea').serialize(); //alert(data); jQuery.ajax({ url: pagelayer_ajax_url+'&action=pagelayer_save_template&postID='+ <?php echo "'".$_post['id']."'";?>, type: 'post', data : 'pagelayer_nonce='+ pagelayer_builder_nonce +'&'+ data, success: function(response, status, xhr){ var obj = jQuery.parseJSON(response); //alert(obj); if(obj['error']){ alert(obj['error']); }else{ alert(obj['success']); var hasPost = new window.URLSearchParams(window.location.search).has('post'); if(!hasPost){ window.location.replace(window.location+'&post='+obj['id']); } } }, error: function(errorThrown){ alert(errorThrown); console.log(errorThrown); } }); }); }); </script> <?php } // Get Title from ID function pagelayer_builder_get_title($type, $ids = array()){ $ids = (array) $ids; $sel_title = []; switch ( $type ) { case 'taxonomy': $terms = get_terms([ 'include' => $ids, 'hide_empty' => false, ]); global $wp_taxonomies; foreach ( $terms as $term ) { $sel_title[ $term->term_taxonomy_id ] = $term->name ; } break; case 'post': $query = new \WP_Query([ 'post_type' => 'any', 'post__in' => $ids, 'posts_per_page' => -1, 'post_status' => 'any', ]); foreach ( $query->posts as $post ) { $sel_title[ $post->ID ] = $post->post_title; } break; case 'author': $query_params = [ 'capability' => array( 'edit_posts' ), 'fields' => ['ID', 'display_name'], 'include' => $ids, ]; // Capability queries were only introduced in WP 5.9. if( version_compare( $GLOBALS['wp_version'], '5.9-alpha', '<' ) ){ $args['who'] = 'authors'; unset( $args['capability'] ); } $user_query = new \WP_User_Query( $query_params ); foreach ( $user_query->get_results() as $author ) { $sel_title[ $author->ID ] = $author->display_name; } break; } return $sel_title; } // Append the Popup templates function pagelayer_builder_popup_append(){ global $pagelayer; if(!empty($GLOBALS['pagelayer_builder_popup_append_called'])){ return; } $GLOBALS['pagelayer_builder_popup_append_called'] = 1; // Render the multiple Popups foreach($pagelayer->template_popup_ids as $id => $priority){ $bLoadString = ''; $content = pagelayer_get_post_content($id); // For popup before loading option // First check that att is placed or not. Then scan and extract the value of id and insert it into bLoadString variable if(strpos($content, 'data-trig_before_load') !== false){ preg_match('#pagelayer-id=([^\s]+)#', $content, $matches); $bLoadString = 'pagelayer-popup-Shown="1" style="display: flex;" pagelayer-popup-id="'.$matches[1].'"'; } echo '<div class="pagelayer-popup-modal" '.$bLoadString.'> <div class="pagelayer-popup-modal-content"> <div class="pagelayer-popup-content"> '.$content.' </div> </div> </div>'; } } // Export Pages, Media and Pagelayer Template Files function pagelayer_builder_export($type){ global $pagelayer; // Load the templates pagelayer_builder_load_templates(); $data['page'] = []; // Load the other posts foreach($pagelayer->settings['post_types'] as $type){ // Make the query $type_query = new WP_Query(['post_type' => $type, 'status' => 'publish', 'posts_per_page' => -1, 'orderby' => 'name', 'order' => 'ASC']); $data[$type] = $type_query->posts; } $nonce = wp_create_nonce('pagelayer_builder'); echo '<h1>Pagelayer - Export Template into a Theme</h1> <span style="font-size:12px">With this wizard you can export Pagelayer Template(s) (and pages) into a theme folder. This theme folder can be distributed as a theme and can be used by any Pagelayer user.</span>'; // Make two tables echo ' <script> pagelayer_ajax_url = "'.admin_url( 'admin-ajax.php' ).'?"; function pagelayer_checkbox(ele, cl){ var jEle = jQuery(ele); jQuery(cl).prop("checked", jEle.prop("checked")); } function pagelayer_export_template(){ var data = jQuery("#pagelayer_export_template_form").serialize(); //console.log(data); jQuery.ajax({ dataType: "json", url: pagelayer_ajax_url+"&action=pagelayer_export_template", type: "post", data: data, success:function(response){ if("success" in response){ alert(response["success"]); } if("error" in response){ alert(response["error"]); } } }); return false; } </script> <form id="pagelayer_export_template_form"> <input type="hidden" name="pagelayer_nonce" value="'.$nonce.'"> <div style="display:flex; flex-wrap: wrap; width:100%;"> <div style="width:50%; padding: 10px;"> <h2>Pagelayer Templates</h2> <table cellspacing="0" cellpadding="8" border="0" width="100%" class="wp-list-table widefat fixed striped"> <tr> <td width="10"><input type="checkbox" onclick="pagelayer_checkbox(this, \'.pagelayer_temp_cb\');"></td> <td>Title</td> <td>Type</td> <td>Display On</td> </tr>'; foreach($pagelayer->templates as $k => $v){ $type = get_post_meta($v->ID, 'pagelayer_template_type', true); $dis_conditions = get_post_meta( $v->ID, 'pagelayer_template_conditions', true ); $dis_html = 'None'; if( !empty($dis_conditions) ){ $dis_html = ''; foreach($dis_conditions as $condi){ $dis_html .= '<span>'; if(isset($condi['template'])){ $template = pagelayer_multi_array_search($pagelayer->builder['dispay_on'], $condi['template']); if(is_array($template) && array_key_exists('label', $template)){ $template = $template['label']; } $dis_html .= $template; } if(isset($condi['sub_template'])){ $sub_template = pagelayer_multi_array_search($pagelayer->builder[$condi['template'].'_templates'], $condi['sub_template']); if(is_array($sub_template) && array_key_exists('label', $sub_template)){ $sub_template = $sub_template['label']; } if(!empty($sub_template)){ $dis_html .= ' > '. $sub_template; } } if(!empty($condi['id'])){ $dis_html .= ' > #'. $condi['id']; } $dis_html .= '</span></br>'; } } //print_r($v); echo ' <tr> <td><input type="checkbox" class="pagelayer_temp_cb" name="templates['.$v->ID.']"></td> <td>'.$v->post_title.'</td> <td>'.(!empty($pagelayer->builder['type'][$type]['label']) ? $pagelayer->builder['type'][$type]['label'] : $pagelayer->builder['type'][$type]).'</td> <td>'.$dis_html.'</td> </tr>'; } echo ' </table> </div>'; $pt_objects = get_post_types(['public' => true], 'objects'); foreach($data as $type => $d){ if(empty($pt_objects[$type])){ continue; } echo ' <div style="width:22%; padding: 10px;"> <h2>'.$pt_objects[$type]->labels->name.'</h2> <table cellspacing="0" cellpadding="8" border="0" width="100%" class="wp-list-table widefat fixed striped"> <tr> <td width="10"><input type="checkbox" onclick="pagelayer_checkbox(this, \'.pagelayer_'.$type.'_cb\');"></td> <td>Title</td> <td width="80">Type</td> </tr>'; foreach($data[$type] as $k => $v){ //$type = get_post_meta($v->ID, 'pagelayer_template_type', true); //print_r($v); echo ' <tr> <td><input type="checkbox" class="pagelayer_'.$type.'_cb" name="'.$type.'['.$v->ID.']"></td> <td>'.$v->post_title.'</td> <td>'.$pt_objects[$type]->labels->name.'</td> </tr>'; } echo ' </table> </div>'; } echo ' </div> <div class="pagelayer-temp-submit"> <center> <button onclick="return pagelayer_export_template()" class="pagelayer-temp-submit-btn button button-primary">'.__('Export Template Files').'</button> </center> </div> </form>'; }