it-swarm.com.de

Wie erhalte ich den nächsten oder vorherigen Beitrag in einem bestimmten Tag?

Ich versuche, innerhalb eines bestimmten Tags (auf der Postseite selbst) Links zu den nächsten und vorherigen Posts zu erstellen, aber ich kann anscheinend kein Plugin oder keine Quelle finden, die dies tun.

Ich möchte in der Lage sein, so etwas unter dem Beitrag anzuzeigen.

get_previous_link("tagname");
get_next_link("tagname");

Kennt jemand einen Weg, um dies zu erreichen? Andernfalls muss ich selbst etwas schreiben, was in Ordnung ist, aber ich dachte, ich würde das Rad nicht neu erfinden, wenn ich nicht muss.

6
The How-To Geek

get_adjacent_post() , das von allen Funktionen verwendet wird, die einen (Link zu) dem nächsten oder vorherigen Beitrag zurückgeben, hat nur ein $in_same_cat-Argument, das die Kategorien betrachtet, in denen sich der Beitrag befindet, nicht die Tags.

Sie könnten sich in den get_[next|previous]_post_join einhängen, um die Join-Abfrage für Ihren Anruf zu ändern, aber dann ist es wahrscheinlich einfacher, die Funktion zu kopieren , den kategoriespezifischen Code zu entfernen und ihn durch einen tagspezifischen Code zu ersetzen. Oder machen Sie es noch allgemeiner und senden Sie es als Patch an WordPress :-)

6
Jan Fabry

Funktioniert das für dieses Problem? http://digwp.com/2010/04/post-navigation-outside-loop/

Der Code in diesem Beitrag funktioniert für "Archive-View Pages" und "Single-View Pages": S

1

Hier ist eine Version des Copy/Paste-Editors, auf die @Jan Fabry oben hingewiesen hat (definitiv nicht die eleganteste Lösung, aber sie sollte funktionieren):

/**
 * Retrieve adjacent post.
 *
 * Can either be next or previous post.
 *
 *
 * @param bool $in_same_tag Optional. Whether post should be in same category.
 * @param string $excluded_tags Optional. Excluded tags IDs.
 * @param bool $previous Optional. Whether to retrieve previous post.
 * @return mixed Post object if successful. Null if global $post is not set. Empty string if no corresponding post exists.
 */
function get_adjacent_post_by_tag($in_same_tag = false, $excluded_tags = '', $previous = true) {
    global $post, $wpdb;

    if ( empty( $post ) )
        return null;

    $current_post_date = $post->post_date;

    $join = '';
    $posts_in_ex_tags_sql = '';
    if ( $in_same_tag || !empty($excluded_tags) ) {
        $join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";

        if ( $in_same_tag ) {
            $tag_array = wp_get_object_terms($post->ID, 'post_tag', array('fields' => 'ids'));
            $join .= " AND tt.taxonomy = 'post_tag' AND tt.term_id IN (" . implode(',', $tag_array) . ")";
        }

        $posts_in_ex_tags_sql = "AND tt.taxonomy = 'post_tag'";
        if ( !empty($excluded_tags) ) {
            $excluded_tags = array_map('intval', explode(' and ', $excluded_tags));
            if ( !empty($tag_array) ) {
                $excluded_tags = array_diff($excluded_tags, $tag_array);
                $posts_in_ex_tags_sql = '';
            }

            if ( !empty($excluded_tags) ) {
                $posts_in_ex_tags_sql = " AND tt.taxonomy = 'post_tag' AND tt.term_id NOT IN (" . implode($excluded_tags, ',') . ')';
            }
        }
    }

    $adjacent = $previous ? 'previous' : 'next';
    $op = $previous ? '<' : '>';
    $order = $previous ? 'DESC' : 'ASC';

    $join  = apply_filters( "get_{$adjacent}_post_join", $join, $in_same_tag, $excluded_tags );
    $where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish' $posts_in_ex_tags_sql", $current_post_date, $post->post_type), $in_same_tag, $excluded_tags );
    $sort  = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1" );

    $query = "SELECT p.* FROM $wpdb->posts AS p $join $where $sort";
    $query_key = 'adjacent_post_' . md5($query);
    $result = wp_cache_get($query_key, 'counts');
    if ( false !== $result )
        return $result;

    $result = $wpdb->get_row("SELECT p.* FROM $wpdb->posts AS p $join $where $sort");
    if ( null === $result )
        $result = '';

    wp_cache_set($query_key, $result, 'counts');
    return $result;
}
1
Jish