WordPress.org

Make WordPress Core

Ticket #12731: get_posts_callback_in_query.php.diff

File get_posts_callback_in_query.php.diff, 11.7 KB (added by mikeschinkel, 8 years ago)

Patch for /wp-includes/query.php to add callback functionality as an alternate to existing hooks for get_posts().

  • query.php

     
    10921092         * @var bool
    10931093         */
    10941094        var $is_posts_page = false;
     1095       
     1096        /**
     1097         * Sets a callback for get_posts().
     1098         *
     1099         * @access private
     1100         * @var bool
     1101         */
     1102        var $_get_posts_callback = false;
     1103       
    10951104
    10961105        /**
    10971106         * Resets query flags to false.
     
    15851594        }
    15861595
    15871596        /**
     1597         * Calls do_action_ref_array() normally when no callback or with Retrieve the posts based on query variables.
     1598         *
     1599         * Handles get_posts_callback when get_posts() needs to call do_action_ref_array().
     1600         *
     1601         * @access private
     1602         * @uses do_action_ref_array()
     1603         *
     1604         */
     1605        function _do_action_ref_array_or_callback($tag) {
     1606                if ($this->_get_posts_callback) {
     1607                        do_action_ref_array($this->_get_posts_callback, array(&$this,$tag));
     1608                } else {
     1609                        do_action_ref_array($tag, array(&$this));
     1610                }
     1611        }
     1612
     1613        /**
     1614         * Calls do_action($tag,$value) or if callback then do_action("get_posts_callback_$tag",array($tag,$value,$query))
     1615         *
     1616         * Handles get_posts_callback when get_posts() needs to call do_action().
     1617         *
     1618         * @access private
     1619         * @uses $this->_apply_filters_or_callback() Delegates this function
     1620         *
     1621         */
     1622        function _do_action_or_callback($tag,$value) {
     1623                $this->_apply_filters_ref_array_or_callback($tag,array(&$this,$value));
     1624        }
     1625
     1626        /**
     1627         * Calls apply_filters_ref_array($tag,$args) or if callback then apply_filters_ref_array("get_posts_callback_$tag",$args)
     1628         *
     1629         * Handles get_posts_callback when get_posts() needs to call apply_filters_ref_array().
     1630         *
     1631         * @access private
     1632         * @uses apply_filters()
     1633         *
     1634         * @return filtered value.
     1635         */
     1636        function _apply_filters_ref_array_or_callback($tag,$args) {
     1637                if ($this->_get_posts_callback) {
     1638                  $args[] = $tag;
     1639                        $value = apply_filters_ref_array($this->_get_posts_callback,&$args);
     1640                } else {
     1641                        $value = apply_filters_ref_array($tag,&$args);
     1642                }
     1643                return $value;
     1644        }
     1645
     1646
     1647        /**
    15881648         * Retrieve the posts based on query variables.
    15891649         *
    15901650         * There are a few filters and actions that can be used to modify the post
     
    15991659        function &get_posts() {
    16001660                global $wpdb, $user_ID;
    16011661
    1602                 do_action_ref_array('pre_get_posts', array(&$this));
     1662                if (!isset($this->query_vars['callback']))
     1663                        $this->_get_posts_callback = false;
     1664                else if (!has_action($this->_get_posts_callback = 'get_posts_callback_' . $this->query_vars['callback']))
     1665                        $this->_get_posts_callback = false;
    16031666
     1667                $this->_do_action_ref_array_or_callback('pre_get_posts', array(&$this));
     1668
    16041669                // Shorthand.
    16051670                $q = &$this->query_vars;
    16061671
     
    18491914                                        $search .= " AND ($wpdb->posts.post_password = '') ";
    18501915                        }
    18511916                }
    1852                 $search = apply_filters_ref_array('posts_search', array( $search, &$this ) );
     1917                $search = $this->_apply_filters_ref_array_or_callback('posts_search', array( $search, &$this ) );
    18531918
    18541919                // Category stuff
    18551920
     
    22922357                // Apply filters on where and join prior to paging so that any
    22932358                // manipulations to them are reflected in the paging by day queries.
    22942359                if ( !$q['suppress_filters'] ) {
    2295                         $where = apply_filters_ref_array('posts_where', array( $where, &$this ) );
    2296                         $join = apply_filters_ref_array('posts_join', array( $join, &$this ) );
     2360                        $where = $this->_apply_filters_ref_array_or_callback('posts_where', array( $where, &$this ) );
     2361                        $join = $this->_apply_filters_ref_array_or_callback('posts_join', array( $join, &$this ) );
    22972362                }
    22982363
    22992364                // Paging
     
    23272392                        }
    23282393
    23292394                        if ( !$q['suppress_filters'] ) {
    2330                                 $cjoin = apply_filters_ref_array('comment_feed_join', array( $cjoin, &$this ) );
    2331                                 $cwhere = apply_filters_ref_array('comment_feed_where', array( $cwhere, &$this ) );
    2332                                 $cgroupby = apply_filters_ref_array('comment_feed_groupby', array( $cgroupby, &$this ) );
    2333                                 $corderby = apply_filters_ref_array('comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) );
    2334                                 $climits = apply_filters_ref_array('comment_feed_limits', array( 'LIMIT ' . get_option('posts_per_rss'), &$this ) );
     2395                                $cjoin = $this->_apply_filters_ref_array_or_callback('comment_feed_join', array( $cjoin, &$this ) );
     2396                                $cwhere = $this->_apply_filters_ref_array_or_callback('comment_feed_where', array( $cwhere, &$this ) );
     2397                                $cgroupby = $this->_apply_filters_ref_array_or_callback('comment_feed_groupby', array( $cgroupby, &$this ) );
     2398                                $corderby = $this->_apply_filters_ref_array_or_callback('comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) );
     2399                                $climits = $this->_apply_filters_ref_array_or_callback('comment_feed_limits', array( 'LIMIT ' . get_option('posts_per_rss'), &$this ) );
    23352400                        }
    23362401                        $cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : '';
    23372402                        $corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : '';
     
    23572422                // Apply post-paging filters on where and join.  Only plugins that
    23582423                // manipulate paging queries should use these hooks.
    23592424                if ( !$q['suppress_filters'] ) {
    2360                         $where          = apply_filters_ref_array( 'posts_where_paged', array( $where, &$this ) );
    2361                         $groupby        = apply_filters_ref_array( 'posts_groupby',             array( $groupby, &$this ) );
    2362                         $join           = apply_filters_ref_array( 'posts_join_paged',  array( $join, &$this ) );
    2363                         $orderby        = apply_filters_ref_array( 'posts_orderby',             array( $orderby, &$this ) );
    2364                         $distinct       = apply_filters_ref_array( 'posts_distinct',    array( $distinct, &$this ) );
    2365                         $limits         = apply_filters_ref_array( 'post_limits',               array( $limits, &$this ) );
    2366                         $fields         = apply_filters_ref_array( 'posts_fields',              array( $fields, &$this ) );
     2425                        $where          = $this->_apply_filters_ref_array_or_callback( 'posts_where_paged',     array( $where, &$this ) );
     2426                        $groupby        = $this->_apply_filters_ref_array_or_callback( 'posts_groupby',         array( $groupby, &$this ) );
     2427                        $join           = $this->_apply_filters_ref_array_or_callback( 'posts_join_paged',      array( $join, &$this ) );
     2428                        $orderby        = $this->_apply_filters_ref_array_or_callback( 'posts_orderby',         array( $orderby, &$this ) );
     2429                        $distinct       = $this->_apply_filters_ref_array_or_callback( 'posts_distinct',        array( $distinct, &$this ) );
     2430                        $limits         = $this->_apply_filters_ref_array_or_callback( 'post_limits',           array( $limits, &$this ) );
     2431                        $fields         = $this->_apply_filters_ref_array_or_callback( 'posts_fields',          array( $fields, &$this ) );
    23672432                }
    23682433
    23692434                // Announce current selection parameters.  For use by caching plugins.
    2370                 do_action( 'posts_selection', $where . $groupby . $orderby . $limits . $join );
     2435                $this->_do_action_or_callback('posts_selection', $where . $groupby . $orderby . $limits . $join );
    23712436
    23722437                // Filter again for the benefit of caching plugins.  Regular plugins should use the hooks above.
    23732438                if ( !$q['suppress_filters'] ) {
    2374                         $where          = apply_filters_ref_array( 'posts_where_request',       array( $where, &$this ) );
    2375                         $groupby        = apply_filters_ref_array( 'posts_groupby_request',             array( $groupby, &$this ) );
    2376                         $join           = apply_filters_ref_array( 'posts_join_request',        array( $join, &$this ) );
    2377                         $orderby        = apply_filters_ref_array( 'posts_orderby_request',             array( $orderby, &$this ) );
    2378                         $distinct       = apply_filters_ref_array( 'posts_distinct_request',    array( $distinct, &$this ) );
    2379                         $fields         = apply_filters_ref_array( 'posts_fields_request',              array( $fields, &$this ) );
    2380                         $limits         = apply_filters_ref_array( 'post_limits_request',               array( $limits, &$this ) );
     2439                        $where          = $this->_apply_filters_ref_array_or_callback( 'posts_where_request',   array( $where, &$this ) );
     2440                        $groupby        = $this->_apply_filters_ref_array_or_callback( 'posts_groupby_request',         array( $groupby, &$this ) );
     2441                        $join           = $this->_apply_filters_ref_array_or_callback( 'posts_join_request',    array( $join, &$this ) );
     2442                        $orderby        = $this->_apply_filters_ref_array_or_callback( 'posts_orderby_request',         array( $orderby, &$this ) );
     2443                        $distinct       = $this->_apply_filters_ref_array_or_callback( 'posts_distinct_request',        array( $distinct, &$this ) );
     2444                        $fields         = $this->_apply_filters_ref_array_or_callback( 'posts_fields_request',          array( $fields, &$this ) );
     2445                        $limits         = $this->_apply_filters_ref_array_or_callback( 'post_limits_request',           array( $limits, &$this ) );
    23812446                }
    23822447
    23832448                if ( ! empty($groupby) )
     
    23902455
    23912456                $this->request = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits";
    23922457                if ( !$q['suppress_filters'] )
    2393                         $this->request = apply_filters_ref_array('posts_request', array( $this->request, &$this ) );
     2458                        $this->request = $this->_apply_filters_ref_array_or_callback('posts_request', array( $this->request, &$this ) );
    23942459
    23952460                $this->posts = $wpdb->get_results($this->request);
    23962461                // Raw results filter.  Prior to status checks.
    23972462                if ( !$q['suppress_filters'] )
    2398                         $this->posts = apply_filters_ref_array('posts_results', array( $this->posts, &$this ) );
     2463                        $this->posts = $this->_apply_filters_ref_array_or_callback('posts_results', array( $this->posts, &$this ) );
    23992464
    24002465                if ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) {
    2401                         $cjoin = apply_filters_ref_array('comment_feed_join', array( '', &$this ) );
    2402                         $cwhere = apply_filters_ref_array('comment_feed_where', array( "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'", &$this ) );
    2403                         $cgroupby = apply_filters_ref_array('comment_feed_groupby', array( '', &$this ) );
     2466                        $cjoin = $this->_apply_filters_ref_array_or_callback('comment_feed_join', array( '', &$this ) );
     2467                        $cwhere = $this->_apply_filters_ref_array_or_callback('comment_feed_where', array( "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'", &$this ) );
     2468                        $cgroupby = $this->_apply_filters_ref_array_or_callback('comment_feed_groupby', array( '', &$this ) );
    24042469                        $cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : '';
    2405                         $corderby = apply_filters_ref_array('comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) );
     2470                        $corderby = $this->_apply_filters_ref_array_or_callback('comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) );
    24062471                        $corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : '';
    2407                         $climits = apply_filters_ref_array('comment_feed_limits', array( 'LIMIT ' . get_option('posts_per_rss'), &$this ) );
     2472                        $climits = $this->_apply_filters_ref_array_or_callback('comment_feed_limits', array( 'LIMIT ' . get_option('posts_per_rss'), &$this ) );
    24082473                        $comments_request = "SELECT $wpdb->comments.* FROM $wpdb->comments $cjoin $cwhere $cgroupby $corderby $climits";
    24092474                        $this->comments = $wpdb->get_results($comments_request);
    24102475                        $this->comment_count = count($this->comments);
    24112476                }
    24122477
    24132478                if ( !$q['no_found_rows'] && !empty($limits) ) {
    2414                         $found_posts_query = apply_filters_ref_array( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) );
     2479                        $found_posts_query = $this->_apply_filters_ref_array_or_callback( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) );
    24152480                        $this->found_posts = $wpdb->get_var( $found_posts_query );
    2416                         $this->found_posts = apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) );
     2481                        $this->found_posts = $this->_apply_filters_ref_array_or_callback( 'found_posts', array( $this->found_posts, &$this ) );
    24172482                        $this->max_num_pages = ceil($this->found_posts / $q['posts_per_page']);
    24182483                }
    24192484
     
    24462511                        }
    24472512
    24482513                        if ( $this->is_preview && current_user_can( $edit_cap, $this->posts[0]->ID ) )
    2449                                 $this->posts[0] = apply_filters_ref_array('the_preview', array( $this->posts[0], &$this ));
     2514                                $this->posts[0] = $this->_apply_filters_ref_array_or_callback('the_preview', array( $this->posts[0], &$this ));
    24502515                }
    24512516
    24522517                // Put sticky posts at the top of the posts array
     
    24952560                }
    24962561
    24972562                if ( !$q['suppress_filters'] )
    2498                         $this->posts = apply_filters_ref_array('the_posts', array( $this->posts, &$this ) );
     2563                        $this->posts = $this->_apply_filters_ref_array_or_callback('the_posts', array( $this->posts, &$this ) );
    24992564
    25002565                $this->post_count = count($this->posts);
    25012566