Ejemplo n.º 1
0
 static function array_field_shortcode($atts, $content, $shortcode_name)
 {
     $out = null;
     $array = null;
     $prev_state = self::$state;
     $prefix = CCS_Format::get_minus_prefix($shortcode_name);
     extract(shortcode_atts(array('field' => '', 'user_field' => '', 'each' => 'false', 'debug' => 'false', 'global' => '', 'json' => '', 'choices' => '', 'type' => '', 'name' => '', 'trim' => ''), $atts));
     if (!empty($global)) {
         $field = 'GLOBAL';
     } elseif (!empty($choices)) {
         $field = $choices;
     } elseif (isset($atts) && !empty($atts[0])) {
         $field = $atts[0];
     }
     // Inside ACF repeater/flex
     if (class_exists('CCS_To_ACF') && CCS_To_ACF::$state['is_repeater_or_flex_loop'] && $field != 'GLOBAL') {
         // Get sub field
         if (function_exists('get_sub_field')) {
             $array = get_sub_field($field);
         }
     } else {
         if ($field == 'GLOBAL') {
             $array = $GLOBALS[$global];
             if (!is_array($array)) {
                 $array = array('value' => $array);
             }
         } elseif (!empty($choices)) {
             // ACF checkbox/select/radio choices
             // Needs field key
             if (substr($choices, 0, 6) == 'field_') {
                 $key = $choices;
             } else {
                 $cmd = '[loop';
                 if (!empty($name)) {
                     $cmd .= ' name="' . $name . '"';
                 } else {
                     if (empty($type)) {
                         $type = get_post_type();
                         if (!$type) {
                             $type = 'post';
                         }
                     }
                     $cmd .= ' type=' . $type;
                 }
                 $key = do_ccs_shortcode($cmd . ' count=1][field _' . $choices . '][/loop]');
             }
             $field = get_field_object($key);
             if ($debug == 'true') {
                 $array = $field;
             } else {
                 $array = array();
                 if ($field) {
                     foreach ($field['choices'] as $key => $value) {
                         $array[] = array('value' => $key, 'label' => $value);
                     }
                     $each = 'true';
                 }
             }
             // User field
         } elseif (!empty($user_field)) {
             $array = CCS_User::get_user_field($user_field);
             // Normal field
         } else {
             if (self::$state['is_array_field']) {
                 // Nested array
                 $array = self::$state['current_field_value'];
                 $array = isset($array[$field]) ? $array[$field] : '';
                 //debug_array($array);
             } else {
                 $id = do_shortcode('[field id]');
                 $array = get_post_meta($id, $field, true);
             }
         }
         // Not array
         if (!empty($array) && !is_array($array)) {
             // See if it's an ACF field
             if (function_exists('get_field')) {
                 $array = get_field($field);
             }
         }
     }
     if ($json == 'true') {
         $array = json_decode($array, true);
     }
     if ($debug == 'true') {
         $out = self::print_array($array, false);
     }
     if (!empty($array) && is_array($array)) {
         self::$state['is_array_field'] = true;
         self::$state['array_field_index'] = 0;
         if ($each != 'true') {
             $array = array($array);
             // Create a single array
         }
         self::$state['array_field_count'] = count($array);
         foreach ($array as $each_array) {
             self::$state['current_field_value'] = $each_array;
             self::$state['array_field_index']++;
             // Starts from 1
             $this_content = $content;
             if (!empty($choices)) {
                 $this_content = str_replace('{VALUE}', @$each_array['value'], $content);
                 $this_content = str_replace('{LABEL}', @$each_array['label'], $this_content);
             }
             $this_content = str_replace('{' . $prefix . 'ARRAY_INDEX}', self::$state['array_field_index'], $this_content);
             $out .= do_ccs_shortcode($this_content);
         }
         self::$state['is_array_field'] = false;
     } else {
         $out = $array;
         // Empty or not array
     }
     if (is_array($out)) {
         $out = '[ Array ]';
     } elseif ($trim == 'true') {
         $out = trim($out, " \t\n\r\v,");
     }
     self::$state = $prev_state;
     return $out;
 }
