PageRenderTime 21ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/plugins/js_composer/include/autoload/hook-vc-grid.php

https://bitbucket.org/wphupp/tmp-passion-sourire
PHP | 260 lines | 169 code | 26 blank | 65 comment | 22 complexity | 4a5a78e7fcbfab0779a39ea5e28387bb MD5 | raw file
Possible License(s): GPL-3.0, BSD-3-Clause, Apache-2.0, MIT
  1. <?php
  2. if ( ! defined( 'ABSPATH' ) ) {
  3. die( '-1' );
  4. }
  5. /**
  6. * Class Vc_Hooks_Vc_Grid
  7. * @since 4.4
  8. */
  9. class Vc_Hooks_Vc_Grid implements Vc_Vendor_Interface {
  10. protected $grid_id_unique_name = 'vc_gid'; // if you change this also change in vc-basic-grid.php
  11. /**
  12. * Initializing hooks for grid element,
  13. * Add actions to save appended shortcodes to post meta (for rendering in preview with shortcode id)
  14. * And add action to hook request for grid data, to output it.
  15. * @since 4.4
  16. */
  17. public function load() {
  18. // Hook for set post settings meta with shortcodes data
  19. /**
  20. * @since 4.4.3
  21. */
  22. add_filter( 'vc_hooks_vc_post_settings', array(
  23. &$this,
  24. 'gridSavePostSettingsId',
  25. ), 10, 3 );
  26. /**
  27. * Used to output shortcode data for ajax request. called on any page request.
  28. */
  29. add_action( 'wp_ajax_vc_get_vc_grid_data', array(
  30. &$this,
  31. 'getGridDataForAjax',
  32. ) );
  33. add_action( 'wp_ajax_nopriv_vc_get_vc_grid_data', array(
  34. &$this,
  35. 'getGridDataForAjax',
  36. ) );
  37. }
  38. /**
  39. * @since 4.4
  40. * @deprecated and should not be used and will be removed in future! since 4.4.3
  41. * @return string
  42. */
  43. private function getShortcodeRegexForHash() {
  44. // _deprecated_function( 'Vc_Hooks_Vc_Grid: getShortcodeRegexForHash method', '4.4.3', 'getShortcodeRegexForId' );
  45. $tagnames = apply_filters( 'vc_grid_shortcodes_tags', array(
  46. 'vc_basic_grid',
  47. 'vc_masonry_grid',
  48. 'vc_media_grid',
  49. 'vc_masonry_media_grid',
  50. ) ); // return only grid shortcodes
  51. $tagregexp = implode( '|', array_map( 'preg_quote', $tagnames ) );
  52. // WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag()
  53. // Also, see shortcode_unautop() and shortcode.js.
  54. return '\\[' // Opening bracket
  55. . '(\\[?)' // 1: Optional second opening bracket for escaping shortcodes: [[tag]]
  56. . "($tagregexp)" // 2: Shortcode name
  57. . '(?![\\w-])' // Not followed by word character or hyphen
  58. . '(' // 3: Unroll the loop: Inside the opening shortcode tag
  59. . '[^\\]\\/]*' // Not a closing bracket or forward slash
  60. . '(?:' . '\\/(?!\\])' // A forward slash not followed by a closing bracket
  61. . '[^\\]\\/]*' // Not a closing bracket or forward slash
  62. . ')*?' . ')' . '(?:' . '(\\/)' // 4: Self closing tag ...
  63. . '\\]' // ... and closing bracket
  64. . '|' . '\\]' // Closing bracket
  65. . '(?:' . '(' // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags
  66. . '[^\\[]*+' // Not an opening bracket
  67. . '(?:' . '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag
  68. . '[^\\[]*+' // Not an opening bracket
  69. . ')*+' . ')' . '\\[\\/\\2\\]' // Closing shortcode tag
  70. . ')?' . ')' . '(\\]?)'; // 6: Optional second closing brocket for escaping shortcodes: [[tag]]
  71. }
  72. /**
  73. * @since 4.4.3
  74. * @return string
  75. */
  76. private function getShortcodeRegexForId() {
  77. return '\\[' // Opening bracket
  78. . '(\\[?)' // 1: Optional second opening bracket for escaping shortcodes: [[tag]]
  79. . '([\\w-_]+)' // 2: Shortcode name
  80. . '(?![\\w-])' // Not followed by word character or hyphen
  81. . '(' // 3: Unroll the loop: Inside the opening shortcode tag
  82. . '[^\\]\\/]*' // Not a closing bracket or forward slash
  83. . '(?:' . '\\/(?!\\])' // A forward slash not followed by a closing bracket
  84. . '[^\\]\\/]*' // Not a closing bracket or forward slash
  85. . ')*?'
  86. . '(?:' . '(' . $this->grid_id_unique_name // 4: GridId must exist
  87. . '[^\\]\\/]*' // Not a closing bracket or forward slash
  88. . ')+' . ')'
  89. . ')' . '(?:' . '(\\/)' // 5: Self closing tag ...
  90. . '\\]' // ... and closing bracket
  91. . '|' . '\\]' // Closing bracket
  92. . '(?:' . '(' // 6: Unroll the loop: Optionally, anything between the opening and closing shortcode tags
  93. . '[^\\[]*+' // Not an opening bracket
  94. . '(?:' . '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag
  95. . '[^\\[]*+' // Not an opening bracket
  96. . ')*+' . ')' . '\\[\\/\\2\\]' // Closing shortcode tag
  97. . ')?' . ')' . '(\\]?)'; // 7: Optional second closing brocket for escaping shortcodes: [[tag]]
  98. }
  99. /**
  100. * Set page meta box values with vc_adv_pager shortcodes data
  101. * @since 4.4
  102. * @deprecated 4.4.3
  103. *
  104. * @param array $settings
  105. * @param $post_id
  106. * @param $post
  107. *
  108. * @return array - shortcode settings to save.
  109. */
  110. public function gridSavePostSettings( array $settings, $post_id, $post ) {
  111. // _deprecated_function( 'Vc_Hooks_Vc_Grid: gridSavePostSettings method', '4.4.3 (will be removed in 4.10)', 'gridSavePostSettingsId' );
  112. $pattern = $this->getShortcodeRegexForHash();
  113. preg_match_all( "/$pattern/", $post->post_content, $found ); // fetch only needed shortcodes
  114. $settings['vc_grid'] = array();
  115. if ( is_array( $found ) && ! empty( $found[0] ) ) {
  116. $to_save = array();
  117. if ( isset( $found[3] ) && is_array( $found[3] ) ) {
  118. foreach ( $found[3] as $key => $shortcode_atts ) {
  119. if ( false !== strpos( $shortcode_atts, 'vc_gid:' ) ) {
  120. continue;
  121. }
  122. $atts = shortcode_parse_atts( $shortcode_atts );
  123. $data = array(
  124. 'tag' => $found[2][ $key ],
  125. 'atts' => $atts,
  126. 'content' => $found[5][ $key ],
  127. );
  128. $hash = sha1( serialize( $data ) );
  129. $to_save[ $hash ] = $data;
  130. }
  131. }
  132. if ( ! empty( $to_save ) ) {
  133. $settings['vc_grid'] = array( 'shortcodes' => $to_save );
  134. }
  135. }
  136. return $settings;
  137. }
  138. /**
  139. * @since 4.4.3
  140. *
  141. * @param array $settings
  142. * @param $post_id
  143. * @param $post
  144. *
  145. * @return array
  146. */
  147. public function gridSavePostSettingsId( array $settings, $post_id, $post ) {
  148. $pattern = $this->getShortcodeRegexForId();
  149. preg_match_all( "/$pattern/", $post->post_content, $found ); // fetch only needed shortcodes
  150. $settings['vc_grid_id'] = array();
  151. if ( is_array( $found ) && ! empty( $found[0] ) ) {
  152. $to_save = array();
  153. if ( isset( $found[1] ) && is_array( $found[1] ) ) {
  154. foreach ( $found[1] as $key => $parse_able ) {
  155. if ( empty( $parse_able ) || '[' !== $parse_able ) {
  156. $id_pattern = '/' . $this->grid_id_unique_name . '\:([\w-_]+)/';
  157. $id_value = $found[4][ $key ];
  158. preg_match( $id_pattern, $id_value, $id_matches );
  159. if ( ! empty( $id_matches ) ) {
  160. $id_to_save = $id_matches[1];
  161. // why we need to check if shortcode is parse able?
  162. // 1: if it is escaped it must not be displayed (parsed)
  163. // 2: so if 1 is true it must not be saved in database meta
  164. $shortcode_tag = $found[2][ $key ];
  165. $shortcode_atts_string = $found[3][ $key ];
  166. /** @var $atts array */
  167. $atts = shortcode_parse_atts( $shortcode_atts_string );
  168. $content = $found[6][ $key ];
  169. $data = array(
  170. 'tag' => $shortcode_tag,
  171. 'atts' => $atts,
  172. 'content' => $content,
  173. );
  174. $to_save[ $id_to_save ] = $data;
  175. }
  176. }
  177. }
  178. }
  179. if ( ! empty( $to_save ) ) {
  180. $settings['vc_grid_id'] = array( 'shortcodes' => $to_save );
  181. }
  182. }
  183. return $settings;
  184. }
  185. /**
  186. * @since 4.4
  187. *
  188. * @output/@return string - grid data for ajax request.
  189. */
  190. public function getGridDataForAjax() {
  191. $tag = vc_request_param( 'tag' );
  192. $allowed = apply_filters( 'vc_grid_get_grid_data_access', vc_verify_public_nonce() && $tag, $tag );
  193. if ( $allowed ) {
  194. $shortcode_fishbone = visual_composer()->getShortCode( $tag );
  195. if ( is_object( $shortcode_fishbone ) ) {
  196. /** @var $vc_grid WPBakeryShortcode_Vc_Basic_Grid */
  197. $vc_grid = $shortcode_fishbone->shortcodeClass();
  198. if ( method_exists( $vc_grid, 'isObjectPageable' ) && $vc_grid->isObjectPageable() && method_exists( $vc_grid, 'renderAjax' ) ) {
  199. echo $vc_grid->renderAjax( vc_request_param( 'data' ) );
  200. die();
  201. }
  202. }
  203. }
  204. }
  205. }
  206. /**
  207. * @since 4.4
  208. * @var Vc_Hooks_Vc_Grid $hook
  209. */
  210. $hook = new Vc_Hooks_Vc_Grid();
  211. // when visual composer initialized let's trigger Vc_Grid hooks.
  212. add_action( 'vc_after_init', array(
  213. $hook,
  214. 'load',
  215. ) );
  216. if ( 'vc_edit_form' === vc_post_param( 'action' ) ) {
  217. VcShortcodeAutoloader::getInstance()->includeClass( 'WPBakeryShortCode_VC_Basic_Grid' );
  218. add_filter( 'vc_edit_form_fields_attributes_vc_basic_grid', array(
  219. 'WPBakeryShortCode_VC_Basic_Grid',
  220. 'convertButton2ToButton3',
  221. ) );
  222. add_filter( 'vc_edit_form_fields_attributes_vc_media_grid', array(
  223. 'WPBakeryShortCode_VC_Basic_Grid',
  224. 'convertButton2ToButton3',
  225. ) );
  226. add_filter( 'vc_edit_form_fields_attributes_vc_masonry_grid', array(
  227. 'WPBakeryShortCode_VC_Basic_Grid',
  228. 'convertButton2ToButton3',
  229. ) );
  230. add_filter( 'vc_edit_form_fields_attributes_vc_masonry_media_grid', array(
  231. 'WPBakeryShortCode_VC_Basic_Grid',
  232. 'convertButton2ToButton3',
  233. ) );
  234. }