WordPress.org

Make WordPress Core

Ticket #12726: 12726-2.patch

File 12726-2.patch, 6.4 KB (added by MikeSchinkel, 5 years ago)

Added get_post_by() function, revised for 4.4.0

  • wp-includes/post-functions.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    40594059 * @return WP_Post|array|void WP_Post on success.
    40604060 */
    40614061function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) {
    4062         global $wpdb;
    40634062
    4064         $page_path = rawurlencode(urldecode($page_path));
    4065         $page_path = str_replace('%2F', '/', $page_path);
    4066         $page_path = str_replace('%20', ' ', $page_path);
    4067         $parts = explode( '/', trim( $page_path, '/' ) );
    4068         $parts = esc_sql( $parts );
    4069         $parts = array_map( 'sanitize_title_for_query', $parts );
     4063    return get_post_by( 'path', $page_path, array(
     4064        'post_type' => $post_type,
     4065                'output'    => $output,
     4066    ));
    40704067
    4071         $in_string = "'" . implode( "','", $parts ) . "'";
    4072 
    4073         if ( is_array( $post_type ) ) {
    4074                 $post_types = $post_type;
    4075         } else {
    4076                 $post_types = array( $post_type, 'attachment' );
    4077         }
     4068}
    40784069
    4079         $post_types = esc_sql( $post_types );
    4080         $post_type_in_string = "'" . implode( "','", $post_types ) . "'";
    4081         $sql = "
    4082                 SELECT ID, post_name, post_parent, post_type
    4083                 FROM $wpdb->posts
    4084                 WHERE post_name IN ($in_string)
    4085                 AND post_type IN ($post_type_in_string)
    4086         ";
    4087 
    4088         $pages = $wpdb->get_results( $sql, OBJECT_K );
    4089 
    4090         $revparts = array_reverse( $parts );
    4091 
    4092         $foundid = 0;
    4093         foreach ( (array) $pages as $page ) {
    4094                 if ( $page->post_name == $revparts[0] ) {
    4095                         $count = 0;
    4096                         $p = $page;
    4097                         while ( $p->post_parent != 0 && isset( $pages[ $p->post_parent ] ) ) {
    4098                                 $count++;
    4099                                 $parent = $pages[ $p->post_parent ];
    4100                                 if ( ! isset( $revparts[ $count ] ) || $parent->post_name != $revparts[ $count ] )
    4101                                         break;
    4102                                 $p = $parent;
    4103                         }
    4104 
    4105                         if ( $p->post_parent == 0 && $count+1 == count( $revparts ) && $p->post_name == $revparts[ $count ] ) {
    4106                                 $foundid = $page->ID;
    4107                                 if ( $page->post_type == $post_type )
    4108                                         break;
    4109                         }
    4110                 }
    4111         }
    4112 
    4113         if ( $foundid ) {
    4114                 return get_post( $foundid, $output );
    4115         }
    4116 }
    4117 
    41184070/**
    41194071 * Retrieve a page given its title.
    41204072 *
     
    41294081 * @return WP_Post|array|void WP_Post on success or null on failure
    41304082 */
    41314083function get_page_by_title( $page_title, $output = OBJECT, $post_type = 'page' ) {
    4132         global $wpdb;
    41334084
    4134         if ( is_array( $post_type ) ) {
    4135                 $post_type = esc_sql( $post_type );
    4136                 $post_type_in_string = "'" . implode( "','", $post_type ) . "'";
    4137                 $sql = $wpdb->prepare( "
    4138                         SELECT ID
    4139                         FROM $wpdb->posts
    4140                         WHERE post_title = %s
    4141                         AND post_type IN ($post_type_in_string)
    4142                 ", $page_title );
    4143         } else {
    4144                 $sql = $wpdb->prepare( "
    4145                         SELECT ID
    4146                         FROM $wpdb->posts
    4147                         WHERE post_title = %s
    4148                         AND post_type = %s
    4149                 ", $page_title, $post_type );
    4150         }
     4085        return get_post_by( '$title', $page_title, array(
     4086                'post_type' => $post_type,
     4087                'output'    => $output,
     4088        ));
    41514089
    4152         $page = $wpdb->get_var( $sql );
    4153 
    4154         if ( $page ) {
    4155                 return get_post( $page, $output );
    4156         }
    4157 }
     4090}
    41584091
    41594092/**
    41604093 * Identify descendants of a given page ID in a list of page objects.
     
    58575790
    58585791                update_post_caches( $fresh_posts, 'any', $update_term_cache, $update_meta_cache );
    58595792        }
     5793}
     5794
     5795/**
     5796 * Retrieves post data by a given field.
     5797 *
     5798 * See {@link &get_post()} for optional filter and output arguments values.
     5799 *
     5800 * @since 4.4.0
     5801 *
     5802 * @param string $field The field to retrieve the post with.  id | title | path
     5803 * @param int|string $value A value for $field.  A post ID, title, or path.
     5804 * @param string|array $args {
     5805 *     Arguments to modify behavior of get_post_by().
     5806 *
     5807 *     @type string $post_type The post type to constrain the result by. Defaults to 'post'
     5808 *     @type string $output Optional. Either OBJECT, ARRAY_N, or ARRAY_A constant
     5809 *     @type string $filter Optional. Type of filter to apply. Accepts 'raw', 'edit', 'db', or 'display'. Default 'raw'.
     5810 *     @type bool   $use_like Optional. If true then uses a LIKE query for post_title and post_name. Defaults to false.
     5811 * }
     5812 * @return WP_Post|null
     5813 */
     5814function get_post_by( $field, $value, $args = array() ) {
     5815
     5816    global $wpdb;
     5817
     5818        $args = wp_parse_args( $args, array(
     5819        'post_type' => 'post',
     5820        'output'    => 'OBJECT',
     5821        'filter'    => 'raw',
     5822                'use_like'  => false,
     5823    ));
     5824
     5825        $post_type = $args['post_type'];
     5826
     5827    switch ( $field ) {
     5828            case 'id':
     5829                    $post = get_post( $value, $args['output'], $args['filter'] );
     5830                    break;
     5831
     5832            case 'title':
     5833                $sql = $args['use_like'] ? 'post_title LIKE %s' : '%s=post_title';
     5834                    $post = $wpdb->get_var( $wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE {$sql} AND %s=post_type", $value, $post_type ) );
     5835                    break;
     5836
     5837            case 'path':
     5838                    $page_path  = rawurlencode( urldecode( $value ) );
     5839                    $page_path  = str_replace( '%2F', '/', $page_path );
     5840                    $page_path  = str_replace( '%20', ' ', $page_path );
     5841                    $page_paths = '/' . trim( $page_path, '/' );
     5842                    $leaf_path  = sanitize_title( basename( $page_paths ) );
     5843                    $page_paths = explode( '/', $page_paths );
     5844                    $full_path  = '';
     5845                    foreach ( (array) $page_paths as $pathdir ) {
     5846                            $full_path .= ( $pathdir != '' ? '/' : '' ) . sanitize_title( $pathdir );
     5847                    }
     5848
     5849                    $sql = $args['use_like'] ? 'post_name LIKE %s' : '%s=post_name';
     5850                    $pages = $wpdb->get_results( $wpdb->prepare( "SELECT ID,post_name,post_parent FROM {$wpdb->posts} WHERE {$sql} AND (%s=post_type OR 'attachment'=post_type)",
     5851                                    $leaf_path, $post_type ) );
     5852
     5853                    if ( empty( $pages ) ) {
     5854                            $post = null;
     5855                            break;
     5856                    }
     5857
     5858                    foreach ( $pages as $page ) {
     5859                    $path = "/{$leaf_path}";
     5860                    $curpage = $page;
     5861                    while ( 0 !== intval( $curpage->post_parent ) ) {
     5862                    $curpage = $wpdb->get_row( $wpdb->prepare( "SELECT ID,post_name,post_parent FROM {$wpdb->posts} WHERE ID=%d and %s=post_type", $curpage->post_parent, $post_type ) );
     5863                    $path = "/{$curpage->post_name}{$path}";
     5864                    }
     5865
     5866                    if ( $path === $full_path ) {
     5867                            $post = get_post( $page->ID, $args['output'], $args['filter'] );
     5868                            break;
     5869                    }
     5870                    }
     5871                    break;
     5872
     5873                default:
     5874                        $post = null;
     5875        }
     5876
     5877        /*
     5878         * Check to make sure that the post is what we expected.  Set to null if not.
     5879         */
     5880        if ( ! is_object( $post ) || ! property_exists( $post, 'post_type' ) || $post_type !== $post->post_type ) {
     5881          $post = null;
     5882    }
     5883
     5884        return $post;
     5885
    58605886}