Ejemplo n.º 2
0
 static function pass_shortcode($atts, $content, $shortcode_name)
 {
     $args = array('field' => '', 'date_format' => '', 'in' => '', 'fields' => '', 'array' => '', 'debug' => '', 'field_loop' => '', 'taxonomy_loop' => '', 'list' => '', 'acf_gallery' => '', 'current' => '', 'orderby' => '', 'order' => '', 'hide_empty' => 'false', 'pre_render' => 'false', 'post_render' => 'true', 'trim' => 'false', 'count' => '9999', 'user_field' => '', 'user_fields' => '', 'global' => '', 'sub' => '', 'random' => '');
     $atts = self::replace_variables($atts);
     extract(shortcode_atts($args, $atts, true));
     // Shortcuts
     if (isset($atts[0])) {
         if ($atts[0] === 'route') {
             $global = 'route';
         } elseif ($atts[0] === 'vars') {
             $global = 'vars';
         }
     }
     if ($pre_render == 'true') {
         $content = do_ccs_shortcode($content);
     }
     // This should get the current post in all contexts
     $post_id = do_shortcode('[field id]');
     // Support nested
     $prefix = CCS_Format::get_minus_prefix($shortcode_name);
     if (!empty($date_format)) {
         // Date format: allow escape via "//" because "\" disappears in shortcode parameters
         $date_format = str_replace("//", "\\", $date_format);
     }
     /*---------------------------------------------
      *
      * Pass single field to {FIELD}
      *
      */
     if (!empty($global) && empty($field) && $field != '0') {
         $field = 'this';
     }
     if (!empty($array)) {
         $field = $array;
     }
     if (!empty($field) || $field == '0') {
         if ($field == 'gallery') {
             $field = '_custom_gallery';
         }
         // Support CCS gallery field
         // Pass global variable
         if (!empty($global)) {
             $field_value = '';
             if ($global == 'route') {
                 // Parsed URL route
                 $request = CCS_URL::get_route();
                 $requests = CCS_URL::get_routes();
                 if ($field == 'this') {
                     $field_value = $request;
                     // whole thing
                     for ($i = 0; $i < 6; $i++) {
                         $part = '';
                         if (isset($requests[$i])) {
                             $part = $requests[$i];
                         }
                         $tag = '{' . $prefix . 'FIELD_' . ($i + 1) . '}';
                         $content = str_replace($tag, $part, $content);
                     }
                 } else {
                     if (isset($requests[intval($field)])) {
                         $field_value = $requests[intval($field)];
                     }
                 }
             } elseif ($global == 'query') {
                 // Parsed query string
                 $field_value = CCS_URL::get_query();
                 $query_array = CCS_URL::get_queries();
                 foreach ($query_array as $key => $value) {
                     $tag = '{' . $prefix . strtoupper($key) . '}';
                     $content = str_replace($tag, $value, $content);
                 }
                 if (!empty($fields)) {
                     // Remove what was not rendered
                     $fields = CCS_Format::explode_list($fields);
                     foreach ($fields as $key) {
                         $tag = '{' . $prefix . strtoupper($key) . '}';
                         $content = str_replace($tag, '', $content);
                     }
                     $fields = '';
                 } elseif (!empty($field)) {
                     $tag = '{' . $prefix . 'FIELD' . '}';
                     $value = isset($query_array[$field]) ? $query_array[$field] : '';
                     $content = str_replace($tag, $value, $content);
                 }
             } elseif ($global == 'vars') {
                 foreach (self::$vars as $key => $value) {
                     $tag = '{' . $prefix . strtoupper($key) . '}';
                     $content = str_replace($tag, $value, $content);
                 }
             } else {
                 if ($field == 'this' && isset($GLOBALS[$global])) {
                     $field_value = $GLOBALS[$global];
                 } elseif (!empty($sub) && isset($GLOBALS[$global][$field][$sub])) {
                     $field_value = $GLOBALS[$global][$field][$sub];
                 } elseif (isset($GLOBALS[$global][$field])) {
                     $field_value = $GLOBALS[$global][$field];
                 }
             }
             // end global
             // Repeater or flexible content field
         } elseif (class_exists('CCS_To_ACF') && CCS_To_ACF::$state['is_repeater_or_flex_loop']) {
             if ($field == 'index') {
                 $field_value = CCS_To_ACF::$state['repeater_index'];
             } elseif (function_exists('get_sub_field')) {
                 $field_value = get_sub_field($field);
             } else {
                 $field_value = null;
             }
             // Predefined or custom field
         } else {
             $field_value = CCS_Content::get_prepared_field($field, $post_id);
         }
         if (is_array($field_value)) {
             if (!empty($array)) {
                 if ($debug == 'true') {
                     ob_start();
                     echo '<pre><code>';
                     print_r($field_value);
                     echo '</code></pre>';
                     return ob_get_clean();
                 }
                 // array parameter
                 foreach ($field_value as $key => $value) {
                     $content = str_replace('{' . strtoupper($key) . '}', $value, $content);
                 }
             } else {
                 // field parameter
                 foreach ($field_value as $key => $value) {
                     $content = str_replace('{' . $prefix . 'FIELD:' . strtoupper($key) . '}', $value, $content);
                 }
             }
             //$field_value = '(Array)';
             $field_value = implode(",", $field_value);
         } else {
             // Clean extra spaces if it's a list
             $field_value = CCS_Loop::clean_list($field_value);
         }
         if (!empty($date_format)) {
             // Date format for custom field
             if (!empty($in) && $in == 'timestamp' && is_numeric($field_value)) {
                 $field_value = gmdate("Y-m-d H:i:s", $field_value);
             }
             if ($date_format == 'true') {
                 $date_format = get_option('date_format');
             }
             $field_value = mysql2date($date_format, $field_value);
         }
         // Replace it
         $content = str_replace('{' . $prefix . 'FIELD}', $field_value, $content);
         /*---------------------------------------------
          *
          * Pass each item in a list stored in a field
          *
          */
     } elseif (!empty($field_loop)) {
         if ($field_loop == 'gallery' && class_exists('CCS_Gallery_Field')) {
             // Support gallery field
             $field_values = CCS_Gallery_Field::get_image_ids();
         } else {
             $field_values = get_post_meta($post_id, $field_loop, true);
         }
         if (!empty($field_values)) {
             if (!is_array($field_values)) {
                 $field_values = CCS_Format::explode_list($field_values);
             }
             // Get comma-separated list of values
             $contents = null;
             // Loop for the number of field values
             foreach ($field_values as $field_value) {
                 $contents[] = str_replace('{' . $prefix . 'FIELD}', $field_value, $content);
             }
             $content = implode('', $contents);
         }
         /*---------------------------------------------
          *
          * Pass image IDs from ACF gallery
          *
          */
     } elseif (!empty($acf_gallery)) {
         if (function_exists('get_field') && function_exists('get_sub_field')) {
             $field = $acf_gallery;
             $images = get_field($acf_gallery, $post_id, false);
             if (empty($field_value)) {
                 // Try sub field
                 $images = get_sub_field($acf_gallery, $post_id, false);
             }
             if (!empty($images)) {
                 $ids = array();
                 foreach ($images as $image) {
                     $ids[] = $image['id'];
                 }
                 if (is_array($ids)) {
                     $replace = implode(',', $ids);
                 } else {
                     $replace = $ids;
                 }
                 $content = str_replace('{' . $prefix . 'FIELD}', $replace, $content);
             }
         }
         /*---------------------------------------------
          *
          * Pass each taxonomy term
          *
          */
     } elseif (!empty($taxonomy_loop)) {
         if ($current == 'true') {
             if (empty($orderby) && empty($order)) {
                 // Doesn't accept order/orderby parameters - but it's cached
                 $terms = get_the_terms($post_id, $taxonomy_loop);
             } else {
                 $terms = wp_get_object_terms($post_id, $taxonomy_loop, array('orderby' => empty($orderby) ? 'name' : $orderby, 'order' => empty($order) ? 'ASC' : strtoupper($order)));
             }
         } else {
             // Get all terms: not by post ID
             $terms = get_terms($taxonomy_loop, array('orderby' => empty($orderby) ? 'name' : $orderby, 'order' => empty($order) ? 'ASC' : strtoupper($order), 'hide_empty' => $hide_empty == 'true'));
         }
         $contents = '';
         // Loop through each term
         if (!empty($terms)) {
             $i = 0;
             foreach ($terms as $term) {
                 if ($i++ >= $count) {
                     break;
                 }
                 $slug = $term->slug;
                 $id = $term->term_id;
                 $name = $term->name;
                 $replaced_content = str_replace('{' . $prefix . 'TERM}', $slug, $content);
                 $replaced_content = str_replace('{' . $prefix . 'TERM_ID}', $id, $replaced_content);
                 $replaced_content = str_replace('{' . $prefix . 'TERM_NAME}', $name, $replaced_content);
                 $contents .= $replaced_content;
             }
         }
         $content = $contents;
     }
     /*---------------------------------------------
      *
      * Pass a list of items
      *
      */
     if (!empty($list)) {
         $items = CCS_Format::explode_list($list);
         // Comma-separated list -> array
         // Create range
         $new_items = array();
         foreach ($items as $item) {
             if (strpos($item, '~') !== false) {
                 $pair = CCS_Format::explode_list($item, '~');
                 $list = range($pair[0], $pair[1]);
                 foreach ($list as $list_item) {
                     $new_items[] = $list_item;
                 }
             } else {
                 $new_items[] = $item;
             }
         }
         $items = $new_items;
         $contents = '';
         foreach ($items as $item) {
             $replaced_content = $content;
             // Multiple items per loop
             if (strpos($item, ':') !== false) {
                 $parts = explode(':', $item);
                 $count = count($parts);
                 for ($i = 0; $i < $count; $i++) {
                     $this_item = trim($parts[$i]);
                     // Index starts at ITEM_1
                     $replaced_content = str_replace('{' . $prefix . 'ITEM_' . ($i + 1) . '}', $this_item, $replaced_content);
                     // Would this be useful?
                     // $replaced_content = str_replace('{Item_'.$i.'}', ucfirst($this_item),
                     //  $replaced_content);
                 }
             } else {
                 $replaced_content = str_replace('{' . $prefix . 'ITEM}', $item, $replaced_content);
                 $replaced_content = str_replace('{' . $prefix . 'Item}', ucfirst($item), $replaced_content);
             }
             $contents .= $replaced_content;
         }
         $content = $contents;
     }
     /*---------------------------------------------
      *
      * Pass user field(s)
      *
      */
     if (!empty($user_field)) {
         $user_field_value = do_shortcode('[user ' . $user_field . ' out="slug"]');
         // Replace it
         $content = str_replace('{' . $prefix . 'USER_FIELD}', $user_field_value, $content);
     }
     if (!empty($user_fields)) {
         $user_fields_array = CCS_Format::explode_list($user_fields);
         foreach ($user_fields_array as $this_field) {
             $user_field_value = do_shortcode('[user ' . $this_field . ' out="slug"]');
             // Replace {FIELD_NAME}
             $content = str_replace('{' . $prefix . strtoupper($this_field) . '}', $user_field_value, $content);
         }
     }
     if (!empty($random)) {
         $content = str_replace('{' . $prefix . 'RANDOM}', do_shortcode('[random ' . $random . ']'), $content);
     }
     if (!empty($fields)) {
         if (!empty($global)) {
             $fields = CCS_Format::explode_list($fields);
             foreach ($fields as $this_field) {
                 $tag = '{' . $prefix . strtoupper($this_field) . '}';
                 $value = '';
                 if (isset($GLOBALS[$global][$this_field])) {
                     $value = $GLOBALS[$global][$this_field];
                 }
                 $content = str_replace($tag, $value, $content);
             }
         } else {
             // Replace these fields (+default)
             $content = CCS_Loop::render_field_tags($content, array('fields' => $fields));
         }
     } else {
         $content = CCS_Loop::render_field_tags($content, array());
     }
     if ($post_render == 'true') {
         $content = do_local_shortcode('ccs', $content, true);
     }
     // Trim trailing white space and comma
     if ($trim != 'false') {
         if ($trim == 'true') {
             $trim = null;
         }
         $content = rtrim($content, " \t\n\r\v," . $trim);
     }
     return $content;
 }
