Recent posts filter custom post type by custom post type category taxonmy

Hi,

I have read many solutions about filtering custom post type display by taxonomy but they don’t seem to work for me. This support link is the last I tried that did not seem to work

I have 3 custom post types:

  1. venue (category taxonomy: venue-category, tag taxonomy: venue-tag)
  2. supplier (category taxonomy: supplier-category)
  3. price table (category taxonomy: price-table-category)

Here’s my code. Can you tell me how to modify it, if applicable?

  function x_shortcode_recent_posts_override( $atts ) {
        extract( shortcode_atts( array(
        'id'          => '',
        'class'       => '',
        'style'       => '',
        'type'        => 'post',
        'count'       => '',
        'category'    => '',
        'enable_excerpt' => '',
        'offset'      => '',
        'orientation' => '',
        'no_image'    => '',
        'fade'        => ''
        ), $atts, 'x_recent_posts' ) );

  $allowed_post_types = apply_filters( 'cs_recent_posts_post_types', array( 'post' => 'post', 'supplier' => 'supplier', 'venue' => 'venue', 'price table' => 'price table' ) );
  $type = ( isset( $allowed_post_types[$type] ) ) ? $allowed_post_types[$type] : 'post';

  $id            = ( $id          != ''          ) ? 'id="' . esc_attr( $id ) . '"' : '';
  $class         = ( $class       != ''          ) ? 'x-recent-posts cf ' . esc_attr( $class ) : 'x-recent-posts cf';
  $style         = ( $style       != ''          ) ? 'style="' . $style . '"' : '';
  $count         = ( $count       != ''          ) ? $count : 3;
  $category      = ( $category    != ''          ) ? $category : '';
  //$category_type = ( $type        != ''	         ) ? 'category_name' : 'portfolio-category';

  if( $type == 'post' ){
$category_type = 'category_name';
  } elseif ($type == 'x-portfolio') {
$category_type = 'portfolio-category';
  } elseif ($type == 'supplier') {
$category_type = 'supplier-category';
  } elseif ($type == 'venue') {
	$category_type = 'venue-category';
  } 
  
  $offset        = ( $offset      != ''          ) ? $offset : 0;
  $orientation   = ( $orientation != ''          ) ? ' ' . $orientation : ' horizontal';
  $no_image      = ( $no_image    == 'true'      ) ? $no_image : '';
  $fade          = ( $fade        == 'true'      ) ? $fade : 'false';
  $enable_excerpt = ( $enable_excerpt == 'true'      ) ? true : false;

  $js_params = array(
'fade' => ( $fade == 'true' )
  );

  $data = cs_generate_data_attributes( 'recent_posts', $js_params );

  $output = "<div {$id} class=\"{$class}{$orientation}\" {$style} {$data} data-fade=\"{$fade}\" >";

$q = new WP_Query( array(
  'orderby'          => 'date',
  'post_type'        => "{$type}",
  'posts_per_page'   => "{$count}",
  'offset'           => "{$offset}",
  "{$category_type}" => "{$category}",
  ''
) );

if ( $q->have_posts() ) : while ( $q->have_posts() ) : $q->the_post();

  if ( $no_image == 'true' ) {
    $image_output       = '';
    $image_output_class = 'no-image';
  } else {
    $image              = wp_get_attachment_image_src( get_post_thumbnail_id(), 'entry-cropped' );
    $bg_image           = ( $image[0] != '' ) ? ' style="background-image: url(' . $image[0] . ');"' : '';
    $image_output       = '<div class="x-recent-posts-img"' . $bg_image . '></div>';
    $image_output_class = 'with-image';
  }

  $output .= '<a class="x-recent-post' . $count . ' ' . $image_output_class . '" href="' . get_permalink( get_the_ID() ) . '" title="' . esc_attr( sprintf( __( '%s', csl18n() ), the_title_attribute( 'echo=0' ) ) ) . '">'
             . '<article id="post-' . get_the_ID() . '" class="' . implode( ' ', get_post_class() ) . '">'
               . '<div class="entry-wrap">'
                 . $image_output
                 . '<div class="x-recent-posts-content">'
                   . '<h3 class="h-recent-posts">' . get_the_title() . '</h3>'
                   . '<span class="x-recent-posts-date">' . get_the_date() . '</span>'
					   . ( $enable_excerpt ? '<span class="x-recent-posts-excerpt"><p>' . strip_tags( get_the_excerpt() ) . '</p></span>' : '' )
                 . '</div>'
               . '</div>'
             . '</article>'
           . '</a>';

endwhile; endif; wp_reset_postdata();

  $output .= '</div>';

  return $output;
}
add_action('init', 'x_overwrite_shortcode');
function x_overwrite_shortcode() {
  remove_shortcode( 'x_recent_posts' );
  add_shortcode( 'x_recent_posts', 'x_shortcode_recent_posts_override' );
}

