How do I get a post (page or CPT) ID from a title or slug?

I’ve scoured the Codex, failed to get get_page_by_title() to work and am quite surprised that there doesn’t seem to be a standard WP function for this task.

I need to get the ID of any given post/ cpt or page using either the slug of the post/ page title. Ideally I’m looking for the following:

Read More

get_post_ID_by_title('My post title', 'customposttype');

What should I be doing?

Related posts

Leave a Reply

5 comments

  1. Update: As of WordPress 3.0 you can use the built-in function get_page_by_title with the third parameter $post_type:

    $post = get_page_by_title( 'Post Title', OBJECT, 'post_type' );
    
    $post_id = $post ? $post->ID : 0;
    

    Original Answer

    you can use this function that jumps by google “get post by title”

    /**
    * Retrieve a post given its title.
    *
    * @uses $wpdb
    *
    * @param string $post_title Page title
    * @param string $post_type post type ('post','page','any custom type')
    * @param string $output Optional. Output type. OBJECT, ARRAY_N, or ARRAY_A.
    * @return mixed
    */
    function get_post_by_title($page_title, $post_type ='post' , $output = OBJECT) {
        global $wpdb;
            $post = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type= %s", $page_title, $post_type));
            if ( $post )
                return get_post($post, $output);
     
        return null;
    }
    
  2. You are missing a function parameter. Throw a null in for the second optional paramter $output and this function should work for you.

    get_page_by_title('My post title', null, 'customposttype');
    

    I just ran into the same issue and adding the null fixed it for me.

  3. I tend to shy away from direct DB queries. Instead, I use the WP_Query object to parse things for me.

    This is, basically, a function I use in one of my themes to get a post based on a given slug:

    function get_post_id( $slug, $post_type ) {
        $query = new WP_Query(
            array(
                'name' => $slug,
                'post_type' => $post_type
            )
        );
    
        $query->the_post();
    
        return get_the_ID();
    }
    

    This will create a query using the WP API to fetch a post of a specific type with a given slug, will run the regular loop functions on the result, and return the ID of the post. You could also use it to return the entire post by modifying the function a bit, but that’s up to you.

  4. This is a few years old now, but it still pops up when searching for this on Google. So, here’s a simple way to do it:

    $page = get_page_by_title( 'my post title' );
    

    or

    $page = get_post_ID_by_title('my post title', OBJECT, 'customposttype');
    

    Then just use the $page object to grab the ID:

    $page->ID
    
  5. Currently (WP >4.9.2) you’ll find your “any” given post/page etc. by title/slug this way:

    $page = get_posts(
        array(
            //'name'      => 'your-post-slug', // by post slug
            'title'      => 'Your post title', // by post title
            'post_type' => 'page' // post type of your preference
        )
    );
    
    if ($page = $page[0]) // First/lowest ID taken if many objects
    {
        // Then you do whatever is needed...
        // $id = $page->id;
        // $content = $page->post_content;
        // or $content = apply_filters('the_content', $page->post_content);
        // etc.
    }