it-swarm.com.de

Add from Variablen to Posten the query

Wie füge ich der WordPress-Abfrage benutzerdefinierte Variablen hinzu, ohne die Datenbank zweimal zu öffnen? Im folgenden Beispiel möchte ich einige Metafilter hinzufügen. All dieser Code funktioniert gut, aber ich habe query_posts () ausgeführt, um ihn auszuführen. Ich möchte in der Lage sein, der Abfrage etwas hinzuzufügen, bevor sie standardmäßig ausgeführt wird, damit ich die Datenbank nicht zweimal abfragen muss.

In diesem Fall hatte ich gehofft, wenn ich $ wp_query-> query ändere, bevor es ausgeführt wird, werden meine Änderungen zur Abfrage hinzugefügt. Die Abfrage wird in Ordnung geändert, nur nicht die Ausgabe. Irgendwelche Ideen? Vielen Dank.

add_action('pre_get_posts', 'my_custom_query'); 
function my_custom_query(){

if(isset($_SESSION['size']) && $_SESSION['size'] != 'all'){
    $cfilter[] = array( 'key' => 'cc_size', 'value' => $_SESSION['size'] );
}

if(isset($_SESSION['gender']) && $_SESSION['gender'] != 'all'){
    $cfilter[] = array( 'key' => 'cc_gender', 'value' => $_SESSION['gender'] );
}


$extraArgs = array(
    'orderby' => 'post-title',
    'paged' => get_query_var('paged')
);


if(!empty($cfilter)){ $extraArgs['meta_query'] = $cfilter; }

global $wp_query;
$wp_query->query = array_merge( $wp_query->query, $extraArgs );

}

1
patnz

Wie bereits erwähnt, können Sie die Abfrage im Hook pre_get_posts ändern. Dieser Hook übergibt das Abfrageobjekt als Argument, sodass Sie keine globale Variable lesen müssen.

add_action( 'pre_get_posts', 'wpse12692_pre_get_posts' ); 
function wpse12692_pre_get_posts( &$wp_query )
{
    if( isset( $_SESSION['size'] ) && $_SESSION['size'] != 'all' )
    {
        $wp_query->query_vars['meta_query'] = array(
            'key' => 'cc_size',
            'value' => $_SESSION['size'],
        );
    }

    if( isset( $_SESSION['gender'] ) && $_SESSION['gender'] != 'all' )
    {
        $wp_query->query_vars['meta_query'] = array(
            'key' => 'cc_gender',
            'value' => $_SESSION['gender'],
        );
    }

    $wp_query->query_vars['orderby'] = 'post-title';
    // The next line is redundant, get_query_vars reads it from the global $wp_query object
    $wp_query->query_vars['paged'] = get_query_var('paged');
}

Ich sehe, dass Ihre Abfrage von Sitzungsvariablen abhängt. Dies kann es schwieriger machen, einen Link zu einer Seite an eine andere Person weiterzuleiten. Haben Sie darüber nachgedacht, dies in die URL einzufügen und von dort aus zu lesen? Sie können dies tun, indem Sie zusätzliche Umschreiberegeln erstellen.

2
Jan Fabry

Hängen Sie sich in die Aktion 'pre_get_posts' ein.
Beispiel:

add_action( 'pre_get_posts', 'no_sticky_on_front' );

function no_sticky_on_front()
{
    is_front_page() and $GLOBALS['wp_query']->query_vars['ignore_sticky_posts'] = TRUE;
}
3
fuxia