Ejemplo n.º 3
0
 public static function get_if_else($content, $shortcode_name = '', $else_name = 'else')
 {
     // Get [else] if it exists
     $prefix = CCS_Format::get_minus_prefix($shortcode_name);
     $else_name = $prefix . $else_name;
     $content_array = explode('[' . $else_name . ']', $content);
     $content = $content_array[0];
     if (count($content_array) > 1) {
         $else = $content_array[1];
     } else {
         $else = '';
     }
     return array('if' => $content, 'else' => $else);
 }
Ejemplo n.º 4
0
 function for_shortcode($atts, $content = null, $shortcode_name)
 {
     $args = array('each' => '', 'term' => '', 'terms' => '', 'orderby' => '', 'order' => '', 'count' => '', 'parent' => '', 'parents' => '', 'children' => '', 'current' => '', 'trim' => '', 'empty' => 'true', 'exclude' => '');
     extract(shortcode_atts($args, $atts, true));
     // Top parent loop
     if (!self::$state['is_for_loop']) {
         self::$state['is_for_loop'] = true;
         // Nested loop
     } else {
         $parent_term = self::$current_term[self::$index];
         // Same taxonomy as parent
         if ($each == 'child' && isset($parent_term['taxonomy'])) {
             $each = $parent_term['taxonomy'];
         }
         // Get parent term unless specified
         if (empty($parent) && isset($parent_term['id'])) {
             $parent = $parent_term['id'];
         }
         // Nest index
         self::$index++;
     }
     if ($each == 'tag') {
         $each = 'post_tag';
     }
     $out = '';
     $prefix = CCS_Format::get_minus_prefix($shortcode_name);
     // Get [else] block
     $if_else = CCS_If::get_if_else($content, $shortcode_name, 'for-else');
     $content = $if_else['if'];
     $else = $if_else['else'];
     // Get terms according to parameters
     // @todo Refactor - keep it DRY
     // @todo Consolidate with CCS_Content::get_taxonomies
     $query = array('orderby' => !empty($orderby) ? $orderby : 'name', 'order' => $order, 'number' => $count, 'parent' => $parents == 'true' ? 0 : '', 'hide_empty' => $empty == 'true' ? 0 : 1);
     $term_ids = array();
     if (!empty($terms)) {
         $term = $terms;
     }
     // Alias
     if (!empty($term)) {
         $terms = CCS_Format::explode_list($term);
         // Multiple values support
         foreach ($terms as $this_term) {
             if (is_numeric($this_term)) {
                 $term_ids[] = $this_term;
             } else {
                 /* Get term ID from slug */
                 $term_id = get_term_by('slug', $this_term, $each);
                 if (!empty($term_id)) {
                     $term_ids[] = $term_id->term_id;
                 }
             }
         }
         if (!empty($term_ids)) {
             $query['include'] = $term_ids;
         } else {
             // Nothing found
             // Return to parent loop
             if (self::$index > 0) {
                 self::$index--;
             } else {
                 self::$state['is_for_loop'] = false;
             }
             return do_ccs_shortcode($else);
         }
     }
     // Inside loop, or current is true
     if (CCS_Loop::$state['is_loop'] && $current != "false" || $current == "true") {
         if ($current == "true") {
             $post_id = get_the_ID();
         } else {
             $post_id = CCS_Loop::$state['current_post_id'];
         }
         // Inside [loop]
         $taxonomies = wp_get_post_terms($post_id, $each, $query);
         // Current and parent parameters together
         if (!empty($parent)) {
             if (is_numeric($parent)) {
                 $parent_term_id = $parent;
             } else {
                 // Get parent term ID from slug
                 $term = get_term_by('slug', $parent, $each);
                 if (!empty($term)) {
                     $parent_term_id = $term->term_id;
                 } else {
                     $parent_term_id = null;
                 }
             }
             if (!empty($parent_term_id)) {
                 // Filter out terms that do not have the specified parent
                 // TODO: Why not set this as query for wp_get_post_terms above..?
                 foreach ($taxonomies as $key => $term) {
                     // TODO: What about children parameter for all descendants..?
                     if ($term->parent != $parent_term_id) {
                         unset($taxonomies[$key]);
                     }
                 }
             }
         }
         // Not inside loop
     } else {
         if (empty($parent)) {
             $taxonomies = get_terms($each, $query);
             if (!empty($term) && $children == 'true') {
                 if (isset($query['include'])) {
                     unset($query['include']);
                 }
                 // Get descendants of each term
                 $new_taxonomies = $taxonomies;
                 foreach ($taxonomies as $term_object) {
                     $query['child_of'] = $term_object->term_id;
                     $new_terms = get_terms($each, $query);
                     if (!empty($new_terms)) {
                         $new_taxonomies += $new_terms;
                         foreach ($new_terms as $new_term) {
                             $term_ids[] = $new_term->term_id;
                         }
                     }
                 }
                 $taxonomies = $new_taxonomies;
             }
             // Get terms by parent
         } else {
             if (is_numeric($parent)) {
                 $parent_term_id = $parent;
             } else {
                 // Get parent term ID from slug
                 $term = get_term_by('slug', $parent, $each);
                 if (!empty($term)) {
                     $parent_term_id = $term->term_id;
                 } else {
                     $parent_term_id = null;
                 }
             }
             if (!empty($parent_term_id)) {
                 /* Get direct children */
                 if ($children !== 'true') {
                     // Direct children only
                     $query['parent'] = $parent_term_id;
                 } else {
                     // All descendants
                     $query['child_of'] = $parent_term_id;
                 }
                 $taxonomies = get_terms($each, $query);
             } else {
                 $taxonomies = null;
             }
             // No parent found
         }
     }
     if (count($term_ids) > 0) {
         $new_taxonomies = array();
         // Sort terms according to given ID order: get_terms doesn't do order by ID
         foreach ($term_ids as $term_id) {
             foreach ($taxonomies as $term_object) {
                 if ($term_object->term_id == $term_id) {
                     $new_taxonomies[] = $term_object;
                 }
             }
         }
         $taxonomies = $new_taxonomies;
     }
     // Array and not empty
     if (is_array($taxonomies) && count($taxonomies) > 0) {
         $each_term = array();
         $each_term['taxonomy'] = $each;
         // Taxonomy name
         $excludes = CCS_Format::explode_list($exclude);
         $index = 0;
         if (empty($count)) {
             $count = 9999;
         }
         // Show all
         foreach ($taxonomies as $term_object) {
             // Exclude IDs or slugs
             $condition = true;
             foreach ($excludes as $exclude) {
                 if (is_numeric($exclude)) {
                     // Exclude ID
                     if ($exclude == $term_object->term_id) {
                         $condition = false;
                     }
                 } else {
                     // Exclude slug
                     if ($exclude == $term_object->slug) {
                         $condition = false;
                     }
                 }
             }
             if ($condition && ++$index <= $count) {
                 $each_term['id'] = $term_object->term_id;
                 $each_term['name'] = $term_object->name;
                 $each_term['slug'] = $term_object->slug;
                 $each_term['description'] = $term_object->description;
                 $term_link = get_term_link($term_object);
                 if (is_wp_error($term_link)) {
                     $term_link = null;
                 }
                 $each_term['url'] = $term_link;
                 $each_term['link'] = '<a href="' . $each_term['url'] . '">' . $each_term['name'] . '</a>';
                 // Alias for backward compatibility
                 $each_term['name-link'] = $each_term['link'];
                 // Replace {TAGS}
                 // @todo Use a general-purpose function in CCS_Loop for replacing tags
                 $replaced_content = str_replace('{' . $prefix . 'TERM}', $each_term['slug'], $content);
                 $replaced_content = str_replace('{' . $prefix . 'TERM_ID}', $each_term['id'], $replaced_content);
                 $replaced_content = str_replace('{' . $prefix . 'TERM_NAME}', $each_term['name'], $replaced_content);
                 // Make term data available to [each]
                 self::$current_term[self::$index] = $each_term;
                 self::$state['for_count']++;
                 $out .= do_ccs_shortcode($replaced_content);
             }
         }
         // For each term
     } else {
         // No taxonomy found
         $out .= do_ccs_shortcode($else);
     }
     // Trim final output
     if (!empty($trim)) {
         if ($trim == 'true') {
             $trim = null;
         }
         $out = trim($out, " \t\n\r\v," . $trim);
     }
     // Return to parent loop
     if (self::$index > 0) {
         self::$index--;
     } else {
         self::$state['is_for_loop'] = false;
     }
     self::$state['for_count'] = 0;
     return $out;
 }