class-related-listings.php
<?php
/**
* Related listings.
*
* @package HivePress\Blocks
*/
namespace HivePress\Blocks;
use HivePress\Helpers as hp;
use HivePress\Models;
// Exit if accessed directly.
defined( 'ABSPATH' ) || exit;
/**
* Renders related listings.
*/
class Related_Listings extends Listings {
/**
* Class initializer.
*
* @param array $meta Class meta values.
*/
public static function init( $meta = [] ) {
$meta = hp\merge_arrays(
[
'label' => null,
],
$meta
);
parent::init( $meta );
}
/**
* Class constructor.
*
* @param array $args Block arguments.
*/
public function __construct( $args = [] ) {
$args = hp\merge_arrays(
[
'number' => get_option( 'hp_listings_related_per_page' ),
'order' => 'random',
],
$args
);
parent::__construct( $args );
}
/**
* Bootstraps block properties.
*/
protected function boot() {
// Set query.
$query = Models\Listing::query()->filter(
[
'status' => 'publish',
]
)->order( 'random' )
->limit( $this->number );
// Get listing.
$listing = $this->get_context( 'listing' );
if ( hp\is_class_instance( $listing, '\HivePress\Models\Listing' ) ) {
// Exclude listing.
$query->filter( [ 'id__not_in' => [ $listing->get_id() ] ] );
// Set categories.
if ( $listing->get_categories__id() ) {
$query->filter( [ 'categories__in' => $listing->get_categories__id() ] );
}
/**
* Fires when related models are being queried. The dynamic part of the hook refers to the model name (e.g. `listing`).
*
* @hook hivepress/v1/models/{model_name}/relate
* @param {object} $query Related query.
* @param {object} $object Model object.
*/
do_action( 'hivepress/v1/models/listing/relate', $query, $listing );
}
// Set context.
$this->context['listing_query'] = $query;
parent::boot();
}
}