[wp-trac] [WordPress Trac] #24794: get_adjacent_post()'s categories properties don't play well with CPT
WordPress Trac
noreply at wordpress.org
Thu Jul 18 08:42:25 UTC 2013
#24794: get_adjacent_post()'s categories properties don't play well with CPT
---------------------------+-----------------------------
Reporter: RubenBristian | Owner:
Type: enhancement | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Post Types | Version: 3.5.2
Severity: normal | Keywords: has-patch
---------------------------+-----------------------------
Hi
Please bear with me here, as it's the first ticket i create ever so i
don't know if i have done it right or wrong or if i posted something
that's not an error because my lack of knowledge :)
The issue is simple: let's consider that i have a CPT called "portfolio"
and i want to use get_adjacent_post() with it.. The basic function works
fine, but when i try to exclude some categories or filter the posts which
are in the same category, the object returned by the function is empty.
This is because the database query is for the "category", while my cpt's
categories are actually "portfolio_category".
I'm not sure if this has been raised before, since i have searched a lot
on the internet on this topic and i wasn't able to find anything concrete.
The issue:
{{{
get_adjacent_post(); // returns a perfectly normal object which contains
the data of the next post
get_adjacent_post(true); // returns an empty object, even if there are a
lot more posts in the same category
get_adjacent_post(false, '34'); // returns an empty object, even if there
are more posts in other categories except 3
}}}
The solution would be to add a new variable to the get_adjacent_post()
function (and on the other function which depend on it) and let developers
choose the custom post type:
{{{
function get_adjacent_post( $in_same_cat = false, $excluded_categories =
'', $previous = true, $cpt_title = '' ) {
global $wpdb;
if ( ! $post = get_post() )
return null;
$current_post_date = $post->post_date;
$join = '';
$posts_in_ex_cats_sql = '';
if ( $in_same_cat || ! empty( $excluded_categories ) ) {
$join = " INNER JOIN $wpdb->term_relationships AS tr ON
p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON
tr.term_taxonomy_id = tt.term_taxonomy_id";
if ( $in_same_cat ) {
if ( ! is_object_in_taxonomy( $post->post_type,
$cpt_title . 'category' ) )
return '';
$cat_array = wp_get_object_terms($post->ID,
$cpt_title . 'category', array('fields' => 'ids'));
if ( ! $cat_array || is_wp_error( $cat_array ) )
return '';
$join .= " AND tt.taxonomy = '" . $cpt_title .
"category' AND tt.term_id IN (" . implode(',', $cat_array) . ")";
}
$posts_in_ex_cats_sql = "AND tt.taxonomy = '" . $cpt_title
. "category'";
if ( ! empty( $excluded_categories ) ) {
if ( ! is_array( $excluded_categories ) ) {
// back-compat, $excluded_categories used
to be IDs separated by " and "
if ( strpos( $excluded_categories, ' and '
) !== false ) {
_deprecated_argument(
__FUNCTION__, '3.3', sprintf( __( 'Use commas instead of %s to separate
excluded categories.' ), "'and'" ) );
$excluded_categories = explode( '
and ', $excluded_categories );
} else {
$excluded_categories = explode(
',', $excluded_categories );
}
}
$excluded_categories = array_map( 'intval',
$excluded_categories );
if ( ! empty( $cat_array ) ) {
$excluded_categories =
array_diff($excluded_categories, $cat_array);
$posts_in_ex_cats_sql = '';
}
if ( !empty($excluded_categories) ) {
$posts_in_ex_cats_sql = " AND tt.taxonomy
= '" . $cpt_title . "category' AND tt.term_id NOT IN (" .
implode($excluded_categories, ',') . ')';
}
}
}
$adjacent = $previous ? 'previous' : 'next';
$op = $previous ? '<' : '>';
$order = $previous ? 'DESC' : 'ASC';
$join = apply_filters( "get_{$adjacent}_post_join", $join,
$in_same_cat, $excluded_categories );
$where = apply_filters( "get_{$adjacent}_post_where",
$wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = %s AND
p.post_status = 'publish' $posts_in_ex_cats_sql", $current_post_date,
$post->post_type), $in_same_cat, $excluded_categories );
$sort = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY
p.post_date $order LIMIT 1" );
$query = "SELECT p.id FROM $wpdb->posts AS p $join $where $sort";
$query_key = 'adjacent_post_' . md5($query);
$result = wp_cache_get($query_key, 'counts');
if ( false !== $result ) {
if ( $result )
$result = get_post( $result );
return $result;
}
$result = $wpdb->get_var( $query );
if ( null === $result )
$result = '';
wp_cache_set($query_key, $result, 'counts');
if ( $result )
$result = get_post( $result );
return $result;
}
}}}
The in my code, i'll simply have to use:
{{{
get_adjacent_post(false, '34', true, 'portfolio_'); // and this returns
the correct object
}}}
--
Ticket URL: <http://core.trac.wordpress.org/ticket/24794>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software
More information about the wp-trac
mailing list