Artikel mit ‘Wordpress’ getagged

Donnerstag, 4. März 2010

WordPress: Felder dem Kommentar-Formular hinzufügen

Beim Basteln eines WordPress Themes, bin ich auf das Problem gestoßen, dass ich meinen Kommentaren gerne ein Feld für die Twitter-ID hinzufügen wollte. Zuerst bin ich auf das Plugin Extra Comment Fields gestoßen. Das Plugin hat mir aber die Kommentar-Seite im Backend zerschossen und war für mich deshalb nicht brauchbar. Zum Glück bin ich auf eine viel bessere Lösung gestoßen. WordPress bietet seit der Version 2.9 die Möglichkeit, Meta-Felder den Kommentaren hinzuzufügen.

Zuerst muss dafür der functions.php dieser Code hinzugefügt werden:

1
2
3
4
5
add_action ('comment_post', 'add_meta_settings', 1);

function add_meta_settings($post_id) {
add_comment_meta($post_id, 'twitterid', $_POST['twitterid'], true);
}

Dann muss das Kommentar-Formular in der comments.php um das Twitter-Feld erweitert werden.

1
2
<label for="twitterid">Twitter Name:</label><br />
<input type="text" class="ipt-name" name="twitterid" id="twitterid" >

Jetzt wird beim Abschicken eines Kommentars die Twitter-ID gespeichert und man muss sich nur noch um die Ausgabe kümmern. Dies geht wieder in der comments.php in der Schleife der Kommentar-Ausgabe.

1
2
3
$twitterid_array= get_comment_meta(get_comment_ID(),"twitterid");
$twitterid = $twitterid_array[0];
if (isset($twitterid)) echo $twitterid;

Was haltet Ihr von der neuen Funktion? Welche Felder fehlen Euch?

Freitag, 13. November 2009

WordPress: Anzahl der angezeigten Posts pro Seite ändern

Bei den Arbeiten an meinem Fotoblog bin ich auf ein Problem gestoßen. Ich wollte, dass für eine Kategorie und deren Unterkategorie nur ein Post pro Archivseite dargestellt wird. Dies kann man laut Dokumentation mit folgendem Code vor der Loop machen:

1
2
3
4
5
6
7
8
9
10
11
12
13
// Das Query
global $query_string;
query_posts($query_string . "&posts_per_page=5");

// Die Loop
if ( have_posts() ) : while ( have_posts() ) : the_post();
 ..
endwhile; else:
 ..
endif;

// Query zurücksetzen
wp_reset_query();

Also habe ich den Code in der archive.php verpackt und vorher je nach Kategorie posts_per_page verändert. Leider hat das in den Unterkategorien nicht funktioniert. Ich bin immer wieder auf 404 Seiten gelandet. :-( Ich habe schon einen WordPress-Bug vermutet und auf anraten anderer Entwickler ein Ticket eröffnet. Das Ticket wurde mit dem Hinweis, dass dies ein normales WordPress-Verhalten sei, geschlossen. Grund hierfür ist, dass WordPress das Paging errechnet bevor das Query abgeschickt wird, d.h. Query und errechnetes Paging stimmen nicht überein. Zum Glück hat der Entwickler, der das Ticket bearbeitet hat, mir einen Workaround aufgezeigt.
Das Problem lässt sich mit Hilfe eines Filters beheben. Dieser wird in der functions.php mit diesem Code gesetzt.

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
// Filter hinzufügen
add_filter('request', 'set_post_per_page_for_cat');

function set_post_per_page_for_cat($vars) {
   
    // ID der Kategorie, bei der und deren Unterkategorien posts_per_page geändert werden sollen
    $cat = 7;
   
    // Anzahl der Posts
    $post_count = 1;

    // Aktuelle Kategorie
    $cur_category_slug = get_term_by( 'slug', $vars['category_name'], 'category' );
    $cur_category = $cur_category_slug->term_id;
    if ( $cat == $cur_category ) {
        // Wenn die Kategorie die zu Ändernde ist
        $vars['posts_per_archive_page'] = $post_count;
        return $vars;
    } else {
        $subcats=explode('/',get_category_children($cat));
        if( in_array($cur_category, $subcats) ){
            // Wenn die Kategorie eine Unterkategorie der zu Ändernden ist
            $vars['posts_per_archive_page'] = $post_count;
            return $vars;
        }  
    }
   
    $vars['posts_per_archive_page']=get_option('posts_per_page');
    return $vars;
}

Ich hoffe dieser Codeschnipsel hilft Euch weiter. Freue mich über Fragen und Anregungen. :-)

