context['generateblocks/loopItem'] ?? null; if ( ! $loop_item ) { return $id; } // Look for the ID or id keys and return the original $id if none can be found. if ( is_array( $loop_item ) ) { return $loop_item['ID'] ?? $loop_item['id'] ?? $id; } elseif ( is_object( $loop_item ) ) { return $loop_item->ID ?? $loop_item->id ?? $id; } return $id; } /** * Set the query data for certain types. * * @param array $query_data The current query data. * @param string $query_type The type of query. * @param array $attributes An array of block attributes. * @param WP_Block $block The block instance. * @param int $page The page number. * * @return array An array of query data. */ public function set_query_data( $query_data, $query_type, $attributes, $block, $page ) { $pro_types = [ self::TYPE_POST_META, self::TYPE_OPTION, ]; if ( ! in_array( $query_type, $pro_types, true ) ) { return $query_data; } $query = $attributes['query'] ?? []; $id = $query['meta_key_id'] ?? ''; $meta_key = $query['meta_key'] ?? ''; if ( 'current' === $id || ! $id ) { $id = get_the_ID(); } if ( self::TYPE_POST_META === $query_type ) { $value = GenerateBlocks_Meta_Handler::get_post_meta( $id, $meta_key, false ); } elseif ( self::TYPE_OPTION === $query_type ) { $value = GenerateBlocks_Meta_Handler::get_option( $meta_key, false ); } $data = is_array( $value ) ? $value : []; // Handle pagination. $posts_per_page = (int) ( $query['posts_per_page'] ?? get_option( 'posts_per_page' ) ); $offset = isset( $query['offset'] ) && is_numeric( $query['offset'] ) ? $query['offset'] : 0; // Get the total number of items less the user specified offset. $data = array_slice( $data, $offset ); $max_pages = $posts_per_page > 0 ? (int) ceil( count( $data ) / $posts_per_page ) : 1; if ( 0 === $posts_per_page ) { $max_pages = 0; } return [ 'data' => $data, 'no_results' => empty( $data ), 'args' => $query, 'max_num_pages' => $max_pages, ]; } /** * Exclude current post from the query. * * @param array $query_args The query arguments. * @param array $attributes The block attributes. * @param WP_Block|null $block The block instance. * @param array $current The current post data. * * @return array The query arguments without current post. */ public function exclude_current_post( $query_args, $attributes, $block, $current ) { $current_post_id = $current['post_id'] ?? get_the_ID(); return self::add_current_post( $query_args, $current_post_id, 'post__not_in' ); } /** * Include current parent post from the query. * * @param array $query_args The query arguments. * @param array $attributes The block attributes. * @param WP_Block|null $block The block instance. * @param array $current The current post data. * * @return array The query arguments without current post. */ public function include_current_parent( $query_args, $attributes, $block, $current ) { $current_post_id = $current['post_id'] ?? get_the_ID(); return self::add_current_post( $query_args, $current_post_id, 'post_parent__in' ); } /** * Exclude current parent post from the query. * * @param array $query_args The query arguments. * @param array $attributes The block attributes. * @param WP_Block|null $block The block instance. * @param array $current The current post data. * * @return array The query arguments without current post. */ public function exclude_current_parent( $query_args, $attributes, $block, $current ) { $current_post_id = $current['post_id'] ?? get_the_ID(); return self::add_current_post( $query_args, $current_post_id, 'post_parent__not_in' ); } /** * Adds the current post ID to the query args. * * @param array $query_args The query arguments. * @param int $current_post_id The current post ID. * @param string $key The key to check. * * @return array The query arguments without current post. */ public static function add_current_post( $query_args, $current_post_id, $key ) { if ( isset( $query_args[ $key ] ) && in_array( 'current', $query_args[ $key ] ) ) { if ( ! in_array( $current_post_id, $query_args[ $key ] ) ) { $query_args[ $key ][] = $current_post_id; } $exclude_current_index = array_search( 'current', $query_args[ $key ] ); array_splice( $query_args[ $key ], $exclude_current_index, 1 ); if ( 'post__not_in' === $key ) { // This is to avoid current post being dynamically added to post__in which will show him in the result set. if ( isset( $query_args['post__in'] ) && in_array( $current_post_id, $query_args['post__in'] ) ) { $current_post_index = array_search( $current_post_id, $query_args['post__in'] ); array_splice( $query_args['post__in'], $current_post_index, 1 ); } } } return $query_args; } /** * Include posts of current post author to the query. * * @since 1.3.0 * @param array $query_args The query arguments. * * @return array The query arguments. */ public function include_current_author( $query_args ) { return self::add_current_author( $query_args, 'author__in' ); } /** * Exclude posts of current post author to the query. * * @since 1.3.0 * @param array $query_args The query arguments. * * @return array The query arguments. */ public function exclude_current_author( $query_args ) { return self::add_current_author( $query_args, 'author__not_in' ); } /** * Include current author to a query argument. * * @since 1.3.0 * @param array $query_args The query arguments. * @param string $key The query argument key. * * @return array The query arguments. */ public function add_current_author( $query_args, $key ) { if ( isset( $query_args[ $key ] ) && in_array( 'current', $query_args[ $key ] ) ) { $current_post_author_index = array_search( 'current', $query_args[ $key ] ); array_splice( $query_args[ $key ], $current_post_author_index, 1 ); if ( ! in_array( get_the_author_meta( 'ID' ), $query_args[ $key ] ) ) { $query_args[ $key ][] = get_the_author_meta( 'ID' ); } } return $query_args; } /** * Process the "current" post terms. * * @param array $query_args The query arguments. * @param array $attributes The block attributes. * @param WP_Block|null $block The block instance. * @param array $current The current post data. * * @return array The query arguments. */ public function current_post_terms( $query_args, $attributes, $block, $current ) { if ( $current['post_id'] && isset( $query_args['tax_query'] ) ) { $query_args['tax_query'] = array_map( function( $tax ) use ( $current ) { if ( ! isset( $tax['terms'] ) ) { return $tax; } if ( in_array( 'current', $tax['terms'], true ) ) { $registered_taxonomies = get_object_taxonomies( get_post_type( $current['post_id'] ) ); if ( in_array( $tax['taxonomy'], $registered_taxonomies, true ) ) { $related_terms = wp_get_object_terms( $current['post_id'], $tax['taxonomy'], array( 'fields' => 'ids' ) ); $tax['terms'] = array_merge( $tax['terms'], $related_terms ); } $current_terms_index = array_search( 'current', $tax['terms'] ); array_splice( $tax['terms'], $current_terms_index, 1 ); } return $tax; }, $query_args['tax_query'] ); } return $query_args; } } GenerateBlocks_Pro_Block_Query::get_instance()->init();