Forked from yankiara/oxygen-repeater-dynamic-query.php
Created
July 10, 2021 04:25
-
-
Save jevgen/e486a0514e6669e292467e1a1df3e7aa to your computer and use it in GitHub Desktop.
Use dynamic queries with Oxygen's repeater
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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' ); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment