Funktionsweise

Die grundlegende Funktionsweise solcher Plugins ist im Prinzip immer die Gleiche. Sie suchen anhand von entweder den Artikeltags oder der Artikelkategorie weitere Artikel aus der Datenbank heraus, die ebenfalls diese Tags oder Kategorie haben. Nun, das kann man auch mit einer kleinen Funktion selbst in sein WordPress-Blog einbinden. Ist gar nicht so schwer, man muss nur – wie sollte es auch anders sein – an die functions.php des jeweiligen Themes heran und für die Ausgabe der relevanten Artikel auch an die (content-)single.php (diese Datei hat leider je nach Theme einen etwas anderen Namen), hier wird die Funktion dann aufgerufen.

An dieser Stelle sei gesagt, solche Änderungen bitte immer nur an einem Child-Theme vornehmen, somit bleibt euer Theme updatefähig und wird – im Zweifelsfalle – nicht beschädigt, falls etwas schief geht.

Funktion einbinden

Wie ich schon sagte, muss man hierfür an die functions.php heran, diese wird um eine kleine Funktion erweitert.

Natürlich möchte ich noch ein paar Worte zur Funktion selbst verlieren. Innerhalb dieser wird eine eigene Thumbnailgröße definiert, um die Anzeige der relevanten Artikel mit eigenen Thumbnails der jeweiligen Artikelbilder auszustatten. Sieht einfach schöner aus. Sollte der Artikel selbst kein Artikelbild enthalten, so wird ein Platzhalterbild angezeigt, welches die Größe des gesuchten Thumbnails hat.

Es sind also zwei Dinge empfehlenswert:

Ein Platzhalterbild zu erstellen und unter /wp-content/themes/<dein-theme>/images/placeholder/postthumbnail-related-post.jpg zu speichern und um von den schon vorhandenen Bildern das neue Thumbnail generieren zu lassen das Plugin Regenerate Thumbnails zu installieren. Dieses Plugin generiert von allen Bildern in der Mediathek die jeweiligen Thumbnails, die innerhalb des Themes Verwendung finden. Keine Panik um eure Bilder, läuft alles ganz hervorragend.

Aber nun zur Funktion, natürlich kann auch hier gewählt werden, ob die relevanten Artikel anhand der Artikeltags oder der Artikelkategorien erstellt werden und wie viele relevante Artikel angezeigt werden sollen. Und das war es schon an Einstellungsmöglichkeiten. Also schlank und einfach.

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<?php
/**
 * Displaying related posts under the article
 *
 * Usage:
 *      if(function_exists('my_related_posts')) {
 *          my_related_posts('tag', 5); // for related posts by tag
 *          my_related_posts('category', 5); // for related posts by category
 *      }
 *
 * @param string (optional) $var_sRelatedBy Related article by 'tag' or 'category'. Default 'tag'
 * @param int (optional) $var_iPostsPerPage Number of related articles. Default 5
 */

