Source: includes/frontend/class-jobs-directory.php

<?php
namespace jb\frontend;

use WP_Error;
use WP_Query;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

if ( ! class_exists( 'jb\frontend\Jobs_Directory' ) ) {

	/**
	 * Class Jobs_Directory
	 *
	 * @package jb\frontend
	 */
	class Jobs_Directory {

		/**
		 * @var array
		 *
		 * @since 1.0
		 */
		public $filters = array();

		/**
		 * @var array
		 *
		 * @since 1.0
		 */
		public $filter_types = array();

		/**
		 * Jobs_Directory constructor.
		 */
		public function __construct() {
			add_action( 'init', array( $this, 'init_variables' ) );
			if ( empty( $this->filter_types ) || empty( $this->filters ) ) {
				$this->init_variables();
			}

			add_action( 'pre_get_posts', array( &$this, 'jb_exclude_jobs' ), 99, 1 );
		}

		/**
		 * Init jobs directory variables
		 *
		 * @since 1.0
		 */
		public function init_variables() {
			/**
			 * Filters the jobs list filters.
			 *
			 * Note: The filters structure is 'filter_key' => 'filter_title'.
			 *
			 * @since 1.0
			 * @hook jb_jobs_directory_filters
			 *
			 * @param {array} $filters Jobs list filters.
			 *
			 * @return {array} Jobs list filters.
			 */
			$this->filters = apply_filters(
				'jb_jobs_directory_filters',
				array(
					'job_type' => __( 'Job Type', 'jobboardwp' ),
					'company'  => __( 'Company', 'jobboardwp' ),
				)
			);

			/**
			 * Filters the jobs list filters' types.
			 *
			 * Note: The filters structure is 'filter_key' => 'filter_type'.
			 *
			 * @since 1.0
			 * @hook jb_jobs_directory_filter_types
			 *
			 * @param {array} $filter_types Jobs list filters' types.
			 *
			 * @return {array} Jobs list filters' types.
			 */
			$this->filter_types = apply_filters(
				'jb_jobs_directory_filter_types',
				array(
					'job_type' => 'select',
					'company'  => 'select',
				)
			);
		}

		/**
		 * Hide filled and expired jobs from archive pages
		 *
		 * @param WP_Query $query
		 */
		public function jb_exclude_jobs( $query ) {
			if ( $query->is_main_query() ) {
				$exclude_posts = array();
				$hide_filled   = JB()->options()->get( 'jobs-list-hide-filled' );
				if ( ! empty( $hide_filled ) ) {
					if ( is_user_logged_in() ) {
						$employer = get_current_user_id();

						$args = array(
							'author__not_in' => array( $employer ),
							'post_type'      => 'jb-job',
							'post_status'    => array( 'publish', 'draft', 'pending', 'jb-preview', 'jb-expired' ),
							'posts_per_page' => -1,
							'meta_query'     => array(
								'relation' => 'OR',
								array(
									'key'   => 'jb-is-filled',
									'value' => true,
								),
								array(
									'key'   => 'jb-is-filled',
									'value' => 1,
								),
							),
							'fields'         => 'ids',
						);
					} else {
						$args = array(
							'post_type'      => 'jb-job',
							'post_status'    => array( 'publish', 'draft', 'pending', 'jb-preview', 'jb-expired' ),
							'posts_per_page' => -1,
							'meta_query'     => array(
								'relation' => 'OR',
								array(
									'key'   => 'jb-is-filled',
									'value' => true,
								),
								array(
									'key'   => 'jb-is-filled',
									'value' => 1,
								),
							),
							'fields'         => 'ids',
						);
					}
					$filled_ids    = get_posts( $args );
					$exclude_posts = array_merge( $exclude_posts, $filled_ids );
				}

				$hide_expired = JB()->options()->get( 'jobs-list-hide-expired' );
				if ( ! empty( $hide_expired ) ) {
					$expired_ids   = get_posts(
						array(
							'post_type'      => 'jb-job',
							'post_status'    => 'jb-expired',
							'fields'         => 'ids',
							'posts_per_page' => - 1,
						)
					);
					$exclude_posts = array_merge( $exclude_posts, $expired_ids );
				}

				$post__not_in = $query->get( 'post__not_in', array() );
				$query->set( 'post__not_in', array_merge( wp_parse_id_list( $post__not_in ), $exclude_posts ) );
			}
		}
	}
}