it-swarm.com.de

So filtern Sie benutzerdefinierte Posttyp-Archive nach Metawerten

Ich habe ein Problem, bei dem ich versuche, ein Kalender-Plugin für einen Client zu erstellen. Ich habe Probleme, ein datumsbasiertes Archiv für den von mir verwendeten benutzerdefinierten Beitragstyp zu erhalten. Ich kenne mich nicht so gut aus, wie das WordPress-System für den Umgang mit Permalinks auf einem niedrigen Niveau eingerichtet ist, und ich bin an eine Wand gestoßen.

Hintergrund:

Das Plugin registriert einen benutzerdefinierten Beitragstyp, event. Jedes Ereignis hat ein Meta-Wert-Feld namens kultkal_date, das ein Datum in Form von 2011-09-28 enthält. (Ereignisse sind in dem Sinne begrenzt, dass das Datum jedes Ereignisses durch Validierung der Aktion save_post ebenfalls eindeutig ist.).

Ich habe einen benutzerdefinierten Permalink für den Beitragstyp als /kalendarie/%kultkal_year%/%kultkal_month%/%kultkal_day% definiert, sodass die fertige URL möglicherweise wie /kalendarie/2011/09/28/my-slug aussieht. Ich habe Umschreibungs-Tags für den benutzerdefinierten Permalink mit der Aktion init wie folgt hinzugefügt:

add_rewrite_tag('%kultkal_year%','([0-9]{4})');
add_rewrite_tag('%kultkal_month%','([0-9]{2})');
add_rewrite_tag('%kultkal_day%','([0-9]{2})');

Ich habe eine Funktion, um den Permalink zu reparieren, der auf dem post_type_link-Filter ausgeführt wird:

function filter_post_type_link($link, $post){
    if ($post->post_type != 'event')
        return $link;

    if ($date = get_post_meta($post->ID, 'kultkal_date', true)) {
        $dates = explode('-', $date);
        $year = $dates[0];
        $month = $dates[1];
        $day = $dates[2];
    } else {
        return $link;
    }
    $link = str_replace('%kultkal_year%', $year, $link);
    $link = str_replace('%kultkal_month%', $month, $link);
    $link = str_replace('%kultkal_day%', $day, $link);
    return $link;
}

Das Anzeigen einzelner Beiträge funktioniert. Dies gilt auch für die Archivseite (die sich unter der URL /kalendarium/ befindet: has_archive wird bei der Registrierung des Beitragstyps auf kalendarium festgelegt).

Das Problem beginnt, wenn ich die Beiträge nach Jahr filtern möchte, z. B. nach /kalendarium/2011/ oder /kalendarium/2011/09/28/ usw. Ich habe hier eine Antwort zum Filtern basierend auf dem Metawert für das Datum für integrierte Beiträge gefunden: Archivlisten Gefiltert nach Datumswerte in einem benutzerdefinierten Feld/Post-Meta? - aber es scheint nicht auf benutzerdefinierten Beitragstypen zu funktionieren. Sobald ich/year/month/day-parameter hinzufüge, um es zu testen, erhalte ich die Archive für den eingebauten Beitragstyp, nicht einmal einen 404. (Bisher habe ich nur die erste Version in der obigen Antwort ausprobiert , mit allen Parametern (Jahr/Monat/Datum), nicht mit allen Kombinationen + Haken für posts_where usw.

So sieht die (kaputte) Funktion aus, die ich mit pre_get_posts ausführe:

function event_pre_get_posts($query) {
    global $wp_the_query;
    if ($query === $wp_the_query && $query->is_archive()) {
        $qv = &$query->query_vars;
        if (isset($qv['kultkal_year']) && isset($qv['kultkal_month']) && isset($qv['kultkal_day'])) {
            $date = mktime(0,0,0,$qv['kultkal_month'],$qv['kultkal_day'],$qv['kultkal_year']);
            $qv['meta_key'] = 'kultkal_date';
            $qv['meta_value'] = date("Y-m-d", $date);
        }
    }
}

Irgendwelche Ideen, wie ich die gesuchte Lösung erreiche?

4
Emil Björklund

Wie Bainternet in Kommentaren sagte, müssen Sie sich sowohl mit add_query_var als auch mit add_rewrite_rule anlegen.

Wir machen normalerweise etwas Ähnliches wie:

global $wp;
$wp->add_query_var( 'some_var' );
add_rewrite_rule( 'some/path/([^/]+)/?$', 'index.php?some_var=$matches[1]' );

Siehe dieses Wordpress Trac Ticket , sowie Dokumentation zu add_query_var und add_rewrite_rule

1
Tyler Carter