Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save MDylan/e75623c49b1d7e6d167312f11e3da29e to your computer and use it in GitHub Desktop.
Save MDylan/e75623c49b1d7e6d167312f11e3da29e to your computer and use it in GitHub Desktop.
Use dynamic queries with Oxygen's repeater
/* I'll put here different examples of dynamic query for Oxygen repeater :
* - Use one of the following repeater_dynamic_query definitions
* in code block just BEFORE the repeater
* - Set the repeater custom query settings : post type, number of posts, order...
* - Add the remove_action in a code block AFTER the repeater
*/
/****************************************************************************************************
* Display related posts for any CPT with taxonomy:
* - Filter query to prevent altering queries inside the repeater items,
* - Retrieve post category slug : I have only one for each post, so I just take first element
* (You might need to add error tests, of course, if you don't accept empty results,
* for instance if you forgot to set post category.)
* - Set tax_query arg with category slug
* - Set random order
* - Exclude current post
* - Deactivate pagination
*/
/* Code block just BEFORE the repeater */
<?php
function repeater_dynamic_query( $query ) {
global $post;
if ( $query->query['post_type'][0] == 'post' ) {
$cat = wp_get_post_terms( $post->ID , 'category', array( 'fields' => 'slugs' ) )[0];
$query->set( 'tax_query', array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $cat,
'include_children' => false
)
) );
$query->set( 'orderby', 'rand' );
$query->set( 'post__not_in', array($post->ID) );
$query->set( 'no_found_rows', true );
}
}
add_action( 'pre_get_posts', 'repeater_dynamic_query' );
?>
/*
* REPEATER: use custom query and set post type to "post" or any cpt slug,
* number of posts per page as you wish,
* and replace "category" by your cpt taxonomy slug if needed
*/
/* Code block just AFTER the repeater */
<?php
remove_action( 'pre_get_posts', 'repeater_dynamic_query' );
?>
/****************************************************************************************************
* Display only sticky posts with repeater:
* - Get only sticky posts
* - Deactivate pagination
*/
/* Code block just BEFORE the repeater */
<?php
function repeater_dynamic_query( $query ) {
if ( $query->query['post_type'][0] == 'post' ) {
$query->set( 'post__in', get_option( 'sticky_posts' ) );
$query->set( 'no_found_rows', true );
}
}
add_action( 'pre_get_posts', 'repeater_dynamic_query' );
?>
/*
* REPEATER: use custom query and set post type to "post",
* number of posts per page and order as you wish,
* AND DO NOT UNCHECK "Ignore sticky posts"
*/
/* Code block just AFTER the repeater */
<?php
remove_action( 'pre_get_posts', 'repeater_dynamic_query' );
?>
/****************************************************************************************************
* Display posts by year:
*/
/* Code block just BEFORE the repeater */
<?php
function custom_query_by_year( $query ) {
if ( $query->query['post_type'][0] == 'YOUR_POST_SLUG' ) {
$query->set('date_query', [ [ 'year' => '2021' ] ] );
}
}
add_action( 'pre_get_posts', 'custom_query_by_year' );
?>
/*
* REPEATER
*/
/* Code block just AFTER the repeater */
<?php
remove_action( 'pre_get_posts', 'custom_query_by_year' );
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment