示例#1
0
 public static function loop_relationship_field($atts, $content)
 {
     if (!self::is_acf_active()) {
         return;
     }
     extract(shortcode_atts(array('field' => '', 'subfield' => '', 'sub' => '', 'trim' => '', 'option' => ''), $atts));
     $output = array();
     if (empty($field) && isset($atts[0])) {
         $field = $atts[0];
     }
     // If in repeater or flexible content, get subfield by default
     if (self::$state['is_repeater_or_flex_loop']) {
         if (empty($subfield)) {
             $subfield = $field;
             $field = null;
         }
     }
     // Support getting field from option page
     $option = $option == 'true' ? 'option' : false;
     if (!empty($field)) {
         $posts = get_field($field, $option);
     } elseif (!empty($subfield)) {
         $posts = get_sub_field($subfield);
         // Gets option from the_row()
     } else {
         return null;
     }
     if ($posts) {
         self::$state['is_relationship_loop'] = true;
         $index_now = 0;
         if (!is_array($posts)) {
             $posts = array($posts);
             // Single post
         }
         foreach ($posts as $post) {
             $index_now++;
             self::$state['relationship_id'] = $post->ID;
             $output[] = str_replace('{COUNT}', $index_now, do_ccs_shortcode($content));
         }
     }
     self::$state['is_relationship_loop'] = false;
     $output = implode('', $output);
     if (!empty($trim)) {
         $output = CCS_Format::trim($output, $trim);
     }
     return $output;
 }
示例#2
0
 function loop_related_posts($atts, $content)
 {
     global $post;
     $outputs = array();
     $current_count = 0;
     if (CCS_Loop::$state['is_loop']) {
         $post_id = CCS_Loop::$state['current_post_id'];
         $post_type = do_ccs_shortcode('[field post-type]', false);
     } elseif (!empty($post)) {
         $post_id = $post->ID;
         $post_type = $post->post_type;
     } else {
         $post_id = 0;
         $post_type = 'any';
     }
     extract(shortcode_atts(array('type' => '', 'taxonomy' => 'category', 'field' => '', 'taxonomy_field' => '', 'value' => '', 'subfield' => '', 'count' => '', 'children' => '', 'order' => 'DESC', 'orderby' => 'date', 'relation' => 'or', 'operator' => 'in', 'trim' => ''), $atts));
     if (!empty($type)) {
         $post_type = CCS_Loop::explode_list($type);
     }
     if (empty($field) && isset($atts[0])) {
         $field = $atts[0];
     }
     if (!empty($taxonomy_field)) {
         $terms = do_ccs_shortcode('[field ' . $taxonomy_field . ']', false);
         $terms = CCS_Loop::explode_list($terms);
         if (empty($terms) || count($terms) == 0) {
             return;
         }
         $taxonomies = array();
         $term_objects = array();
         foreach ($terms as $term) {
             $term = self::get_term_by_id($term);
             $tax = $term->taxonomy;
             if (!in_array($tax, $taxonomies)) {
                 $taxonomies[] = $term->taxonomy;
             }
             $term_objects[] = $term;
         }
         $taxonomy = implode(',', $taxonomies);
         $terms = $term_objects;
     }
     /*---------------------------------------------
      *
      * ACF relationship field
      *
      */
     if ((!empty($field) || !empty($subfield)) && empty($value)) {
         if (class_exists('CCS_To_ACF') && CCS_To_ACF::is_acf_active()) {
             return CCS_To_ACF::loop_relationship_field($atts, $content);
         }
     }
     /*---------------------------------------------
      *
      * Related posts by taxonomy
      *
      */
     if (empty($count)) {
         $count = 99999;
     }
     // Hypothetical maximum number of posts
     if (!empty($taxonomy)) {
         self::$state['is_related_posts_loop'] = true;
         // Support multiple taxonomies
         $taxonomies = CCS_Loop::explode_list($taxonomy);
         $relation = strtoupper($relation);
         $tax_count = 0;
         $query = array('post_type' => $post_type, 'posts_per_page' => -1, 'order' => $order, 'orderby' => $orderby, 'tax_query' => array());
         $target_terms = array();
         foreach ($taxonomies as $current_taxonomy) {
             if ($current_taxonomy == 'tag') {
                 $current_taxonomy = 'post_tag';
             }
             // Get current post's taxonomy terms - unless given
             if (!isset($terms)) {
                 $term_objects = CCS_Content::get_the_terms_silently($post_id, $current_taxonomy);
             } else {
                 $term_objects = $terms;
             }
             if (!is_array($term_objects) || empty($term_objects)) {
                 continue;
             }
             foreach ($term_objects as $term) {
                 $target_terms[$current_taxonomy][] = $term->term_id;
             }
             if (empty($target_terms[$current_taxonomy])) {
                 continue;
             }
             if ($tax_count == 1) {
                 $query['tax_query']['relation'] = $relation;
             }
             $query['tax_query'][] = array('taxonomy' => $current_taxonomy, 'field' => 'id', 'terms' => $target_terms[$current_taxonomy], 'operator' => strtoupper($operator), 'include_children' => $children == 'true');
             $tax_count++;
         }
         $terms = $target_terms;
         // print_r($query); echo '<br><br>';
         $posts = new WP_Query($query);
         if ($posts->have_posts()) {
             while ($posts->have_posts()) {
                 // Set up post data
                 $posts->the_post();
                 // Skip current post
                 if ($post->ID != $post_id) {
                     // Manually filter out terms..
                     // For some reason, WP_Query is returning more than we need
                     $condition = false;
                     $tax_count = 0;
                     foreach ($taxonomies as $current_taxonomy) {
                         if ($current_taxonomy == 'tag') {
                             $current_taxonomy = 'post_tag';
                         }
                         // Include child terms
                         if ($children == 'true' && isset($terms[$current_taxonomy])) {
                             foreach ($terms[$current_taxonomy] as $this_term) {
                                 $child_terms = get_term_children($this_term, $current_taxonomy);
                                 if (!empty($child_terms)) {
                                     foreach ($child_terms as $child_term) {
                                         if (!in_array($child_term, $terms[$current_taxonomy])) {
                                             $terms[$current_taxonomy][] = $child_term;
                                         }
                                     }
                                 }
                             }
                         }
                         if (isset($terms[$current_taxonomy])) {
                             $tax_count++;
                             if ($relation == 'AND') {
                                 if (has_term($terms[$current_taxonomy], $current_taxonomy)) {
                                     if ($condition || $tax_count == 1) {
                                         $condition = true;
                                     }
                                 }
                             } else {
                                 if (has_term($terms[$current_taxonomy], $current_taxonomy)) {
                                     $condition = true;
                                 }
                             }
                         }
                     }
                     if ($condition) {
                         // OK, post fits the criteria
                         self::$state['current_related_post_id'] = $post->ID;
                         $current_count++;
                         if ($current_count <= $count) {
                             $outputs[] = do_ccs_shortcode($content);
                         }
                     }
                 }
             }
         }
         wp_reset_postdata();
         self::$state['is_related_posts_loop'] = false;
     }
     $out = implode('', $outputs);
     if (!empty($trim)) {
         $out = CCS_Format::trim($out, $trim);
     }
     return $out;
 }