if(!function_exists('my_related_posts')) {
    function my_related_posts($var_sRelatedBy = 'tag', $var_iPostsPerPage = 5) {
        /**
         * Adding an imagesize for thumbnails on related posts
         * width: 230px
         * height: 115px
         */

        add_image_size('related-post', 230, 115, true);

        $var_sHasRelatedIn = false;
        $var_iPostId = get_the_ID();

        /**
         * Setting WP_Query arguments depending on $var_sRelatedBy.
         */

        switch($var_sRelatedBy) {
            /**
             * Related posts by tag
             */

            case 'tag':
                $array_Tags = wp_get_post_tags($var_iPostId);

                if(count($array_Tags) != 0) {
                    $var_sHasRelatedIn = true;
                    $array_TagIds = array();

                    foreach($array_Tags as $each_tag) {
                        $array_TagIds[] = $each_tag->term_id;
                    } // END foreach($array_Tags as $each_tag)

                    $array_QryArgs['tag__in'] = $array_TagIds;
                } // END if(count($array_Tags) != 0)
                break;

            /**
             * Related posts by category
             */

            case 'category':
                $array_Categories = get_the_category($var_iPostId);

                if(count($array_Categories) != 0) {
                    $var_sHasRelatedIn = true;
                    $array_CatIds = array();

                    foreach($array_Categories as $each_tag) {
                        $array_CatIds[] = $each_tag->term_id;
                    } // END foreach($array_Categories as $each_tag)

                    $array_QryArgs['category__in'] = $array_CatIds;
                } // END if(count($array_Categories) != 0)
                break;
        } // END switch($var_sRelatedBy)

        /**
         * Only if we have a base (one or mor tags/categories) to search for related posts.
         * Otherwise return and end this function
         */

        if($var_sHasRelatedIn === true) {
            /**
             * Setting the rest of our WP_Query arguments
             */

            $array_QryArgs['post__not_in'] = array(
                $var_iPostId
            );
            $array_QryArgs['posts_per_page'] = $var_iPostsPerPage;
            $array_QryArgs['post_status'] = 'publish';
            $array_QryArgs['post_type'] = 'post';
            $array_QryArgs['orderby'] = 'rand';

            /**
             * Comparing WordPress versions to get the right call for ignoring sticky posts
             *
             * WordPress < 3.1 = caller_get_posts
             * WordPress >= 3.1 = ignore_sticky_posts
             */

            if(version_compare(WP_VERSION_RUNNING, '3.1', '>')) {
                $array_QryArgs['caller_get_posts'] = 1;
            } else {
                $array_QryArgs['ignore_sticky_posts'] = 1;
            } // END if(version_compare(WP_VERSION_RUNNING, '3.1', '>'))

            $relatedArticles = new WP_Query($array_QryArgs);

            /**
             * If there are related posts.
             */

            if($relatedArticles->have_posts()) {
                echo '<div class="my-related-articles clearfix">';
                echo '<h3>' . _n('Related Article', 'Related Article(s)', $relatedArticles->post_count, MY_TEXTDOMAIN) . ':</h3>';
                echo '<ul>';

                /**
                 * loop through the posts and list each until done.
                 */

                while($relatedArticles->have_posts()) {
                    $relatedArticles->the_post();

                    echo '<li>';

                    /**
                     * Looking for post thumbnail
                     *
                     * If we don't find it, take the placeholder
                     * filed in /wp-content/theme/<your-theme>/images/placeholder/postthumbnail-related-post.jpg
                     * So don't forget to place the image it here!
                     *
                     * Dimensions for the placeholder image:
                     * width: 230px
                     * height: 115px
                     */

                    if(has_post_thumbnail()) {
                        the_post_thumbnail('related-post');
                    } else {
                        echo '<img width="230" height="115" title="' . __('Placeholder Postthumbnail Related Posts', MY_TEXTDOMAIN) . '" alt="' . __('Placeholder Postthumbnail Related Posts', MY_TEXTDOMAIN) . '" class="attachment-related-article wp-post-image" src="' . get_template_directory_uri() . '/images/placeholder/postthumbnail-related-post.jpg" />';
                    } // END if(has_post_thumbnail())

                    echo '<p><a href="' . get_permalink() . '" rel="bookmark" title="' . __('Permanent Link to: ', MY_TEXTDOMAIN) . the_title_attribute(array('echo' => false)) . '">' . get_the_title() . '</a></p>';
                    echo '<p>' . get_the_excerpt('excerpt', '150') . ' ...</p>';
                    echo '<p><a class="talos-read-more related-post-read-more" href="' . get_permalink() . '" rel="bookmark" title="' . __('Permanent Link to: ', MY_TEXTDOMAIN) . the_title_attribute(array('echo' => false)) . '">' . __('read more', MY_TEXTDOMAIN) . '</a></p>';
                    echo '</li>';

                } // END while($relatedArticles->have_posts())

                echo '</ul>';
                echo '</div>';
            } // END if($relatedArticles->have_posts())

            /**
             * Destroy the previous query. This is a MUST,
             * otherwise you will get the WRONG comments
             * (comments assigned to the wrong post),
             * and sometimes categories and tags are for the wrong post.
             */

            wp_reset_query();
        } else {
            return;
        } // END if($var_sHasRelatedIn === true)
    } // END function my_related_posts()
} // END if(!function_exists('my_related_posts'))
?>

Anzeige unter Artikel

Um nun die relevanten Artikel unter dem Artikel anzeigen zu lassen, muss man nur noch schnell an die (content-)single.php heran, denn diese ist für die Darstellung des Einzelartikels zuständig. Hier wird schlicht und einfach die neue Funktion an entsprechender Stelle aufgerufen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
/**
 * 5 Relevante Artikel anhand der Tags
 */

if(function_exists('my_related_posts')) {
    my_related_posts('tag', 5);
}
?>

<?php
/**
 * 5 Relevante Artikel anhand der Kategorie
 */

if(function_exists('my_related_posts')) {
    my_related_posts('category', 5);
}
?>

Und schon werden, wenn alles richtig gemacht wurde, die relevanten Artikel unter dem jeweiligen Artikel angezeigt.

Ich wünsche viel Spaß :-)

Artikel / Seite weiterempfehlen

4 Meinungen zu “WordPress: Relevante Artikel ohne Plugin anzeigen

Hinterlasse eine Antwort

Ihre Email-Adresse wird nicht veröffentlicht. Pflichtfelder sind durch * markiert.

Sie können folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>