WordPress.org

Make WordPress Core

Opened 4 years ago

Closed 4 years ago

Last modified 3 years ago

#11076 closed enhancement (fixed)

Allow 'include' & 'exclude' args to be arrays

Reported by: scribu Owned by: scribu
Milestone: 3.0 Priority: normal
Severity: normal Version:
Component: General Keywords: has-patch commit
Focuses: Cc:

Description

Most of the time, the term ids you want to include are retrieved as an array, using $wpdb.

To avoid having to join(',', $term_ids), only to have them preg_split() afterwards, I think this would be really useful.

Attachments (5)

get_terms.diff (862 bytes) - added by scribu 4 years ago.
get_terms.2.diff (864 bytes) - added by scribu 4 years ago.
Fix copy-paste error
get_terms.3.diff (4.6 KB) - added by scribu 4 years ago.
Use helper function
get_terms.4.diff (5.0 KB) - added by scribu 4 years ago.
Rename helper function to wp_parse_id_list()
post.php.diff (2.8 KB) - added by scribu 4 years ago.
Use wp_parse_id_list() in get_posts() and get_pages()

Download all attachments as: .zip

Change History (21)

scribu4 years ago

comment:1 ryan4 years ago

Looks like a cut-and-paste error. Second $include should be $exclude.

comment:2 ryan4 years ago

  • Milestone changed from 2.9 to 3.0

scribu4 years ago

Fix copy-paste error

comment:3 scribu4 years ago

  • Keywords commit added; tested removed

comment:4 westi4 years ago

Looks like we should also do this for $exclude_tree and we should probably set the default values at the top of the function to array() instead of '' so we can avoid the preg_split.

Wondering if we should refactor some of this code into a helper function as we have a lot of copy/paste going on here.

comment:5 scribu4 years ago

get_terms.3.diff creates a helper function called _parse_get_terms_arg() and applies it to exclude, exclude_tree and include.

scribu4 years ago

Use helper function

scribu4 years ago

Rename helper function to wp_parse_id_list()

comment:6 scribu4 years ago

get_terms.4.diff moves the helper function wp_parse_id_list() to wp-includes/functions.php so that it can be used in other contexts.

comment:7 westi4 years ago

  • Resolution set to fixed
  • Status changed from new to closed

(In [12658]) Add support to get_terms() to allow 'include' & 'exclude' args to be arrays(). Fixes #11076 props scribu.

comment:8 sirzooro4 years ago

I think it will be better to change generated SQL from:

AND (t.term_id = 1 OR t.term_id = 2 OR ...)
AND (t.term_id <> 1 AND t.term_id <> 2 AND ...)

to:

AND t.term_id IN (1, 2, ...)
AND t.term_id NOT IN (1, 2, ...)

comment:9 scribu4 years ago

+1 on that. Please open a new ticket.

comment:10 scribu4 years ago

  • Keywords needs-patch added; has-patch commit removed
  • Resolution fixed deleted
  • Status changed from closed to reopened
  • Summary changed from In get_terms(), allow 'include' & 'exclude' args to be arrays to Allow 'include' & 'exclude' args to be arrays

Should also do this for get_pages() and get_posts()

comment:11 scribu4 years ago

  • Component changed from Taxonomy to General

scribu4 years ago

Use wp_parse_id_list() in get_posts() and get_pages()

comment:12 scribu4 years ago

  • Keywords has-patch commit added; needs-patch removed

post.php.diff:

  • use wp_parse_id_list() in get_posts() and get_pages()
  • replace if ( count(...) ) with if ( !empty(...) )

comment:13 scribu4 years ago

  • Owner changed from filosofo to scribu
  • Status changed from reopened to accepted

comment:14 nacin4 years ago

  • Resolution set to fixed
  • Status changed from accepted to closed

(In [14133]) Allow include/exclude args to be arrays in get_posts() and get_pages(). Utilizes wp_parse_id_list(). props scribu, fixes #11076.

comment:15 miqrogroove3 years ago

I'm trying to figure out if something blew up here. In version 2.9 this was working fine:

        $ids = implode(',', $ids);
        $taxonomy = 'post_tag';
        $args = array('include' => $ids);
        $terms = get_terms($taxonomy, $args);

In version 3.0, get_terms is returning an empty array :( I'm working on a plugin upgrade that needs to be backward compatible, so I'm hoping this change doesn't mean CSVs are invalid now.

comment:16 miqrogroove3 years ago

Nevermind, it works fine. The tags I was testing were attached to drafts so they were coming up empty. Inputs handled as expected:

var_dump(wp_parse_id_list('16'));
array(1) {
  [0]=>
  int(16)
}
Note: See TracTickets for help on using tickets.