So the problem with this was solved, but it became even trickier. So what I wanted to add was a custom Taxonomy to be displayed for each item, as well as filtering by a custom field value.
So the first problem was getting the custom taxonomy to relate to the custom post type. Much of the documentation online seems to overcomplicate this and a lot of it doesn’t quite work for some reason (possibly my misunderstanding of someone else’s work). So I added this to my functions.php file
function create_offer_tax() { register_taxonomy( 'offer_tax', 'special_offers', array( 'label' => __( 'Offer Category' ), 'rewrite' => array( 'slug' => 'offer_tax' ), 'hierarchical' => true, 'update_count_callback' => '_update_post_term_count', ) ); }
And I added this to my custom post array, also in the functions file
'taxonomies' => array('offer_tax'),
Next up, how to call it in to the page… another tricky one, and using get_categories doesn’t work, because it’s a custom Taxonomy. So within my get_posts I had to define another variable, which is called from the custom taxonomy, and for each one echo out name within an li, all wrapped in a ul, which looks like this:
$offer_terms = wp_get_object_terms( $offer->ID, 'offer_tax' ); if ( ! empty( $offer_terms ) ) { if ( ! is_wp_error( $offer_terms ) ) { echo '<ul class="offer_categories">'; foreach( $offer_terms as $term ) { echo '<li>' . esc_html( $term->name ) . '</li>'; } echo '</ul>'; } }
And that all sits within the foreach of the get_posts.
I also had to update my get_posts array to check whether two demands are met – firstly is the custom field ‘applies_to’ the same as the current page ID, and is the custom field ‘featured’ false, then display the relevant posts.
So that looks like this:
$special_offers = get_posts(array( 'numberposts' => -1, 'post_type' => 'special_offers', 'post_status' => 'publish', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'applies_to', // name of custom field 'value' => '"' . get_the_ID() . '"', 'compare' => 'LIKE' ), array( 'key' => 'featured', 'value' => '0', 'compare' => 'LIKE' ) ) ));
So my final code looks like this:
<?php $special_offers = get_posts(array( 'numberposts' => -1, 'post_type' => 'special_offers', 'post_status' => 'publish', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'applies_to', // name of custom field 'value' => '"' . get_the_ID() . '"', 'compare' => 'LIKE' ), array( 'key' => 'featured', 'value' => '0', 'compare' => 'LIKE' ) ) )); if( $special_offers ): echo "<h3 class='special_offer_title'>Special Offers</h3>"; foreach( $special_offers as $offer ): // Do something to display the articles. Each article is a WP_Post object. echo "<div class='special_offer'><h3>"; echo $offer->post_title; // The post title echo "</h3>"; $offer_terms = wp_get_object_terms( $offer->ID, 'offer_tax' ); if ( ! empty( $offer_terms ) ) { if ( ! is_wp_error( $offer_terms ) ) { echo '<ul class="offer_categories">'; foreach( $offer_terms as $term ) { echo '<li>' . esc_html( $term->name ) . '</li>'; } echo '</ul>'; } } echo "<span class='offer_text'>"; echo $offer->post_content; // The post content echo "</span></div>"; endforeach; endif; ?>