web/wp-content/plugins/acf-extended/includes/acfe-template-functions.php (392 lines of code) (raw):

<?php if(!defined('ABSPATH')){ exit; } /** * get_flexible * * Helper for the Flexible Content: Dynamic Render * * @param string $selector * @param false $post_id * * @return false|string */ if(!function_exists('get_flexible')){ function get_flexible($selector, $post_id = false){ // Bail early if(!have_rows($selector, $post_id)){ return false; } // Vars $flexible = acf_get_field_type('flexible_content'); ob_start(); while(have_rows($selector, $post_id)): the_row(); // Vars $loop = acf_get_loop('active'); $field = $loop['field']; // Bail early if not Flexible Content if($field['type'] !== 'flexible_content'){ break; } $loop_i = acf_get_loop('active', 'i'); $layout = $flexible->get_layout(get_row_layout(), $field); // First row if($loop_i === 0){ // Global global $is_preview; // Vars if(!isset($is_preview)){ $is_preview = false; } $name = $field['_name']; $key = $field['key']; // Actions do_action("acfe/flexible/enqueue", $field, $is_preview); do_action("acfe/flexible/enqueue/name={$name}", $field, $is_preview); do_action("acfe/flexible/enqueue/key={$key}", $field, $is_preview); } // Render: Enqueue acfe_flexible_render_layout_enqueue($layout, $field); // Render: Template acfe_flexible_render_layout_template($layout, $field); endwhile; return ob_get_clean(); } } /** * the_flexible * * Helper for the Flexible Content: Dynamic Render * * @param $selector * @param false $post_id */ if(!function_exists('the_flexible')){ function the_flexible($selector, $post_id = false){ echo get_flexible($selector, $post_id); } } /** * has_flexible * * Helper for the Flexible Content: Dynamic Render * * @param $selector * @param false $post_id * * @return bool */ if(!function_exists('has_flexible')){ function has_flexible($selector, $post_id = false){ return have_rows($selector, $post_id); } } /** * acfe_flexible_render_layout_template * * Find & include the Flexible Content Layouts PHP files * * @param $layout * @param $field */ function acfe_flexible_render_layout_template($layout, $field){ // Global global $is_preview, $col, $post; // allow $post to be used in the template $col = false; // Vars $name = $field['_name']; $key = $field['key']; $l_name = $layout['name']; // File $file = acf_maybe_get($layout, 'acfe_flexible_render_template'); // Filters $file = apply_filters("acfe/flexible/render/template", $file, $field, $layout, $is_preview); $file = apply_filters("acfe/flexible/render/template/name={$name}", $file, $field, $layout, $is_preview); $file = apply_filters("acfe/flexible/render/template/key={$key}", $file, $field, $layout, $is_preview); $file = apply_filters("acfe/flexible/render/template/layout={$l_name}", $file, $field, $layout, $is_preview); $file = apply_filters("acfe/flexible/render/template/name={$name}&layout={$l_name}", $file, $field, $layout, $is_preview); $file = apply_filters("acfe/flexible/render/template/key={$key}&layout={$l_name}", $file, $field, $layout, $is_preview); // Deprecated $file = apply_filters_deprecated("acfe/flexible/layout/render/template/layout={$l_name}", array($file, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/template/layout={$l_name}"); $file = apply_filters_deprecated("acfe/flexible/layout/render/template/name={$name}&layout={$l_name}", array($file, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/template/name={$name}&layout={$l_name}"); $file = apply_filters_deprecated("acfe/flexible/layout/render/template/key={$key}&layout={$l_name}", array($file, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/template/key={$key}&layout={$l_name}"); // Before Template do_action("acfe/flexible/render/before_template", $field, $layout, $is_preview); do_action("acfe/flexible/render/before_template/name={$name}", $field, $layout, $is_preview); do_action("acfe/flexible/render/before_template/key={$key}", $field, $layout, $is_preview); do_action("acfe/flexible/render/before_template/layout={$l_name}", $field, $layout, $is_preview); do_action("acfe/flexible/render/before_template/name={$name}&layout={$l_name}", $field, $layout, $is_preview); do_action("acfe/flexible/render/before_template/key={$key}&layout={$l_name}", $field, $layout, $is_preview); // Deprecated do_action_deprecated("acfe/flexible/layout/render/before_template/layout={$l_name}", array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/before_template/layout={$l_name}"); do_action_deprecated("acfe/flexible/layout/render/before_template/name={$name}&layout={$l_name}", array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/before_template/name={$name}&layout={$l_name}"); do_action_deprecated("acfe/flexible/layout/render/before_template/key={$key}&layout={$l_name}", array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/before_template/key={$key}&layout={$l_name}"); // Check file if(!empty($file)){ $file_found = acfe_locate_file_path($file); if(!empty($file_found)){ // Front-end if(!$is_preview){ // Include include($file_found); // Preview }else{ $path = pathinfo($file); $extension = $path['extension']; $file_preview = substr($file, 0, -strlen($extension)-1); $file_preview .= '-preview.' . $extension; $file_preview = acfe_locate_file_path($file_preview); // Include if(!empty($file_preview)){ include($file_preview); }else{ include($file_found); } } } } // After Template do_action("acfe/flexible/render/after_template", $field, $layout, $is_preview); do_action("acfe/flexible/render/after_template/name={$name}", $field, $layout, $is_preview); do_action("acfe/flexible/render/after_template/key={$key}", $field, $layout, $is_preview); do_action("acfe/flexible/render/after_template/layout={$l_name}", $field, $layout, $is_preview); do_action("acfe/flexible/render/after_template/name={$name}&layout={$l_name}", $field, $layout, $is_preview); do_action("acfe/flexible/render/after_template/key={$key}&layout={$l_name}", $field, $layout, $is_preview); // Deprecated do_action_deprecated("acfe/flexible/layout/render/after_template/layout={$l_name}", array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/after_template/layout={$l_name}"); do_action_deprecated("acfe/flexible/layout/render/after_template/name={$name}&layout={$l_name}", array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/after_template/name={$name}&layout={$l_name}"); do_action_deprecated("acfe/flexible/layout/render/after_template/key={$key}&layout={$l_name}", array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/after_template/key={$key}&layout={$l_name}"); } /** * acfe_flexible_render_layout_enqueue * * Find & Enqueue Scripts & Styles files for the Flexible Content * * @param $layout * @param $field */ function acfe_flexible_render_layout_enqueue($layout, $field){ // Global global $is_preview; // Vars $name = $field['_name']; $key = $field['key']; $l_name = $layout['name']; $handle = acf_slugify($name) . '-layout-' . acf_slugify($l_name); // Files $style = acf_maybe_get($layout, 'acfe_flexible_render_style'); $script = acf_maybe_get($layout, 'acfe_flexible_render_script'); /** * Actions */ do_action("acfe/flexible/enqueue/layout={$l_name}", $field, $layout, $is_preview); do_action("acfe/flexible/enqueue/name={$name}&layout={$l_name}", $field, $layout, $is_preview); do_action("acfe/flexible/enqueue/key={$key}&layout={$l_name}", $field, $layout, $is_preview); // Deprecated do_action_deprecated("acfe/flexible/layout/enqueue/layout={$l_name}", array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/enqueue/layout={$l_name}"); do_action_deprecated("acfe/flexible/layout/enqueue/name={$name}&layout={$l_name}", array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/enqueue/name={$name}&layout={$l_name}"); do_action_deprecated("acfe/flexible/layout/enqueue/key={$key}&layout={$l_name}", array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/enqueue/key={$key}&layout={$l_name}"); /** * Style */ $style = apply_filters("acfe/flexible/render/style", $style, $field, $layout, $is_preview); $style = apply_filters("acfe/flexible/render/style/name={$name}", $style, $field, $layout, $is_preview); $style = apply_filters("acfe/flexible/render/style/key={$key}", $style, $field, $layout, $is_preview); $style = apply_filters("acfe/flexible/render/style/layout={$l_name}", $style, $field, $layout, $is_preview); $style = apply_filters("acfe/flexible/render/style/name={$name}&layout={$l_name}", $style, $field, $layout, $is_preview); $style = apply_filters("acfe/flexible/render/style/key={$key}&layout={$l_name}", $style, $field, $layout, $is_preview); // Deprecated $style = apply_filters_deprecated("acfe/flexible/layout/render/style/layout={$l_name}", array($style, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/style/layout={$l_name}"); $style = apply_filters_deprecated("acfe/flexible/layout/render/style/name={$name}&layout={$l_name}", array($style, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/style/name={$name}&layout={$l_name}"); $style = apply_filters_deprecated("acfe/flexible/layout/render/style/key={$key}&layout={$l_name}", array($style, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/style/key={$key}&layout={$l_name}"); // Check if(!empty($style)){ // convert to array if(is_string($style)){ $style = array( 'src' => $style, ); } // defaults args $style = wp_parse_args($style, array( 'handle' => $handle, 'src' => '', 'deps' => array(), 'ver' => false, 'media' => 'all', )); // src url starts with current domain // remove it and let acfe_locate_file_url() handle it if(stripos($style['src'], home_url()) === 0){ $style['src'] = str_replace(home_url(), '', $style['src']); } // clone for front-end $style_front = $style; // locate src $style_front['src'] = acfe_locate_file_url($style_front['src']); // enqueue front-end + preview if(!empty($style_front['src'])){ wp_enqueue_style($style_front['handle'], $style_front['src'], $style_front['deps'], $style_front['ver'], $style_front['media']); } // preview mode // make sure the src is not a distant url if($is_preview && stripos($style['src'], 'http://') !== 0 && stripos($style['src'], 'https://') !== 0 && stripos($style['src'], '//') !== 0){ // clone for preview $style_preview = $style; // retrieve extension $path = pathinfo($style_preview['src']); $extension = $path['extension']; // append "-preview" to src $style_preview['src'] = substr($style_preview['src'], 0, -strlen($extension)-1); $style_preview['src'] .= '-preview.' . $extension; // locate src $style_preview['src'] = acfe_locate_file_url($style_preview['src']); // append "-preview" to handle $style_preview['handle'] = "{$style_preview['handle']}-preview"; // enqueue preview if(!empty($style_preview['src'])){ wp_enqueue_style($style_preview['handle'], $style_preview['src'], $style_preview['deps'], $style_preview['ver'], $style_preview['media']); } } } /** * Script */ $script = apply_filters("acfe/flexible/render/script", $script, $field, $layout, $is_preview); $script = apply_filters("acfe/flexible/render/script/name={$name}", $script, $field, $layout, $is_preview); $script = apply_filters("acfe/flexible/render/script/key={$key}", $script, $field, $layout, $is_preview); $script = apply_filters("acfe/flexible/render/script/layout={$l_name}", $script, $field, $layout, $is_preview); $script = apply_filters("acfe/flexible/render/script/name={$name}&layout={$l_name}", $script, $field, $layout, $is_preview); $script = apply_filters("acfe/flexible/render/script/key={$key}&layout={$l_name}", $script, $field, $layout, $is_preview); // Deprecated $script = apply_filters_deprecated("acfe/flexible/layout/render/script/layout={$l_name}", array($script, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/script/layout={$l_name}"); $script = apply_filters_deprecated("acfe/flexible/layout/render/script/name={$name}&layout={$l_name}", array($script, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/script/name={$name}&layout={$l_name}"); $script = apply_filters_deprecated("acfe/flexible/layout/render/script/key={$key}&layout={$l_name}", array($script, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/script/key={$key}&layout={$l_name}"); // Check if(!empty($script)){ // convert to array if(is_string($script)){ $script = array( 'src' => $script, ); } // defaults args $script = wp_parse_args($script, array( 'handle' => $handle, 'src' => '', 'deps' => array(), 'ver' => false, 'args' => true, )); // src url starts with current domain // remove it and let acfe_locate_file_url() handle it if(stripos($script['src'], home_url()) === 0){ $script['src'] = str_replace(home_url(), '', $script['src']); } // clone for front-end $script_front = $script; // locate $script_front['src'] = acfe_locate_file_url($script_front['src']); // front-end with distant script if(!$is_preview || (stripos($script['src'], 'http://') === 0 || stripos($script['src'], 'https://') === 0 || stripos($script['src'], '//') === 0)){ if(!empty($script_front['src'])){ wp_enqueue_script($script_front['handle'], $script_front['src'], $script_front['deps'], $script_front['ver'], $script_front['args']); } // front-end/preview with local script }else{ // clone for preview $script_preview = $script; // retrieve extension $path = pathinfo($script_preview['src']); $extension = $path['extension']; // append "-preview" to src $script_preview['src'] = substr($script_preview['src'], 0, -strlen($extension)-1); $script_preview['src'] .= '-preview.' . $extension; // locate src $script_preview['src'] = acfe_locate_file_url($script_preview['src']); // append "-preview" to handle $script_preview['handle'] = "{$script_preview['handle']}-preview"; // enqueue preview if(!empty($script_preview['src'])){ wp_enqueue_script($script_preview['handle'], $script_preview['src'], $script_preview['deps'], $script_preview['ver'], $script_preview['args']); // enqueue front-end }elseif(!empty($script_front['src'])){ wp_enqueue_script($script_front['handle'], $script_front['src'], $script_front['deps'], $script_front['ver'], $script_front['args']); } } } } /** * have_settings * * While loop function for the Flexible Content: Settings Modal feature * * @return bool */ if(!function_exists('have_settings')){ function have_settings(){ return have_rows('layout_settings'); } } /** * the_setting * * Setup data for the Flexible Content: Settings Modal loop * * @return false|mixed */ if(!function_exists('the_setting')){ function the_setting(){ return the_row(); } } /** * have_archive * * While loop function for the Dynamic Post Type: Archive Page feature * * @param false $_post_type * * @return bool */ if(!function_exists('have_archive')){ function have_archive($post_type = false){ global $acfe_archive_i, $acfe_archive_post_type; $acfe_archive_post_type = false; if(!isset($acfe_archive_i) || $acfe_archive_i === 0){ $acfe_archive_i = 0; if(!$post_type){ // try get_post_type() $post_type = get_post_type(); if(!$post_type){ // try get_queried_object() $object = get_queried_object(); if(is_a($object, 'WP_Post_Type') && property_exists($object, 'has_archive')){ $post_type = $object->name; } } } if(!$post_type){ return false; } if(!post_type_exists($post_type)){ return false; } $post_type_object = get_post_type_object($post_type); if(empty($post_type_object)){ return false; } if(!acfe_maybe_get($post_type_object, 'acfe_admin_archive')){ return false; } $acfe_archive_post_type = $post_type; return true; } remove_filter('acf/pre_load_post_id', 'acfe_the_archive_post_id'); return false; } } /** * the_archive * * Setup data for the Dynamic Post Type: Archive Page feature */ if(!function_exists('the_archive')){ function the_archive(){ global $acfe_archive_i; add_filter('acf/pre_load_post_id', 'acfe_the_archive_post_id', 10, 2); $acfe_archive_i++; } } /** * acfe_the_archive_post_id * * Dynamic Post Type: Archive Page helper * * @param $null * @param $post_id * * @return mixed|void */ function acfe_the_archive_post_id($null, $post_id){ if($post_id !== false){ return $null; } global $acfe_archive_post_type; if(empty($acfe_archive_post_type)){ return $null; } return acf_get_valid_post_id("{$acfe_archive_post_type}_archive"); } /** * acfe_get_post_id * * Universal way to always retrieve the correct ACF Post ID on front-end, back-end and ajax * * Format: * * raw: 12 | term_24 | user_56 | my-options * id: 12 | 24 | 56 | my-options * type: post | term | user | options * array: array('id' => 12, 'type' => 'post') * * @param string $format - raw, id, type or array * * @return mixed|void */ function acfe_get_post_id($format = 'raw'){ // deprecated format: true/false $format = $format === true ? 'raw' : $format; $format = $format === false ? 'id' : $format; // vars $is_ajax = wp_doing_ajax(); $is_front = !is_admin() && !$is_ajax; $is_admin = is_admin() && !$is_ajax; // ajax request if($is_ajax){ // passed in acf_form_data() // passed during acf/save_post $post_id = acf_get_form_data('post_id'); // form submission if(!$post_id){ $post_id = acf_maybe_get_POST('_acf_post_id', 0); } // passed in acf_form_data() // passed in acf.data > acf.prepareForAjax if(!$post_id){ $post_id = acf_maybe_get_POST('post_id', 0); } // admin request }elseif($is_admin){ // passed in acf_form_data() // passed during acf/save_post & acf/validate_save_post $post_id = acf_get_form_data('post_id'); // form submission if(!$post_id){ $post_id = acf_maybe_get_POST('_acf_post_id', 0); } // post url param if(!$post_id){ $post_id = isset($_REQUEST['post']) ? absint($_REQUEST['post']) : 0; } // acf block type request if(!$post_id){ $post_id = isset($_REQUEST['post_id']) ? absint($_REQUEST['post_id']) : 0; } // url param if(!$post_id){ $post_id = isset($_REQUEST['user_id']) ? 'user_' . absint($_REQUEST['user_id']) : 0; } // profile if(!$post_id){ global $pagenow, $user_ID; $post_id = $pagenow === 'profile.php' && $user_ID !== null ? 'user_' . absint($user_ID) : 0; } // term url param if(!$post_id){ $post_id = isset($_REQUEST['tag_ID']) ? 'term_' . absint($_REQUEST['tag_ID']) : 0; } // options page // must be before post type list because post type archive is on edit.php if(!$post_id){ global $plugin_page; if(isset($plugin_page)){ $page = acf_get_options_page($plugin_page); if($page){ $post_id = $page['post_id']; } } } // post type list if(!$post_id){ global $pagenow, $typenow; $post_id = $pagenow === 'edit.php' ? "{$typenow}_options" : 0; } // term list if(!$post_id){ global $pagenow, $taxnow; $post_id = $pagenow === 'edit-tags.php' ? "tax_{$taxnow}_options" : 0; } // user list if(!$post_id){ global $pagenow; $post_id = $pagenow === 'users.php' ? "user_options" : 0; } // attachment list if(!$post_id){ global $pagenow; $post_id = $pagenow === 'upload.php' ? "attachment_options" : 0; } // settings if(!$post_id && function_exists('get_current_screen')){ $setting_pages = array('options-general', 'options-writing', 'options-reading', 'options-discussion', 'options-media', 'options-permalink'); if(in_array(get_current_screen()->id, $setting_pages)){ $post_id = get_current_screen()->id; } } // common post id if(!$post_id){ $post_id = (int) get_the_ID(); } // front-end request }elseif($is_front){ // default $post_id = 0; // passed in acf_form_data() // passed during acf/save_post & acf/validate_save_post if(doing_action('acf/save_post') || doing_action('acf/validate_save_post')){ $post_id = acf_get_form_data('post_id'); } // common post id (within a loop) if(!$post_id){ if(in_the_loop() || is_singular()){ $post_id = (int) get_the_ID(); } } // get queries object if(!$post_id){ $object = get_queried_object(); if(is_object($object)){ // post/page object if(isset($object->post_type, $object->ID)){ $post_id = (int) $object->ID; // post type archive object }elseif(isset($object->hierarchical, $object->name, $object->acfe_admin_archive)){ $post_id = "{$object->name}_archive"; // user object }elseif(isset($object->roles, $object->ID)){ $post_id = "user_{$object->ID}"; // term object }elseif(isset($object->taxonomy, $object->term_id)){ $post_id = "term_{$object->term_id}"; // comment object }elseif(isset($object->comment_ID)){ $post_id = "comment_{$object->comment_ID}"; } } } // passed in acf_form_data() // passed during acf/save_post & acf/validate_save_post if(!$post_id){ $post_id = acf_get_form_data('post_id'); } // fallback common post id if(!$post_id){ $post_id = (int) get_the_ID(); } } // default if(!$post_id){ $post_id = 0; } // allow for option == options if($post_id === 'option'){ $post_id = 'options'; } // append language code if($post_id == 'options'){ $dl = acf_get_setting('default_language'); $cl = acf_get_setting('current_language'); if($cl && $cl !== $dl){ $post_id .= '_' . $cl; } } // filter for 3rd party $post_id = apply_filters('acf/validate_post_id', $post_id, $post_id); // decoded post id $decoded = acf_decode_post_id($post_id); // return id if($format === 'id'){ return $decoded['id']; // return type }elseif($format === 'type'){ return $decoded['type']; // return array }elseif($format === 'array'){ return $decoded; } // return raw return $post_id; }