Make WordPress Core

Ticket #36905: 36905.7.patch

File 36905.7.patch, 6.1 KB (added by spacedmonkey, 6 years ago)
  • src/wp-includes/post.php

     
    47714771 * @return WP_Post|array|null WP_Post (or array) on success, or null on failure.
    47724772 */
    47734773function get_page_by_title( $page_title, $output = OBJECT, $post_type = 'page' ) {
    4774         global $wpdb;
    47754774
    4776         if ( is_array( $post_type ) ) {
    4777                 $post_type           = esc_sql( $post_type );
    4778                 $post_type_in_string = "'" . implode( "','", $post_type ) . "'";
    4779                 $sql                 = $wpdb->prepare(
    4780                         "
    4781                         SELECT ID
    4782                         FROM $wpdb->posts
    4783                         WHERE post_title = %s
    4784                         AND post_type IN ($post_type_in_string)
    4785                 ",
    4786                         $page_title
    4787                 );
    4788         } else {
    4789                 $sql = $wpdb->prepare(
    4790                         "
    4791                         SELECT ID
    4792                         FROM $wpdb->posts
    4793                         WHERE post_title = %s
    4794                         AND post_type = %s
    4795                 ",
    4796                         $page_title,
    4797                         $post_type
    4798                 );
     4775        $last_changed = wp_cache_get_last_changed( 'posts' );
     4776
     4777        $hash      = md5( $page_title . serialize( $post_type ) );
     4778        $cache_key = "get_page_by_title:$hash:$last_changed";
     4779        $cached    = wp_cache_get( $cache_key, 'posts' );
     4780        if ( false !== $cached ) {
     4781                // Special case: '0' is a bad `$page_path`.
     4782                if ( '0' === $cached || 0 === $cached ) {
     4783                        return null;
     4784                } else {
     4785                        return get_post( $cached, $output );
     4786                }
    47994787        }
    48004788
    4801         $page = $wpdb->get_var( $sql );
     4789        // Make sure that we even query post statuses that are excluded from search
     4790        $post_status = array_values( get_post_stati( array( 'exclude_from_search' => true ) ) );
     4791        $posts       = get_posts(
     4792                array(
     4793                        'title'            => $page_title,
     4794                        'post_type'        => $post_type,
     4795                        'posts_per_page'   => 1,
     4796                        'post_status'      => array_merge( $post_status, array( 'any' ) ),
     4797                        'orderby'          => 'none',
     4798                        'suppress_filters' => false,
     4799                        'fields'           => 'ids',
     4800                )
     4801        );
    48024802
    4803         if ( $page ) {
    4804                 return get_post( $page, $output );
     4803
     4804        if ( $posts ) {
     4805                wp_cache_set( $cache_key, $posts[0], 'posts' );
     4806
     4807                return get_post( $posts[0], $output );
    48054808        }
     4809
     4810        // Cache a miss as well.
     4811        wp_cache_set( $cache_key, 0, 'posts' );
     4812
     4813        return null;
    48064814}
    48074815
    48084816/**
  • tests/phpunit/tests/post/getPageByTitle.php

     
     1<?php
     2
     3/**
     4 * @group post
     5 */
     6class Tests_Post_GetPageByTitle extends WP_UnitTestCase {
     7
     8        /**
     9         * @ticket 36905
     10         */
     11        public function test_get_page_by_title() {
     12                $page_id       = self::factory()->post->create_object( array( 'post_title' => 'Some Page', 'post_type' => 'page' ) );
     13                $page = get_page_by_title( 'some Page' );
     14                $this->assertEquals( $page_id, $page->ID );
     15        }
     16
     17        /**
     18         * @ticket 36905
     19         */
     20        public function test_should_not_care_about_cases() {
     21                $page_id       = self::factory()->post->create_object( array( 'post_title' => 'Some Page', 'post_type' => 'page' ) );
     22                $page = get_page_by_title( 'soMe paGE' );
     23                $this->assertEquals( $page_id, $page->ID );
     24        }
     25
     26        /**
     27         * @ticket 36905
     28         */
     29        public function test_should_match_exact_title() {
     30                $page_id       = self::factory()->post->create_object( array( 'post_title' => 'Some Page', 'post_type' => 'page' ) );
     31
     32                $page = get_page_by_title( 'Some Page Yeah' );
     33                $this->assertNull( $page );
     34
     35                $page = get_page_by_title( 'Yeah Some Page' );
     36                $this->assertNull( $page );
     37        }
     38
     39        /**
     40         * @ticket 36905
     41         */
     42        public function test_should_return_one_result_if_some_posts_has_the_same_title() {
     43                $post_id_1       = self::factory()->post->create_object( array( 'post_title' => 'Some Title', 'post_type' => 'page' ) );
     44                $post_id_2       = self::factory()->post->create_object( array( 'post_title' => 'Some Title', 'post_type' => 'page' ) );
     45                $post = get_page_by_title( 'Some Title' );
     46                $this->assertEquals( $post_id_1, $post->ID );
     47        }
     48
     49        /**
     50         * @ticket 36905
     51         */
     52        public function test_should_obey_post_type() {
     53                register_post_type( 'my-cpt' );
     54                $post_id       = self::factory()->post->create_object( array( 'post_title' => 'Some CPT', 'post_type' => 'my-cpt' ) );
     55
     56                $post = get_page_by_title( 'Some CPT', OBJECT, 'my-cpt' );
     57                $this->assertEquals( $post_id, $post->ID );
     58
     59                $post = get_page_by_title( 'Some CPT', OBJECT, 'page' );
     60                $this->assertNull( $post );
     61        }
     62
     63        /**
     64         * @ticket 36905
     65         */
     66        public function test_should_get_different_post_types() {
     67                register_post_type( 'my-cpt' );
     68                $post_id_1       = self::factory()->post->create_object( array( 'post_title' => 'Some CPT', 'post_type' => 'my-cpt' ) );
     69                $post_id_2       = self::factory()->post->create_object( array( 'post_title' => 'Some Page', 'post_type' => 'page' ) );
     70                $post = get_page_by_title( 'Some Page', OBJECT, array( 'my-cpt', 'page' ) );
     71                $this->assertEquals( $post_id_2, $post->ID );
     72        }
     73
     74        /**
     75         * @ticket 36905
     76         */
     77        public function test_should_get_different_post_statuses() {
     78                register_post_type( 'my-cpt' );
     79
     80                $post_statuses = get_post_stati();
     81                foreach ( $post_statuses as $post_status ) {
     82                        $title = sprintf( 'Some %s post', $post_status );
     83                        $post_id       = self::factory()->post->create_object( array( 'post_title' => $title, 'post_type' => 'page', 'post_status' => $post_status ) );
     84                        $found = get_page_by_title( $title );
     85                        $this->assertEquals( $post_id, $found->ID );
     86                }
     87        }
     88
     89        /**
     90         * @ticket 36905
     91         */
     92        public function test_output_param_should_be_obeyed() {
     93                $post_id       = self::factory()->post->create_object( array( 'post_title' => 'Some Page', 'post_type' => 'page' ) );
     94
     95                $found = get_page_by_title( 'Some Page' );
     96                $this->assertInternalType( 'object', $found );
     97                $this->assertSame( $post_id, $found->ID );
     98
     99                $found = get_page_by_title( 'Some Page', OBJECT );
     100                $this->assertInternalType( 'object', $found );
     101                $this->assertSame( $post_id, $found->ID );
     102
     103                $found = get_page_by_title( 'Some Page', ARRAY_N );
     104                $this->assertInternalType( 'array', $found );
     105                $this->assertSame( $post_id, $found[0] );
     106
     107                $found = get_page_by_title( 'Some Page', ARRAY_A );
     108                $this->assertInternalType( 'array', $found );
     109                $this->assertSame( $post_id, $found['ID'] );
     110        }
     111
     112
     113
     114}