Using WordPress ‘posts_join’ PHP filter

posts_join is a WordPress PHP filter that lets you modify the JOIN clause of a query in a WordPress site.

Usage

add_filter('posts_join', 'my_custom_posts_join', 10, 2);

function my_custom_posts_join($join, $query) {
    // Your custom code here
    return $join;
}

Parameters

  • $join (string) – The JOIN clause of the query.
  • $query (WP_Query) – The WP_Query instance, passed by reference.

More information

See WordPress Developer Resources: posts_join

Examples

Include custom table in the query

To include a custom table in the query, modify the JOIN clause.

add_filter('posts_join', 'join_custom_table', 10, 2);

function join_custom_table($join, $query) {
    global $wpdb;
    $join .= " LEFT JOIN {$wpdb->prefix}my_custom_table ON {$wpdb->prefix}posts.ID = {$wpdb->prefix}my_custom_table.post_id ";
    return $join;
}

Filter posts by meta value

Filter posts based on a specific meta value.

add_filter('posts_join', 'join_post_meta', 10, 2);

function join_post_meta($join, $query) {
    global $wpdb;
    $join .= " INNER JOIN {$wpdb->postmeta} ON ( {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id ) ";
    return $join;
}

Filter posts by custom taxonomy

Filter posts based on a custom taxonomy term.

add_filter('posts_join', 'join_custom_taxonomy', 10, 2);

function join_custom_taxonomy($join, $query) {
    global $wpdb;
    $join .= " INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id) ";
    return $join;
}

Filter posts by multiple taxonomies

Filter posts based on multiple taxonomy terms.

add_filter('posts_join', 'join_multiple_taxonomies', 10, 2);

function join_multiple_taxonomies($join, $query) {
    global $wpdb;
    $join .= " INNER JOIN {$wpdb->term_relationships} AS tr1 ON ({$wpdb->posts}.ID = tr1.object_id) ";
    $join .= " INNER JOIN {$wpdb->term_relationships} AS tr2 ON ({$wpdb->posts}.ID = tr2.object_id) ";
    return $join;
}

Exclude posts with a specific meta key

Exclude posts that have a specific meta key.

add_filter('posts_join', 'exclude_posts_with_meta_key', 10, 2);
function exclude_posts_with_meta_key($join, $query) {
    global $wpdb;
    $join .= " LEFT JOIN {$wpdb->postmeta} AS pm1 ON ({$wpdb->posts}.ID = pm1.post_id AND pm1.meta_key = 'my_meta_key') ";
    return $join;
}