示例#3
0
文件: loop.php 项目: surreal8/wptheme
 public static function process_results($results)
 {
     $parameters = self::$state['parameters'];
     if (!is_array($results)) {
         $results = array($results);
     }
     $results = apply_filters('ccs_loop_all_results', $results);
     $result = apply_filters('ccs_loop_preprocess_combined_result', implode('', $results));
     /*---------------------------------------------
      *
      * Process the combined result
      *
      */
     /*---------------------------------------------
      *
      * Strip tags
      *
      */
     if (!empty($parameters['strip'])) {
         $strip_tags = $parameters['strip'];
         if ($strip_tags == 'true') {
             $result = wp_kses($result, array());
         } else {
             // Allow certain tags
             $result = strip_tags(html_entity_decode($result), $strip_tags);
         }
     }
     /*---------------------------------------------
      *
      * Trim
      *
      */
     if (!empty($parameters['trim'])) {
         $trim = $parameters['trim'];
         if (empty($parameters['columns']) && $parameters['list'] != 'true') {
             $result = CCS_Format::trim($result, $trim);
         } else {
             // Trim each item for columns or list
             $new_results = array();
             foreach ($results as $result) {
                 $new_results[] = CCS_Format::trim($result, $trim);
             }
             $results = $new_results;
         }
     }
     /*---------------------------------------------
      *
      * Escape/unescape HTML
      *
      */
     if ($parameters['escape'] == 'true') {
         $new_results = array();
         foreach ($results as $result) {
             $new_results[] = esc_html($result);
         }
         $results = $new_results;
     }
     if ($parameters['unescape'] == 'true') {
         $new_results = array();
         foreach ($results as $result) {
             $new_results[] = htmlspecialchars_decode($result);
         }
         $results = $new_results;
     }
     /*---------------------------------------------
      *
      * Finally, columns or list
      *
      */
     if (!empty($parameters['columns'])) {
         $result = self::render_columns($results, $parameters['columns'], $parameters['pad'], $parameters['between']);
     } elseif (!empty($parameters['list'])) {
         // Wrap each list item
         $new_results = null;
         $item_tag = !empty($parameters['item']) ? $parameters['item'] : 'li';
         $item_class = !empty($parameters['item_class']) ? ' class="' . $parameters['item_class'] . '"' : null;
         $item_style = !empty($parameters['item_style']) ? ' style="' . $parameters['item_style'] . '"' : null;
         $list_tag = $parameters['list'] == 'true' ? 'ul' : $parameters['list'];
         $list_class = !empty($parameters['list_class']) ? ' class="' . $parameters['list_class'] . '"' : null;
         $list_style = !empty($parameters['list_style']) ? ' style="' . $parameters['list_style'] . '"' : null;
         $parameters['item_count'] = count($results);
         foreach ($results as $result) {
             $item = '<' . $item_tag . $item_class . $item_style . '>' . $result . '</' . $item_tag . '>';
             if (!empty($parameters['paginate'])) {
                 $item = '<' . $list_tag . $list_class . $list_style . '>' . $item . '</' . $list_tag . '>';
             }
             $new_results .= apply_filters('ccs_loop_each_item', $item, $parameters);
         }
         if (empty($parameters['paginate'])) {
             $result = '<' . $list_tag . $list_class . $list_style . '>' . $new_results . '</' . $list_tag . '>';
         } else {
             $result = $new_results;
         }
     }
     /*---------------------------------------------
      *
      * Cache the final result
      *
      */
     if (self::$state['do_cache'] == 'true') {
         CCS_Cache::set_transient(self::$state['cache_name'], $result, $parameters['expire']);
     }
     return apply_filters('ccs_loop_final_result', $result, $parameters);
 }