2009-08-13 5 views
0

Auf meiner Homepage habe ich eine Liste von Beiträgen, und oben möchte ich nur den letzten "klebrigen" Beitrag anzeigen, gefolgt von den restlichen Beiträgen . Gibt es einen Weg, dies zu erreichen?Zeige nur einen klebrigen Beitrag an der Spitze einer Liste von Beiträgen

Bonuspunkte für nur eine query_posts().

(Ich weiß, wie es zu tun zwei mit query_posts(), aber ich bin für eine weniger belastend Lösung suchen.)

+0

Das Problem ist, sobald ich die "sticky" -Option für einen anderen Beitrag überprüfen, werde ich zwei klebrige Beiträge an der Spitze meiner Liste haben, und diese werden weiter wachsen, während ich weiterhin neue "sticky" Beiträge hinzufügen. Ich möchte nur 1 klebrigen Beitrag angezeigt werden. – gabriel

Antwort

0

Sie werden diesen Code ein bisschen zwicken müssen, aber es sollte Sie in den richtigen losgeht Richtung. Das ändert die SQL-Abfrage, die verwandt wird, um die Posts zu ziehen.

Vor Ihrem query_posts(); Fügen Sie den folgenden Code hinzu:

function selectSticky($sql){ 
    global $sticky_posts, $wpdb; 

    $sticky_posts = get_option('sticky_posts'); 
    $sticky_posts = implode(', ', $sticky_posts); 

    return "IF({$wpdb->posts}.ID IN ($sticky_posts), 2, 1) as sticky, ".$sql; 
} 

function whereSticky($sql){ 
    global $sticky_posts, $wpdb; 

    $sql .= " OR {$wpdb->posts}.ID IN ($sticky_posts)"; 
    return $sql; 
} 

function orderSticky($sql){ 
    $sql = "sticky DESC, ".$sql; 
    return $sql; 
} 

// just for checking sql, you can remove this once everything works 
function requestSticky($sql){ 
    echo $sql."<br/><br/>"; 
    return $sql; 
} 

add_action('posts_fields', 'selectSticky'); 
add_action('posts_where', 'whereSticky'); 
add_action('posts_orderby', 'orderSticky'); 
add_action('posts_request', 'requestSticky'); 
+0

danke für die Antwort! Wow, ich habe nicht mit etwas gerechnet, das so einfach zu sein scheint, um solch eine grässliche Menge an Code-yikes einzubeziehen! Ich frage mich auch, warum das WP-Kernteam der Tabelle "wp_posts" nicht nur eine "sticky" -Spalte hinzugefügt hat ... – gabriel

+0

Wenn Sie die SQL-Abfrage kennen, die die richtigen Ergebnisse liefert, können Sie die ersten drei Aktionen überspringen/Funktionen und nur die Abfrage in requestSticky() zurückgeben. Obwohl ich von der Spitze meines Kopfes entfernt bin, kann ich mir nur eine Lösung für das mehrfache Problem mit einer UNION-Abfrage vorstellen, die nicht wirklich sql-mäßig Aufwand spart, obwohl es weniger Arbeit für PHP wäre. – postpostmodern

1

Haben Sie irgendwelche Plugins ausprobiert? Zum Beispiel das? http://wordpress.org/extend/plugins/wp-sticky/ Ich könnte einfacher sein, sie zu benutzen/zu modifizieren.

+0

Danke, Umut, aber ich würde lieber keine Plugins verwenden, die Funktionen duplizieren, die bereits in WP Core sind. – gabriel