https://github.com/PressForward/pressforward
Raw File
Tip revision: 63293755f5002bc54b8bda3869ce7a7b52911e8c authored by Aram Zucker-Scharff on 11 December 2017, 21:50:54 UTC
Merge pull request #981 from PressForward/4.4.x
Tip revision: 6329375
PF_Loops.php
<?php
namespace PressForward\Controllers;

class PF_Loops {

	public function __construct() {

	}

	// This function feeds items to our display feed function pf_reader_builder.
	// It is just taking our database of rssarchival items and putting them into a
	// format that the builder understands.
	/**
	 * Fetch a collection of feed items and format for use in the reader.
	 *
	 * @param  int    $pageTop      First item to display on the page. Note that it
	 *                              is decremented by 1, so should not be 0.
	 * @param  int    $pagefull     Number of items to show per page.
	 * @param  int    $fromUnixTime Feed items will only be returned when their
	 *                              publish date is later than this. Must be in
	 *                              UNIX format.
	 * @param  bool   $limitless    True to show all feed items. Skips pagination,
	 *                              but obeys $fromUnixTime. Default: false.
	 * @param  string $limit        Limit to feed items with certain relationships
	 *                              set. Note that relationships are relative to
	 *                              logged-in user. (starred|nominated)
	 * @return array
	 */
	public static function archive_feed_to_display( $args = array() ) {

		// Backward compatibility.
		$func_args = func_get_args();
		if ( ! is_array( $func_args[0] ) || 1 < count( $func_args ) ) {
			$args = array(
				'start' => $func_args[0],
			);

			if ( isset( $func_args[1] ) ) {
				$args['posts_per_page'] = $func_args[1];
			}

			if ( isset( $func_args[2] ) ) {
				$args['from_unix_time'] = $func_args[2];
			}

			if ( isset( $func_args[3] ) ) {
				$args['no_limit'] = $func_args[3];
			}

			if ( isset( $func_args[4] ) ) {
				$args['relationship'] = $func_args[4];
			}
		} else {
			$args = func_get_arg( 0 );
		}

		// Make sure default values are set.
		$r = array_merge( array(
			'start'            => 0,
			'posts_per_page'   => 20,
			'from_unix_time'   => 0,
			'no_limit'         => false,
			'relationship'     => false,
			'search_terms'     => '',
			'exclude_archived' => false,
		), $args );

		if ( empty( $r['from_unix_time'] ) || ( $r['from_unix_time'] < 100 ) ) {
			$r['from_unix_time'] = 0;
		}

		$r['start'] = $r['start'] - 1;

		if ( ! $r['posts_per_page'] ) {
			$user_obj = wp_get_current_user();
			$user_id = $user_obj->ID;
			$r['posts_per_page'] = get_user_option( 'pf_pagefull', $user_id );
			if ( empty( $r['posts_per_page'] ) ) {
				$r['posts_per_page'] = 20;
			}
		}

		$post_args = array(
			'post_type' => pf_feed_item_post_type(),

			// Ordering by 'sortable_item_date' > 0.
			'meta_key'     => 'sortable_item_date',
			'meta_value'   => $r['from_unix_time'],
			'meta_type'    => 'SIGNED',
			'meta_compare' => '>',
			'orderby'      => 'meta_value',
			'order'        => 'DESC',

			// Pagination
			'posts_per_page' => $r['posts_per_page'],
			'offset'         => $r['start'],
		);

		if ( $r['no_limit'] ) {
			$post_args['posts_per_page'] = -1;
		}

		if ( ! empty( $r['relationship'] ) ) {
			switch ( $r['relationship'] ) {
				case 'starred' :
					$rel_items = pf_get_relationships_for_user( 'star', get_current_user_id() );
					break;

				case 'nominated' :
					$rel_items = pf_get_relationships_for_user( 'nominate', get_current_user_id() );
					break;
			}

			if ( ! empty( $rel_items ) ) {
				$post_args['post__in'] = wp_list_pluck( $rel_items, 'item_id' );
			}
		}

		if ( ! empty( $r['reveal'] ) ) {
			switch ( $r['reveal'] ) {
				case 'no_hidden' :
					$rel_items = pf_get_relationships_for_user( 'archive', get_current_user_id() );
					break;

				case 'unread' :
					$rel_not_items = pf_get_relationships_for_user( 'read', get_current_user_id() );
					break;

				case 'drafted' :
					$drafted_items = pf_get_drafted_items();
					if ( empty( $drafted_items ) ) {
						$drafted_items = array( 0 );
					}
					break;
			}

			if ( ! empty( $rel_items ) ) {
				$posts_in = wp_list_pluck( $rel_items, 'item_id' );
				if ( ! empty( $post_args['post__in'] ) ) {
					$post_args['post__in'] = array_merge( $post_args['post__in'], $posts_in );
				} else {
					$post_args['post__in'] = $posts_in;
				}
			}

			if ( ! empty( $rel_not_items ) ) {
				$posts_not_in = wp_list_pluck( $rel_not_items, 'item_id' );
				if ( ! empty( $post_args['post__not_in'] ) ) {
					$post_args['post__not_in'] = array_merge( $post_args['post__not_in'], $posts_not_in );
				} else {
					$post_args['post__not_in'] = $posts_not_in;
				}
			}

			if ( isset( $drafted_items ) ) {
				// Intersect to match only those items that have drafts.
				if ( ! empty( $post_args['post__in'] ) && array( 0 ) != $drafted_items ) {
					$post_args['post__in'] = array_intersect( $post_args['post__in'], $drafted_items );
				} else {
					$post_args['post__in'] = $drafted_items;
				}
			}
		}

		if ( ! empty( $r['exclude_archived'] ) ) {
			$archived = pf_get_relationships_for_user( 'archive', get_current_user_id() );
			$post_args['post__not_in'] = wp_list_pluck( $archived, 'item_id' );
		}

		if ( ! empty( $r['search_terms'] ) ) {
			/*
    		 * Quote so as to get only exact matches. This is for
    		 * backward compatibility - might want to remove it for
    		 * a more flexible search.
    		 */
			$post_args['s'] = '"' . $r['search_terms'] . '"';
		}

		$post_args['post_status'] = 'publish';
		// die();
		if ( isset( $_GET['feed'] ) ) {
			$post_args['post_parent'] = $_GET['feed'];
		} elseif ( isset( $_GET['folder'] ) ) {
			$parents_in_folder = new \WP_Query( array(
				'post_type' => pressforward( 'schema.feeds' )->post_type,
				'fields' => 'ids',
				'update_post_term_cache' => false,
				'update_post_meta_cache' => false,
				'tax_query' => array(
				array(
						'taxonomy' => pressforward( 'schema.feeds' )->tag_taxonomy,
						'field'	=> 'term_id',
						'terms'	=> $_GET['folder'],
					),
				),
			) );
			// var_dump('<pre>'); var_dump($parents_in_folder); die();
			$post_args['post_parent__in'] = $parents_in_folder->posts;
			if ( empty( $post_args['post_parent__in'] ) ) {
				return array();
			}
		}

		$feed_items = new \WP_Query( $post_args );

		$feedObject = array();
		$c = 0;

		foreach ( $feed_items->posts as $post ) {
			$post_id = $post->ID;

			$item_id            = pressforward( 'controller.metas' )->get_post_pf_meta( $post_id, 'item_id', true );
			$source_title       = pressforward( 'controller.metas' )->get_post_pf_meta( $post_id, 'source_title', true );
			$item_date          = pressforward( 'controller.metas' )->get_post_pf_meta( $post_id, 'item_date', true );
			$item_author        = pressforward( 'controller.metas' )->get_post_pf_meta( $post_id, 'item_author', true );
			$item_link          = pressforward( 'controller.metas' )->get_post_pf_meta( $post_id, 'item_link', true );
			$item_feat_img      = pressforward( 'controller.metas' )->get_post_pf_meta( $post_id, 'item_feat_img', true );
			$item_wp_date       = pressforward( 'controller.metas' )->get_post_pf_meta( $post_id, 'item_wp_date', true );
			$item_tags          = pressforward( 'controller.metas' )->get_post_pf_meta( $post_id, 'item_tags', true );
			$source_repeat      = pressforward( 'controller.metas' )->get_post_pf_meta( $post_id, 'source_repeat', true );
			$readable_status    = pressforward( 'controller.metas' )->get_post_pf_meta( $post_id, 'readable_status', true );

			$contentObj   = pressforward( 'library.htmlchecker' );
			$item_content = $contentObj->closetags( $post->post_content );

			$feedObject[ 'rss_archive_' . $c ] = pf_feed_object(
				$post->post_title,
				$source_title,
				$item_date,
				$item_author,
				$item_content,
				$item_link,
				$item_feat_img,
				$item_id,
				$item_wp_date,
				$item_tags,
				// Manual ISO 8601 date for pre-PHP5 systems.
				date( 'o-m-d\TH:i:sO', strtotime( $post->post_date ) ),
				$source_repeat,
				$post_id,
				$readable_status
			);

			$c++;
		}

		return $feedObject;
	}


}
back to top