toscho.design

WordPress: ID anhand des Titels herausfinden

Viele Template-Funktionen in WordPress erwarten eine ID als Argument – wp_list_pages() beispielsweise schließt damit einzelne Seiten aus.
Damit ich nun nicht immer suchen muß, habe ich mir einen kleinen Helfer in die Template-Tools gesetzt. Auszug:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
/**
 * Toscho’s Template Tools
 *
 * Helpers for WordPress templates.
 *
 * @author  Thomas Scholz <[email protected]>
 * @version 1.1
 *
 */
class TTT
{
    /**
     * Retrieves a post/page/custom-type/taxonomy ID by its title.
     *
     * Returns only the first result. If you search for a post title
     * that you have used more than once, restrict the type.
     * Or don’t use this function. :)
     * Simple usage:
     * $page_start_id = TTT::id_by_title('Start');
     *
     * To get the ID of a taxonomy (category, tag, custom) set $tax
     * to the name of this taxonomy.
     * Example:
     * $cat_css_id = TTT::id_by_title('CSS', 0, 'category');
     *
     * The result is cached internally to save db queries.
     *
     * @param  string      $title
     * @param  string      $type Restrict the type.
     * @param  string|bool $tax Taxonomy to search for.
     * @return int         ID or -1 on failure
     */
    static function id_by_title($title, $type = 'any', $tax = FALSE)
    {
        static $cache = array ();
        $title = mysql_real_escape_string( trim($title, '"\'') );
        // Unique index for the cache.
        $index = "$title-$type-" . ( $tax ? $tax : 0 );
        if ( isset ( $cache[$index] ) )
        {
            return $cache[$index];
        }
        if ( $tax )
        {
            $taxonomy      = get_term_by('name', $title, $tax);
            $cache[$index] = $taxonomy ? $taxonomy->term_id : -1;
            return $cache[$index];
        }
        $type_sql = 'any' == $type
            ? ''
            : "AND post_type = '"
                . mysql_real_escape_string($type) . "'";
        global $wpdb;
        $query = "SELECT ID FROM $wpdb->posts
            WHERE (
                    post_status = 'publish'
                AND post_title = '$title'
                $type_sql
            )
            LIMIT 1";
        $result = $wpdb->get_results($query);
        $cache[$index] = empty ( $result ) ? -1 : (int) $result[0]->ID;
        return $cache[$index];
    }
}

Im praktischen Einsatz sieht das dann so aus:

1
2
3
4
5
6
7
8
9
10
<?php
wp_list_pages(
    array (
        'sort_column'   =>  'menu_order',
        'depth'         =>  1,
        'title_li'      =>  '',
        'exclude'       =>  TTT::id_by_title('Start')
    )
);
?>

Vorsicht: Wenn man einen Titel mehrmals verwendet hat, liefert die Funktion eventuell nicht die ID zurück, die man sich erhofft hat.

Im Backend findet man die meisten IDs übrigens am besten mit Hilfe dieses ungeheuer nützlichen Plugins: Simply Show IDs.

Mehr solches Zeug:

2 Kommentare

  1. Ralf Hortt am 05.07.2010 · 14:40

    Am einfachsten finde ich eigentlich in der Statusleiste über den Link bearbeiten zu fahren.

  2. Thomas Scholz am 05.07.2010 · 16:42

    @Ralf Hortt: PHP hat keine Maus.