PageRenderTime 55ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/themes/jupiter/framework/admin/theme-options/class-theme-options.php

https://bitbucket.org/awylie199/s5t
PHP | 399 lines | 313 code | 74 blank | 12 comment | 23 complexity | 3306998a980ff82abb92fcaf9987a61a MD5 | raw file
Possible License(s): LGPL-2.1, MPL-2.0-no-copyleft-exception, Apache-2.0, LGPL-3.0, MIT, BSD-3-Clause
  1. <?php
  2. class MK_Theme_Options {
  3. public function __construct() {
  4. $this->add_hooks();
  5. }
  6. public function add_hooks() {
  7. add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
  8. add_action( 'admin_menu', array( $this, 'register_submenu_page' ) );
  9. add_action( 'init', array( $this, 'set_defaults' ) );
  10. add_action( 'init', array( $this, 'set_missing_defaults' ) );
  11. // Causes conflicts for background selector angle icons.
  12. remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
  13. remove_action( 'wp_print_styles', 'print_emoji_styles' );
  14. remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
  15. remove_action( 'admin_print_styles', 'print_emoji_styles' );
  16. }
  17. function register_submenu_page() {
  18. add_submenu_page(
  19. THEME_NAME,
  20. __( 'Theme Options', 'mk_framework' ),
  21. __( 'Theme Options', 'mk_framework' ),
  22. 'edit_theme_options',
  23. 'theme_options',
  24. array( $this, 'render' )
  25. );
  26. }
  27. public function enqueue( $hook ) {
  28. if ( $hook != 'jupiter_page_theme_options' ) {
  29. return;
  30. }
  31. $theme_version = get_option( 'mk_jupiter_theme_current_version' );
  32. wp_enqueue_style(
  33. 'mk-vfg-css',
  34. THEME_DIR_URI . '/framework/admin/theme-options/css/vfg-core.css',
  35. array(),
  36. $theme_version
  37. );
  38. wp_enqueue_style(
  39. 'mk-flexbox-css',
  40. THEME_DIR_URI . '/framework/admin/theme-options/css/flexbox.css',
  41. array(),
  42. $theme_version
  43. );
  44. wp_enqueue_style(
  45. 'mk-alpha-color-picker',
  46. THEME_DIR_URI . '/framework/admin/theme-options/css/alpha-color-picker.css',
  47. array( 'wp-color-picker' ),
  48. $theme_version
  49. );
  50. wp_enqueue_style(
  51. 'mk-components-css',
  52. THEME_DIR_URI . '/framework/admin/theme-options/css/components.css',
  53. array(),
  54. $theme_version
  55. );
  56. wp_enqueue_script(
  57. 'mk-vue-js',
  58. THEME_DIR_URI . '/framework/admin/theme-options/js/vue.min.js',
  59. array(),
  60. $theme_version,
  61. true
  62. );
  63. wp_enqueue_script(
  64. 'mk-vue-ls-js',
  65. THEME_DIR_URI . '/framework/admin/theme-options/js/vue-ls.js',
  66. array(),
  67. $theme_version
  68. );
  69. wp_enqueue_script(
  70. 'mk-vfg-js',
  71. THEME_DIR_URI . '/framework/admin/theme-options/js/vfg-core.js',
  72. array(),
  73. $theme_version,
  74. true
  75. );
  76. wp_enqueue_script(
  77. 'mk-webfontloader',
  78. THEME_DIR_URI . '/assets/js/plugins/wp-enqueue/webfontloader.js',
  79. array(),
  80. $theme_version,
  81. true
  82. );
  83. wp_enqueue_script(
  84. 'mk-alpha-color-picker',
  85. THEME_DIR_URI . '/framework/admin/theme-options/js/alpha-color-picker.js',
  86. array( 'jquery', 'wp-color-picker' ),
  87. $theme_version,
  88. true
  89. );
  90. wp_enqueue_script(
  91. 'mk-components-js',
  92. THEME_DIR_URI . '/framework/admin/theme-options/js/components.js',
  93. array( 'mk-alpha-color-picker', 'jquery-ui-position' ),
  94. $theme_version,
  95. true
  96. );
  97. wp_enqueue_script(
  98. 'mk-theme-options-js',
  99. THEME_DIR_URI . '/framework/admin/theme-options/js/theme-options.js',
  100. array(),
  101. $theme_version,
  102. true
  103. );
  104. wp_localize_script( 'mk-theme-options-js', 'mk_data', $this->data() );
  105. }
  106. public function data() {
  107. $options = require_once THEME_ADMIN . '/theme-options/masterkey.php';
  108. return $options;
  109. }
  110. // We need to improve this to exclude some of the uncesasary post types
  111. public static function get_post_types() {
  112. $post_type = get_post_types();
  113. unset(
  114. $post_type['post'],
  115. $post_type['page'],
  116. $post_type['attachment'],
  117. $post_type['nav_menu_item'],
  118. $post_type['revision'],
  119. $post_type['clients'],
  120. $post_type['animated-columns'],
  121. $post_type['edge'],
  122. $post_type['portfolio'],
  123. $post_type['shop_order'],
  124. $post_type['shop_order_refund'],
  125. $post_type['shop_coupon'],
  126. $post_type['shop_webhook'],
  127. $post_type['banner_builder'],
  128. $post_type['banner_builder']
  129. );
  130. return $post_type;
  131. }
  132. /**
  133. * Get list of google fonts.
  134. *
  135. * @since 5.9.6
  136. * @return array
  137. */
  138. public static function get_google_fonts() {
  139. $google_fonts = include THEME_ADMIN . '/theme-options/google-fonts.php';
  140. return $google_fonts;
  141. }
  142. public function set_defaults( $check = false ) {
  143. $GLOBALS['mk_options'] = get_option( THEME_OPTIONS );
  144. if ( ( empty( $GLOBALS['mk_options'] ) || sizeof( $GLOBALS['mk_options'] ) < 2 || $check ) && ! is_admin() ) {
  145. $options = array();
  146. $data = $this->data();
  147. if ( empty( $data['schema'] ) ) {
  148. return;
  149. }
  150. // Run only for once for each installation regardless of updating occurrence.
  151. if ( empty( $GLOBALS['mk_options']['fonts'] ) ) {
  152. $this->migrate_typography_options();
  153. $this->migrate_typography_options_2();
  154. $this->migrate_typography_options_3();
  155. }
  156. foreach ( $data['schema'] as $tab ) {
  157. foreach ( $tab['sections'] as $section ) {
  158. foreach ( $section['fields'] as $field ) {
  159. if ( empty( $field['model'] ) || is_array( $field['model'] ) ) {
  160. continue;
  161. }
  162. if ( empty( $field['default'] ) ) {
  163. $field['default'] = '';
  164. }
  165. $options[ $field['model'] ] = $field['default'];
  166. }
  167. }
  168. }
  169. $GLOBALS['mk_options'] = array_merge( (array) $options, (array) $GLOBALS['mk_options'] );
  170. update_option( THEME_OPTIONS, $GLOBALS['mk_options'] );
  171. update_option( THEME_OPTIONS_BUILD, uniqid() );
  172. mk_purge_cache_actions();
  173. }// End if().
  174. }
  175. public function set_missing_defaults() {
  176. /*
  177. * It should not run in admin since the `set_defaults` method does nothing in admin pages.
  178. */
  179. if ( is_admin() ) {
  180. return;
  181. }
  182. $current_version = get_option( 'jupiter_theme_version' );
  183. $imported_options = get_option( THEME_OPTIONS . '_imported' );
  184. $theme_data = wp_get_theme( get_option( 'template' ) );
  185. $latest_version = $theme_data->Version;
  186. if ( $latest_version != $current_version || $imported_options == 'true' ) {
  187. $this->set_defaults( true );
  188. update_option( 'jupiter_theme_version', $latest_version );
  189. update_option( THEME_OPTIONS . '_imported', 'false' );
  190. update_option( THEME_OPTIONS_BUILD, uniqid() );
  191. mk_purge_cache_actions();
  192. flush_rewrite_rules();
  193. }
  194. }
  195. private function migrate_typography_options() {
  196. $GLOBALS['mk_options']['fonts'] = array();
  197. $GLOBALS['mk_options']['fonts'][] = array(
  198. 'type' => 'all',
  199. 'fontFamily' => ! empty( $GLOBALS['mk_options']['font_family'] ) ? $GLOBALS['mk_options']['font_family'] : '',
  200. 'elements' => array( 'body' ),
  201. 'subset' => '',
  202. 'currentField' => 'font-alert',
  203. 'default' => 'true',
  204. );
  205. }
  206. private function migrate_typography_options_2() {
  207. foreach ( array( 1, 2 ) as $number ) {
  208. if ( ! empty( $GLOBALS['mk_options'][ 'special_fonts_list_' . $number ] ) || ! empty( $GLOBALS['mk_options'][ 'special_elements_' . $number ] ) ) {
  209. $GLOBALS['mk_options']['fonts'][] = array(
  210. 'type' => ! empty( $GLOBALS['mk_options'][ 'special_fonts_type_' . $number ] ) ? $GLOBALS['mk_options'][ 'special_fonts_type_' . $number ] : 'all',
  211. 'fontFamily' => str_replace( '+', ' ', $GLOBALS['mk_options'][ 'special_fonts_list_' . $number ] ),
  212. 'elements' => ! empty( $GLOBALS['mk_options'][ 'special_elements_' . $number ] ) ? $GLOBALS['mk_options'][ 'special_elements_' . $number ] : array(),
  213. 'subset' => ! empty( $GLOBALS['mk_options'][ 'google_font_subset_' . $number ] ) ? $GLOBALS['mk_options'][ 'google_font_subset_' . $number ] : '',
  214. 'currentField' => 'font-select-elements',
  215. );
  216. }
  217. }
  218. }
  219. private function migrate_typography_options_3() {
  220. foreach ( array( 1, 2 ) as $number ) {
  221. if ( ! empty( $GLOBALS['mk_options'][ 'typekit_font_family_' . $number ] ) || ! empty( $GLOBALS['mk_options'][ 'typekit_elements_' . $number ] ) ) {
  222. $GLOBALS['mk_options']['fonts'][] = array(
  223. 'type' => 'typekit',
  224. 'fontFamily' => ! empty( $GLOBALS['mk_options'][ 'typekit_font_family_' . $number ] ) ? $GLOBALS['mk_options'][ 'typekit_font_family_' . $number ] : '',
  225. 'elements' => ! empty( $GLOBALS['mk_options'][ 'typekit_elements_' . $number ] ) ? $GLOBALS['mk_options'][ 'typekit_elements_' . $number ] : array(),
  226. 'subset' => '',
  227. 'currentField' => 'font-select-elements',
  228. );
  229. }
  230. }
  231. }
  232. public function render() {
  233. wp_enqueue_media();
  234. ?>
  235. <div id="mk-theme-options" class="mka-to-wrap">
  236. <div class="mka-to-header-wrap">
  237. <div class="mka-to-header mka-clearfix">
  238. <div class="mka-to-header-logo"></div>
  239. <div class="mka-to-header-actions">
  240. <div class="mka-wrap mka-button-wrap">
  241. <span class="mka-save-response"></span>
  242. <a href="#" class="mka-button mka-button--green mka-button--medium mka-button--relative mka-to-save-button" data-nonce="<?php echo wp_create_nonce( 'mk-ajax-theme-options' ); ?>" @click="save">
  243. <span class="mka-button-icon">
  244. <span class="mka-button-icon-spinner">
  245. <svg class="mka-spinner" viewBox="0 0 66 66" xmlns="http://www.w3.org/2000/svg">
  246. <circle class="mka-spinner-path" fill="none" stroke-width="7" stroke-linecap="round" cx="33" cy="33" r="30"></circle>
  247. </svg>
  248. </span>
  249. <span class="mka-button-icon-success"></span>
  250. </span>
  251. Save Settings
  252. </a>
  253. </div>
  254. </div>
  255. </div>
  256. </div>
  257. <div class="mka-to-body mka-clearfix">
  258. <div class="mka-to-sidebar">
  259. <ul class="mka-to-nav">
  260. <template v-for="( menu, menuKey ) in menu">
  261. <li :data-id="menuKey" :class="[ 'mka-to-nav-item', { 'mka-to-nav-item--active': activeMenu == menuKey } ]" >
  262. <a :href="'#'+menuKey" @click="setActiveTab(menu.default)">
  263. <span :class="['mka-to-nav-item-icon', 'mka-to-nav-item-icon--' + menuKey]"></span>
  264. <span class="mka-to-nav-label" v-html="menu.label"></span>
  265. </a>
  266. <div class="mka-to-nav-sub" v-show="_.size(menu.submenu) > 1">
  267. <ul class="mka-to-nav-subnav">
  268. <li :class="[ 'mka-to-nav-subitem', { 'mka-to-nav-subitem--active': activeSubmenu == submenuKey } ]" v-for="( submenu, submenuKey ) in menu.submenu">
  269. <a :href="'#'+submenuKey" @click="setActiveTab( submenuKey )">{{ submenu }}</a>
  270. </li>
  271. </ul>
  272. </div>
  273. </li>
  274. </template>
  275. </ul>
  276. <div class="mka-to-sidebar-actions">
  277. <div class="mka-wrap">
  278. <button type="button" class="mka-button mka-button--steelblue mka-button--medium mka-to-sidebar-history">
  279. <span class="mka-to-nav-item-icon-float">
  280. <span class="mka-to-nav-item-icon mka-to-nav-item-icon--history"></span>
  281. </span>
  282. History
  283. </button>
  284. <button type="button" class="mka-button mka-button--darksteelblue mka-button--medium mka-to-sidebar-restore">
  285. Restore Defaults
  286. </button>
  287. </div>
  288. </div>
  289. </div>
  290. <div class="mka-to-main" :class="getClasses( tab )" v-for="( tab, tabKey ) in schema" v-if="activeTab == tabKey" :data-tab="tabKey">
  291. <p class="mka-to-page-title" v-show="tab.label">
  292. <span v-html="tab.label"></span>
  293. <span class="mka-wrap mka-tip-wrap" v-show="tab.help">
  294. <a href="#" class="mka-tip">
  295. <span class="mka-tip-icon">
  296. <span class="mka-tip-arrow"></span>
  297. </span>
  298. <span class="mka-tip-ripple"></span>
  299. </a>
  300. <span class="mka-tip-content" v-html="tab.help"></span>
  301. </span>
  302. </p>
  303. <div class="mka-to-section" :class="getClasses( section )" v-for="section in tab.sections" v-if="sectionVisible( section )" :data-section="section.id">
  304. <p class="mka-to-section-heading" v-show="section.label" >
  305. <span v-html="section.label"></span>
  306. <span class="mka-wrap mka-tip-wrap" v-show="section.help">
  307. <a href="#" class="mka-tip">
  308. <span class="mka-tip-icon">
  309. <span class="mka-tip-arrow"></span>
  310. </span>
  311. <span class="mka-tip-ripple"></span>
  312. </a>
  313. <span class="mka-tip-content" v-html="section.help"></span>
  314. </span>
  315. </p>
  316. <vue-form-generator :schema="section" :model="model" :class></vue-form-generator>
  317. </div>
  318. </div>
  319. </div>
  320. <!-- <pre v-if="model" v-html="prettyJSON(model)"></pre> -->
  321. </div>
  322. <?php
  323. }
  324. }
  325. new MK_Theme_Options();