Mittwoch, 14. Oktober 2009

Fotoblog mit YAPB in WordPress integrieren

Wie einige von Euch sicherlich schon gesehen haben, gibt es seit einiger Zeit ein Fotoblog Widget auf meiner Seite. Dies war aber nur der erste Schritt der Fotoblogintegration in WordPress, die ich jetzt fürs Erste abgeschlossen habe.

Klar nun fragen sich bestimmt einige, warum hat er seine Bilder nicht bei Flickr oder Picasa? Zum Einen wollte ich die Bilder nicht aus der Hand geben und zum Anderen mag ich es, wenn alles aus einem Guss ist. Deshalb habe ich nach einer Lösung mit und für WordPress gesucht. Mit dem YAPB Plugin habe ich eine für mich ideale Lösung gefunden.

YAPB steht für Yet Another PhotoBlog und erweitert WordPress um Fotoblog-Funktionen. Für die Standardfunktionen muss nicht einmal ein Theme verändert werden, denn der Fotoblog integriert sich sehr gut in WordPress.

Für die Anzeige der Bilder in der Sidebar, muss noch das YAPB Sidebar Widget installiert werden.

Da ich aber YAPB mehr mit meinem Theme verzahnen wollte, habe ich einige Änderungen vornehmen müssen, die ich Euch nach dem Aufräumen im Code gerne in Form eines YAPB fähigen WordPress Themes zur Verfügung stellen will. Mein Ziel war es den Fotoblog anders als den Hauptblog aussehen zu lassen und trotzdem eine enge Verzahnung zu schaffen. Am Besten schaut Ihr Euch das Ergebnis einfach an. :-)

Dienstag, 16. Juni 2009

Pagination in WordPress Theme einbauen

Da WordPress standardmäßig kein vernünftiges Paging – Blättern durch die Artikel beinhaltet – lässt es sich, wie schonmal von mir beschrieben mit einem Plugin um ein solches erweitern. Dies macht das Blättern im Blog für den Besucher viel angenehmer.
Nun wollte ich das Paging nicht mehr mit Hilfe eines Plugins lösen, sondern fest in das Theme einbauen. Bevor ich Euch erkläre, wie ich das gelöst habe, möchte ich Euch zeigen, wie das fertige Paging aussieht.

paging

Nun zum Programm-Code. Zuerst habe ich folgende Funktion geschrieben, die das Paging berechnet und es herausschreibt:

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
function wp_pagination_navi($num_page_links = 5, $min_max_offset = 2){

    global $wp_query;
   
    // Do not show paging on single pages
    if( !is_single() ){
               
        $current_page       = intval(get_query_var('paged'));
        $total_pages        = $wp_query->max_num_pages;
        $left_offset        = floor(($num_page_links - 1) / 2);
        $right_offset       = ceil(($num_page_links -1) / 2);
        if( empty($current_page) || $current_page ==  0 ) {
            $current_page = 1;
        }
        // More than one page -> render pagination
        if ( $total_pages > 1 ) {
       
            echo '<div class="pagination_navi">';
           
            if ( $current_page > 1 ) {
  echo '<a href="' .get_pagenum_link($current_page-1) .'" title="vorherige Seite">&laquo;</a>';
            }
            for ( $i = 1; $i <= $total_pages; $i++) {
                if ( $i == $current_page ){
                    // Current page
                    echo '<a href="'.get_pagenum_link($current_page).'" class="current-page" title="Seite '.$i.'" >'.($current_page).'</a>';
                } else {
                    // Pages before and after the current page
                    if ( ($i >= ($current_page - $left_offset)) && ($i <= ($current_page + $right_offset)) ){
                        echo '<a href="'.get_pagenum_link($i).'" title="Seite '.$i.'" >'.$i.'</a>';
                    } elseif ( ($i <= $min_max_offset) || ($i > ($total_pages - $min_max_offset)) ) {
                        // Start and end pages with min_max_offset
                        echo '<a href="'.get_pagenum_link($i).'" title="Seite '.$i.'" >'.$i.'</a>';
                    } elseif ( (($i == ($min_max_offset + 1)) && ($i < ($current_page - $left_offset + 1))) ||
                               (($i == ($total_pages - $min_max_offset)) && ($i > ($current_page + $right_offset ))) ) {
                        // Dots after/before min_max_offset
                        echo '<span class="dots">...</span>';
                    }
                }
            }
            if ( $current_page != $total_pages ) {
                echo '<a href="'.get_pagenum_link($current_page+1).'" title="n&auml;chste Seite">&raquo;</a>';
            }
            echo '</div>'; //Close pagination
        }
    }
}

