1
votes

I am running the plugin WP Show Posts on a WP install with a custom post type (called 'trees') that has a custom post field called 'popularity' (formatted as “number”). The custom field was created by the Advanced Custom Fields plugin, the custom post type with the plugin Custom Post Type UI.

Now, I want to create a list, that only shows posts with a popularity value below the numeric value of 10.

To do so, I have followed the plugin author's instructions here and adjusted the plugin itself to allow for additional arguments.

I now use the following code, as suggested in this support article, but unfortunately, I can not get it to work. The output is the “no results message”. ????

This is the code I use in my functions.php:

add_filter( 'wp_show_posts_shortcode_args', function( $args, $settings ) {
    if ( 4566 === $settings['list_id'] ) {
        $args['meta_query'] = array(
            array(
                'key' => 'popularity',
                'value' => 10,
                'compare' => '<'
            )
        );
    }

    return $args;
}, 15, 2 );

What do I do wrong? For example, do I have to specify the custom post type (i.e. trees)?

1
I like the plugin because it also automatically styles my output. So I simply have to add a shortcode and everything is formatted nicely in the front-end, which I see as a big advantage. Let me know if you have any different thoughts/approaches on this!Alex

1 Answers

2
votes

If you really want to use this "WP Show Posts" plugin, at the moment that i'm writing this answer, you need to modify its core functionality in order to be able to modify its query.

  1. Go to this path your site folder > wp-content > plugins > wp-show-posts, and open up wp-show-posts.php. On line 386:

Replace

$query = new WP_Query(apply_filters('wp_show_posts_shortcode_args', $args));

with this:

$query = new WP_Query(apply_filters('wp_show_posts_shortcode_args', $args, $settings));
  1. Now you can modify the query. Use the following snippet in your functions.php file.
add_filter('wp_show_posts_shortcode_args', 'your_custom_query', 10, 2);

function your_custom_query($args, $settings)
{
  $args = $args;
  if (4566 === (int)$settings['list_id']) {
    $args['meta_query'] = array(
      array(
        'key' => 'popularity',
        'value' => '10',
        'compare' => '<',
        'type' => 'NUMERIC'
      )
    );
  }
  return $args;
}

Note:

  • Make sure 4566 is the id that WP Show Posts plugin gives you, otherwise it won't work.
  • By following these steps, you're modifying, WP Show Posts plugin core file (i.e. wp-show-posts.php) which is NOT RECOMMENDED. So on the next update of the plugin, make sure that the line you modified, stays intact, otherwise it'll break you page. So keep an eye on the updates!
  • Because your field type is numeric, i've added 'type' => 'NUMERIC' argument, otherwise it won't work.

Another solution using wp_query. NO EXTRA PLUGINS

This is a simple wp_query that allows you to do the job without using any third-party plugins.

$args = array(
  'post_type' => 'trees', 
  'posts_per_page' => -1,
  'meta_query' => array(
    array(
      'key' => 'popularity',
      'value' => '10',
      'compare' => '<',
      'type' => 'NUMERIC'
    )
  )
);

$query = new WP_Query($args);

if ($query) {
  while ($query->have_posts()) {
    $query->the_post(); ?>
    <h4><?php the_title() ?></h4>
<?php 
  }
} else {
  echo "no post found!";
}

wp_reset_postdata();

This has been fully tested on wordpress 5.8 and works.