function add_event_post_type( $types ) {
  $types['supplier'] = 'supplier';
  $types['venue'] = 'venue';
  $types['price table'] = 'price_table';
  return $types;
}
add_filter( 'cs_recent_posts_post_types', 'add_event_post_type', 999 );

Thank you in advance.

Just in case you’re not after a code-based solution there’s some great plugins that do this- Toolset Views is one, Search & Filter is another

All the best!

Hi stthomas,

Thanks for the info, it is much appreciated.

I am using Custom Post Type UI plugin. I tried to use Toolset Types but the types still need to be added to the X theme’s recent posts shortcode, just like any other custom post type plugin. Also, Toolset Types needs a pro account to display taxonomies in WP Admin Columns, while CPT UI doesn’t.

I haven’t tried Search & Filter though. Will it help in filtering posts when I display them using X theme’s shortcode, for example:
[recent_posts count=“6” type=“venue” category=“venue-cat-1” orientation=“vertical”]
?

Again, thanks.

Hi there,

The code you mentioned in the post should work for the recent posts element. Would you please kindly get back to us with the URL/User/Pass of your website using the Secure Note functionality of the post to double check the code you used in your Child Theme functions.php?

Meanwhile, I suggest that instead of trying to extend the element you can simply use plugin shortcodes such as:

You can add the shortcode to Cornerstone using the Raw Content element.

Then it will be easy to give some CSS suggestions to you to make the look of the recent posts like your website look and feel.

Thank you.

Hi Christopher,

Thanks for getting back to me. Below are the credentials.
In the meantime, I will try latest-post-shortcode. Thanks

Hi Christopher,

https://wordpress.org/plugins/latest-post-shortcode/ worked, thanks.
It would be better to have the options in a dropdown via the Recent Posts element in Cornerstone, though; it would very much help the other admin and editors of the site when using the function.
Also, I found a bug when using the latest-post-shortcode plugin in Cornerstone’s Text element.
To illustrate:
{div 2/3 column}
{p} Text element[latest-post-shortcode] {/p}
{end div 2/3 column}
{div 1/3 column}
{p} Any element Any text {/p}
{end div 1/3 column}
…becomes…
{div 2/3 column }
{p Text element } [latest-post-shortcode] {/p}
{div 1/3 column }
{p} Any element Any text {/p}
{end div 1/3 column}
{end div 2/3 column}
…when using the shortcode

Thanks in advance.

Hi

Can you provide us the url of the page where you have added your shortcode.

With regards to recent post element, I will forward it as a feature request.

Thanks

Hi Paul,

Here’s a sample link.

RE: the recent posts, Christopher is already checking why my code isn’t working when it’s supposed to.

Thanks

Hi,

Yep, seems like a bug with the plugin.

I tried adding a closing div and it fixed the issue.

Please try to contact the plugin developer regarding this issue.

Thanks

Hi Paul,

Thank you for your great mind, the div does work. Your help is very much appreciated.