Der erste Parameter gibt die Zahl der Seitenlinks an, die angezeigt werden sollen. Eine ungerade Zahl ist hier am Besten. Der zweite Parameter legt fest, wie viele Seitenlinks am Anfang und am Ende dargestellt werden sollen.
Diese Funktion muss in die functions.php im Theme Ordner.

Nun kann man diese Funktion in die Theme Dateien, welche mehrere Artikel auflisten und diese über mehrere Seiten verteilen, mit diesem Code aufrufen und das Paging somit in diese Seiten einfügen:

1
2
3
4
5
<?php
if( function_exists('wp_pagination_navi') ) {
    wp_pagination_navi();
}  
?>

Bei den Dateien handelt es sich um die index.php, die archive.php und die search.php. Am Besten ersetzt man darin folgende Code Zeilen:

1
2
3
4
<div class="navigation">
    <div class="alignleft"><?php next_posts_link(__('&laquo; Older Entries'), 'kubrick'); ?></div>
    <div class="alignright"><?php previous_posts_link(__('Newer Entries &raquo;', 'kubrick')); ?></div>
</div>

Wie Ihr sehen könnt, habe ich die Funktion ohne Parameter aufgerufen, da mir die Standardeinstellungen genügen.

Damit das Paging jetzt auch noch gut aussieht, muss man folgende Zeilen in die style.css einfügen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.pagination_navi{
    text-align: center;
}

.pagination_navi a {
    border:1px solid #6EA1CE;
    font-size: 0.7em;
    font-weight:normal;
    padding: 2px 6px;
    margin: 2px 4px;
}
.pagination_navi a.current-page{
    border:1px solid #fff;
    color: #fff;
}

.pagination_navi a:hover{
    border:1px solid #46C;
    color: #46C;
}

Den Code könnt Ihr nach belieben anpassen und ändern. Über Verbesserungsvorschläge und Ideen würde ich mich freuen. :-)

Montag, 8. Juni 2009

WordPress 2.8 RC 1: Erste Eindrücke

Ich habe heute WordPress 2.8 RC 1 installiert und muss sagen, ich bin sehr zufrieden mit der neuen Version. Besonders hervorzuheben ist für mich die Möglichkeit dem Administrations-Dashboard mehrere Spalten zu verpassen und somit die Bildschirmbreite besser zu nutzen. Weiterhin ist die neue Widget-Verwaltung ein Traum gegenüber der Alten. Widgets lassen sich nun per Drag’n'Drop in die jeweilige Sidebar ziehen, auch Wechsel von der Einen in die Andere sind so einfach möglich. Etwas gewöhnungsbedürftig ist meiner Meinung nach die neue Plugin Übersicht. Einen Überblick über die neuen Funktionen  und die Änderungen gibt es bei WordPress Deutschland.

Nach der Installation musste ich das CDN Tools Plugin deaktivieren, da dieses den Artikel-/Seiten-/Kommentareditor lahm legt. Leider kann man, da es sich um einen Release Candidate handelt, nicht genau sagen ob das Plugin oder WordPress daran schuld ist. Sollte ich jedoch den Grund finden, werde ich dementsprechend einen Bugreport stellen. Ansonsten läuft alles wie geschmiert und irgendwie fühlbar schneller.