PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/plugins/siteorigin-panels/inc/admin-actions.php

https://gitlab.com/mostafame/team_website
PHP | 267 lines | 182 code | 52 blank | 33 comment | 49 complexity | 512a2345875372a533c723fc2457e9a9 MD5 | raw file
  1. <?php
  2. define('SITEORIGIN_PANELS_LAYOUT_URL', 'http://layouts.siteorigin.com/');
  3. /**
  4. * Get builder content based on the submitted panels_data.
  5. */
  6. function siteorigin_panels_ajax_builder_content(){
  7. header('content-type: text/html');
  8. if( !current_user_can('edit_post', $_POST['post_id'] ) ) wp_die();
  9. if( empty( $_POST['post_id'] ) || empty( $_POST['panels_data'] ) ) {
  10. echo '';
  11. wp_die();
  12. }
  13. // echo the content
  14. $panels_data = json_decode( wp_unslash( $_POST['panels_data'] ), true);
  15. $panels_data['widgets'] = siteorigin_panels_process_raw_widgets($panels_data['widgets']);
  16. $panels_data = siteorigin_panels_styles_sanitize_all( $panels_data );
  17. echo siteorigin_panels_render( intval($_POST['post_id']), false, $panels_data );
  18. wp_die();
  19. }
  20. add_action('wp_ajax_so_panels_builder_content', 'siteorigin_panels_ajax_builder_content');
  21. /**
  22. * Display a widget form with the provided data
  23. */
  24. function siteorigin_panels_ajax_widget_form(){
  25. if( empty( $_REQUEST['widget'] ) ) wp_die();
  26. if( empty( $_REQUEST['_panelsnonce'] ) || !wp_verify_nonce($_REQUEST['_panelsnonce'], 'panels_action') ) wp_die();
  27. $request = array_map('stripslashes_deep', $_REQUEST);
  28. $widget = $request['widget'];
  29. $instance = !empty($request['instance']) ? json_decode( $request['instance'], true ) : array();
  30. $form = siteorigin_panels_render_form( $widget, $instance, $_REQUEST['raw'] == 'true' );
  31. $form = apply_filters('siteorigin_panels_ajax_widget_form', $form, $widget, $instance);
  32. echo $form;
  33. wp_die();
  34. }
  35. add_action('wp_ajax_so_panels_widget_form', 'siteorigin_panels_ajax_widget_form');
  36. function siteorigin_panels_ajax_get_prebuilt_layouts(){
  37. if( empty( $_REQUEST['_panelsnonce'] ) || !wp_verify_nonce($_REQUEST['_panelsnonce'], 'panels_action') ) wp_die();
  38. // Get any layouts that the current user could edit.
  39. header('content-type: application/json');
  40. $type = !empty( $_REQUEST['type'] ) ? $_REQUEST['type'] : 'directory';
  41. $search = !empty($_REQUEST['search']) ? trim( strtolower( $_REQUEST['search'] ) ) : '';
  42. $page = !empty( $_REQUEST['page'] ) ? intval( $_REQUEST['page'] ) : 1;
  43. $return = array(
  44. 'title' => '',
  45. 'items' => array()
  46. );
  47. if( $type == 'prebuilt' ) {
  48. $return['title'] = __( 'Theme Defined Layouts', 'siteorigin-panels' );
  49. // This is for theme bundled prebuilt directories
  50. $layouts = apply_filters( 'siteorigin_panels_prebuilt_layouts', array() );
  51. foreach($layouts as $id => $vals) {
  52. if( !empty($search) && strpos( strtolower($vals['name']), $search ) === false ) {
  53. continue;
  54. }
  55. $return['items'][] = array(
  56. 'title' => $vals['name'],
  57. 'id' => $id,
  58. 'type' => 'prebuilt',
  59. 'description' => isset($vals['description']) ? $vals['description'] : '',
  60. 'screenshot' => !empty($vals['screenshot']) ? $vals['screenshot'] : ''
  61. );
  62. }
  63. $return['max_num_pages'] = 1;
  64. }
  65. elseif( $type == 'directory' ) {
  66. $return['title'] = __( 'Layouts Directory', 'siteorigin-panels' );
  67. // This is a query of the prebuilt layout directory
  68. $query = array();
  69. if( !empty($search) ) $query['search'] = $search;
  70. $query['page'] = $page;
  71. $url = add_query_arg( $query, SITEORIGIN_PANELS_LAYOUT_URL . '/wp-admin/admin-ajax.php?action=query_layouts');
  72. $response = wp_remote_get( $url );
  73. if( is_array($response) && $response['response']['code'] == 200 ) {
  74. $results = json_decode( $response['body'], true );
  75. if ( !empty( $results ) && !empty($results['items']) ) {
  76. foreach( $results['items'] as $item ) {
  77. $item['id'] = $item['slug'];
  78. $item['screenshot'] = 'http://s.wordpress.com/mshots/v1/' . urlencode( $item['preview'] ) . '?w=400';
  79. $item['type'] = 'directory';
  80. $return['items'][] = $item;
  81. }
  82. }
  83. $return['max_num_pages'] = $results['max_num_pages'];
  84. }
  85. }
  86. elseif ( strpos( $type, 'clone_' ) !== false ) {
  87. // Check that the user can view the given page types
  88. $post_type = str_replace('clone_', '', $type );
  89. $return['title'] = sprintf( __( 'Clone %s', 'siteorigin-panels' ), esc_html( ucfirst( $post_type ) ) );
  90. global $wpdb;
  91. $user_can_read_private = ( $post_type == 'post' && current_user_can( 'read_private_posts' ) || ( $post_type == 'page' && current_user_can( 'read_private_pages' ) ));
  92. $include_private = $user_can_read_private ? "OR posts.post_status = 'private' " : "";
  93. // Select only the posts with the given post type that also have panels_data
  94. $results = $wpdb->get_results( "
  95. SELECT SQL_CALC_FOUND_ROWS DISTINCT ID, post_title, meta.meta_value
  96. FROM {$wpdb->posts} AS posts
  97. JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id
  98. WHERE
  99. posts.post_type = '" . esc_sql( $post_type ) . "'
  100. AND meta.meta_key = 'panels_data'
  101. " . ( !empty($search) ? 'AND posts.post_title LIKE "%' . esc_sql( $search ) . '%"' : '' ) . "
  102. AND ( posts.post_status = 'publish' OR posts.post_status = 'draft' " . $include_private . ")
  103. ORDER BY post_date DESC
  104. LIMIT 16 OFFSET " . intval( ( $page - 1 ) * 16 ) );
  105. $total_posts = $wpdb->get_var( "SELECT FOUND_ROWS();" );
  106. foreach( $results as $result ) {
  107. $thumbnail = get_the_post_thumbnail_url( $result->ID, array( 400,300 ) );
  108. $return['items'][] = array(
  109. 'id' => $result->ID,
  110. 'title' => $result->post_title,
  111. 'type' => $type,
  112. 'screenshot' => !empty($thumbnail) ? $thumbnail : ''
  113. );
  114. }
  115. $return['max_num_pages'] = ceil( $total_posts / 16 );
  116. }
  117. else {
  118. // An invalid type. Display an error message.
  119. }
  120. // Add the search part to the title
  121. if( !empty($search) ) {
  122. $return['title'] .= __(' - Results For:', 'siteorigin-panels') . ' <em>' . esc_html( $search ) . '</em>';
  123. }
  124. echo json_encode( $return );
  125. wp_die();
  126. }
  127. add_action('wp_ajax_so_panels_layouts_query', 'siteorigin_panels_ajax_get_prebuilt_layouts');
  128. /**
  129. * Ajax handler to get an individual prebuilt layout
  130. */
  131. function siteorigin_panels_ajax_get_prebuilt_layout(){
  132. if( empty( $_REQUEST['type'] ) ) wp_die();
  133. if( empty( $_REQUEST['lid'] ) ) wp_die();
  134. if( empty( $_REQUEST['_panelsnonce'] ) || !wp_verify_nonce($_REQUEST['_panelsnonce'], 'panels_action') ) wp_die();
  135. header('content-type: application/json');
  136. if( $_REQUEST['type'] == 'prebuilt' ) {
  137. $layouts = apply_filters( 'siteorigin_panels_prebuilt_layouts', array() );
  138. if( empty( $layouts[ $_REQUEST['lid'] ] ) ) {
  139. // Display an error message
  140. wp_die();
  141. }
  142. $layout = $layouts[ $_REQUEST['lid'] ];
  143. if( isset($layout['name']) ) unset($layout['name']);
  144. $layout = apply_filters('siteorigin_panels_prebuilt_layout', $layout);
  145. $layout = apply_filters('siteorigin_panels_data', $layout);
  146. echo json_encode( $layout );
  147. wp_die();
  148. }
  149. if( $_REQUEST['type'] == 'directory' ) {
  150. $response = wp_remote_get(
  151. SITEORIGIN_PANELS_LAYOUT_URL . '/layout/' . urlencode($_REQUEST['lid']) . '/?action=download'
  152. );
  153. // var_dump($response['body']);
  154. if( $response['response']['code'] == 200 ) {
  155. // For now, we'll just pretend to load this
  156. echo $response['body'];
  157. wp_die();
  158. }
  159. else {
  160. // Display some sort of error message
  161. }
  162. }
  163. elseif( current_user_can('edit_post', $_REQUEST['lid']) ) {
  164. $panels_data = get_post_meta( $_REQUEST['lid'], 'panels_data', true );
  165. $panels_data = apply_filters('siteorigin_panels_data', $panels_data);
  166. echo json_encode( $panels_data );
  167. wp_die();
  168. }
  169. }
  170. add_action('wp_ajax_so_panels_get_layout', 'siteorigin_panels_ajax_get_prebuilt_layout');
  171. /**
  172. * Ajax handler to import a layout
  173. */
  174. function siteorigin_panels_ajax_import_layout(){
  175. if( empty( $_REQUEST['_panelsnonce'] ) || !wp_verify_nonce($_REQUEST['_panelsnonce'], 'panels_action') ) wp_die();
  176. if( !empty($_FILES['panels_import_data']['tmp_name']) ) {
  177. header('content-type:application/json');
  178. $json = file_get_contents( $_FILES['panels_import_data']['tmp_name'] );
  179. @unlink( $_FILES['panels_import_data']['tmp_name'] );
  180. echo $json;
  181. }
  182. wp_die();
  183. }
  184. add_action('wp_ajax_so_panels_import_layout', 'siteorigin_panels_ajax_import_layout');
  185. /**
  186. * Ajax handler to export a layout
  187. */
  188. function siteorigin_panels_ajax_export_layout(){
  189. if( empty( $_REQUEST['_panelsnonce'] ) || !wp_verify_nonce($_REQUEST['_panelsnonce'], 'panels_action') ) wp_die();
  190. header('content-type: application/json');
  191. header('Content-Disposition: attachment; filename=layout-' . date('dmY') . '.json');
  192. $export_data = wp_unslash( $_POST['panels_export_data'] );
  193. echo $export_data;
  194. wp_die();
  195. }
  196. add_action('wp_ajax_so_panels_export_layout', 'siteorigin_panels_ajax_export_layout');
  197. /**
  198. * We want users to be informed of what the layout directory is, so they need to enable it.
  199. */
  200. function siteorigin_panels_ajax_directory_enable(){
  201. if( empty( $_REQUEST['_panelsnonce'] ) || !wp_verify_nonce($_REQUEST['_panelsnonce'], 'panels_action') ) wp_die();
  202. $user = get_current_user_id();
  203. update_user_meta( $user, 'so_panels_directory_enabled', true );
  204. wp_die();
  205. }
  206. add_action('wp_ajax_so_panels_directory_enable', 'siteorigin_panels_ajax_directory_enable');
  207. /**
  208. * Preview in the live editor when there is no public view of the item
  209. */
  210. function siteorigin_panels_live_editor_preview(){
  211. if( empty( $_REQUEST['_panelsnonce'] ) || !wp_verify_nonce($_REQUEST['_panelsnonce'], 'live-editor-preview') ) wp_die();
  212. include plugin_dir_path( __FILE__ ) . '../tpl/live-editor-preview.php';
  213. exit();
  214. }
  215. add_action('wp_ajax_so_panels_live_editor_preview', 'siteorigin_panels_live_editor_preview');