As for the Recent Posts element, I have not heard back from Christopher yet (he might be busy). If you could help, can you tell me why my code below isn’t working? (aiming for the functionality described in the subject of this support ticket/post) It might be a theme issue (?). Need your great mind on this one.

  function x_shortcode_recent_posts_override( $atts ) {
        extract( shortcode_atts( array(
        'id'          => '',
        'class'       => '',
        'style'       => '',
        'type'        => 'post',
        'count'       => '',
        'category'    => '',
        'enable_excerpt' => '',
        'offset'      => '',
        'orientation' => '',
        'no_image'    => '',
        'fade'        => ''
        ), $atts, 'x_recent_posts' ) );

  $allowed_post_types = apply_filters( 'cs_recent_posts_post_types', array( 'post' => 'post', 'supplier' => 'supplier', 'venue' => 'venue', 'price table' => 'price table' ) );
  $type = ( isset( $allowed_post_types[$type] ) ) ? $allowed_post_types[$type] : 'post';

  $id            = ( $id          != ''          ) ? 'id="' . esc_attr( $id ) . '"' : '';
  $class         = ( $class       != ''          ) ? 'x-recent-posts cf ' . esc_attr( $class ) : 'x-recent-posts cf';
  $style         = ( $style       != ''          ) ? 'style="' . $style . '"' : '';
  $count         = ( $count       != ''          ) ? $count : 3;
  $category      = ( $category    != ''          ) ? $category : '';
  //$category_type = ( $type        != ''	         ) ? 'category_name' : 'portfolio-category';

  if( $type == 'post' ){
$category_type = 'category_name';
  } elseif ($type == 'x-portfolio') {
$category_type = 'portfolio-category';
  } elseif ($type == 'supplier') {
$category_type = 'supplier-category';
  } elseif ($type == 'venue') {
	$category_type = 'venue-category';
  } 
  
  $offset        = ( $offset      != ''          ) ? $offset : 0;
  $orientation   = ( $orientation != ''          ) ? ' ' . $orientation : ' horizontal';
  $no_image      = ( $no_image    == 'true'      ) ? $no_image : '';
  $fade          = ( $fade        == 'true'      ) ? $fade : 'false';
  $enable_excerpt = ( $enable_excerpt == 'true'      ) ? true : false;

  $js_params = array(
'fade' => ( $fade == 'true' )
  );

  $data = cs_generate_data_attributes( 'recent_posts', $js_params );

  $output = "<div {$id} class=\"{$class}{$orientation}\" {$style} {$data} data-fade=\"{$fade}\" >";

$q = new WP_Query( array(
  'orderby'          => 'date',
  'post_type'        => "{$type}",
  'posts_per_page'   => "{$count}",
  'offset'           => "{$offset}",
  "{$category_type}" => "{$category}",
  ''
) );

if ( $q->have_posts() ) : while ( $q->have_posts() ) : $q->the_post();

  if ( $no_image == 'true' ) {
    $image_output       = '';
    $image_output_class = 'no-image';
  } else {
    $image              = wp_get_attachment_image_src( get_post_thumbnail_id(), 'entry-cropped' );
    $bg_image           = ( $image[0] != '' ) ? ' style="background-image: url(' . $image[0] . ');"' : '';
    $image_output       = '<div class="x-recent-posts-img"' . $bg_image . '></div>';
    $image_output_class = 'with-image';
  }

  $output .= '<a class="x-recent-post' . $count . ' ' . $image_output_class . '" href="' . get_permalink( get_the_ID() ) . '" title="' . esc_attr( sprintf( __( '%s', csl18n() ), the_title_attribute( 'echo=0' ) ) ) . '">'
             . '<article id="post-' . get_the_ID() . '" class="' . implode( ' ', get_post_class() ) . '">'
               . '<div class="entry-wrap">'
                 . $image_output
                 . '<div class="x-recent-posts-content">'
                   . '<h3 class="h-recent-posts">' . get_the_title() . '</h3>'
                   . '<span class="x-recent-posts-date">' . get_the_date() . '</span>'
					   . ( $enable_excerpt ? '<span class="x-recent-posts-excerpt"><p>' . strip_tags( get_the_excerpt() ) . '</p></span>' : '' )
                 . '</div>'
               . '</div>'
             . '</article>'
           . '</a>';

endwhile; endif; wp_reset_postdata();

  $output .= '</div>';

  return $output;
}
add_action('init', 'x_overwrite_shortcode');
function x_overwrite_shortcode() {
  remove_shortcode( 'x_recent_posts' );
  add_shortcode( 'x_recent_posts', 'x_shortcode_recent_posts_override' );
}

function add_event_post_type( $types ) {
  $types['supplier'] = 'supplier';
  $types['venue'] = 'venue';
  $types['price table'] = 'price_table';
  return $types;
}
add_filter( 'cs_recent_posts_post_types', 'add_event_post_type', 999 );

Thanks in advance.

Hello There,

Thanks for updating in! There is a function in your code that is deprecated which causes a fatal error. To resolve it, please find this csl18n() and replace it with 'cornerstone'. To save you some time, I went ahead and resolve it myself. Please check the recent posts element now.

If you need anything else we can help you with, please let us know.

Hi RueNel,

Thanks a lot. Everything works well now with Recent Posts element. Your help is very much appreciated. Great support from X theme.

Thanks again.

You’re most welcome :slight_smile:

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.