Skip to content

Instantly share code, notes, and snippets.

@xnau
Last active February 10, 2026 21:44
Show Gist options
  • Select an option

  • Save xnau/856b362ccdd7545cdfd02dbbb83b273e to your computer and use it in GitHub Desktop.

Select an option

Save xnau/856b362ccdd7545cdfd02dbbb83b273e to your computer and use it in GitHub Desktop.
How to set up a prefilter for a Participants Database Participant Log list display
<?php
/**
* Plugin Name: PDB Log List Prefilter
* Description: filters which log entries are presented in a log list
*
* @see https://gist.github.com/xnau/856b362ccdd7545cdfd02dbbb83b273e
*/
if ( !class_exists( 'xnau_filtered_log_template' ) ):
class xnau_filtered_log_template
{
// name of the log that we will be filtering
private $log_name = 'work_log';
// name of the log entry field we are filtering by
private $filter_field = 'work_log_completion';
/*
* this is the comparison operator we will use
*
* this can be one of: 'equals', 'not equals', 'greater than', 'less than'
*
* if you use greater than or less than, your comparison value must be numeric,
* these operators won't work with string values!
*/
private $operator = 'equals';
/*
* this is the comparison value we will use
*
* this can be a number or a string
*/
private $check_value = 0;
// don't edit the stuff below here
/**
* @var bool true if the filter should be applied
*
* this is to make sure it's only applied where the special template is used
*/
private $set_filter = false;
public function __construct()
{
add_filter( 'pdb-shortcode_call_pdb_record', [$this,'check_shortcode'] );
add_filter( 'pdb-shortcode_call_pdb_single', [$this,'check_shortcode'] );
// determine the operator
switch ( $this->operator )
{
case 'not equals':
$this->operator = '<>';
break;
case 'less than':
$this->operator = '<';
break;
case 'greater than':
$this->operator = '>';
break;
case 'equals':
default:
$this->operator = '=';
}
// this sets up the function that will alter the database query for the log
add_filter( "pdblog-{$this->log_name}_record_entries_query", [ $this, 'alter_log_query' ] );
}
/**
* @param array $shortcode_attributes
* @return array attributes
*/
public function check_shortcode( $shortcode_attributes )
{
if ( isset( $shortcode_attributes['prefilter'] ) )
{
$this->set_filter = true;
}
return $shortcode_attributes;
}
/*
* adds the filtering clause to the query
*
* @global \wpdb $wpdb
* @param string $query
* @return string query
*/
public function alter_log_query( $query )
{
if ( ! $this->set_filter )
{
// if the filter is not enabled, return the unaltered query
return $query;
}
global $wpdb;
/*
* this builds the filter clause we will add
* the $wpdb->prepare() method makes sure the resulting query is valid and safe
*/
$filter_clause = $wpdb->prepare( 'WHERE %i ' . $this->operator . ' %s AND ', $this->filter_field, $this->check_value );
$altered_query = str_replace( 'WHERE', $filter_clause, $query );
return $altered_query;
}
}
endif;
new xnau_filtered_log_template;
@xnau
Copy link
Author

xnau commented Feb 10, 2026

If you are a coder, there are all kinds of things you can do with this (like complex filtering on multiple field values) once you understand how it works.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment