it-swarm.com.de

Wie stoppe ich WordPress, um die Standardabfrage zu machen?

Mein Ziel ist die Umleitung zu einer benutzerdefinierten Vorlage, die auf einer neuen Umschreiberegel basiert, ohne jedoch über WordPress zu verfügen, um ungewöhnliche Abfragen zu erstellen.

mein Code:

function add_rewrite_rules() {

    add_rewrite_rule(
        '^settore/([^/]*)/?$',
        'index.php?settore=$matches[1]',
        'top'
    );

  add_rewrite_tag('%settore%','(caldareria|tessile)');
}
add_action( 'init', 'add_rewrite_rules' );

function set_root_category_template($template){
    $settore = get_query_var('settore');
    if($settore != '') $template = locate_template('root-taxonomy.php');
    return $template;
}
add_filter('template_include','set_root_category_template',99);

Es leitet gerade richtig um, aber wenn ich $ wp_query-> posts in root-taxonomy.php überprüfe, sehe ich eine Liste der regulären Posts. Stattdessen werde ich auf dieser Seite eine benutzerdefinierte Abfrage erstellen, in der bestimmte Taxonomiebegriffsdaten abgefragt werden. Daher ist die Standardabfrage völlig nutzlos. Wie kann ich damit aufhören? Schließlich übergebe ich keine Standardabfrage var an index.php, damit ich nicht verstehe, warum wp immer noch eine Abfrage ausführt.

4
Luca Reghellin

Stoppen Sie WordPress, um die Hauptabfrage auszuführen.

WordPress-Frontend-Workflow:

  1. wp-blog-header.php rufe die Funktion wp() auf
  2. wp() function erstellt eine Instanz von wp class und ruft darauf die Methode main() auf
  3. main() Methodencode:

    public function main($query_args = '') {
      $this->init();
      $this->parse_request($query_args); // build query vars starting from url
      $this->send_headers();
      $this->query_posts();  // run main query via WP_Query using built query vars
      $this->handle_404(); // if query has no results set 404 headers and WP_Query props
      $this->register_globals();
    }
    
  4. wp-blog-header.php enthält template-loader.php , das die Vorlagendatei basierend auf der Abfrage lädt

Die einzige Möglichkeit, die Hauptabfrage zu stoppen, besteht darin, zu verhindern, dass wp() ausgeführt wird.

Das kann getan werden, indem Sie einen frühen Haken setzen, das tun, was Sie brauchen, und schließlich exit().

Das Problem dieses Ansatzes ist, dass Sie verhindern, dass wp() ausgeführt wird. Außerdem verhindern Sie, dass die wp-Klasse Anforderungen analysiert, sodass die von Ihnen hinzugefügten Umschreibungselemente nicht analysiert werden.

Anstatt ein Umschreibungs-Tag und eine Umschreibungsregel hinzuzufügen, möchten Sie möglicherweise direkt die Option url auswählen, ob diese die benutzerdefinierte Aktion auslösen soll.

Schreiben wir zunächst eine Funktion, die nur den relativen Teil der URL zurückgibt, z. Wenn die aktuelle URL etwa example.com/wp/path/to/somewhere?foo=bar lautet und Ihre private URL example.com/wp/ lautet, gibt die Funktion path/to/somewhere zurück:

function get_relative_url() {
  $home_path = rtrim( parse_url( home_url(), PHP_URL_PATH ), '/' );
  $path = trim( substr( add_query_arg( array() ), strlen( $home_path ) ), '/' );
  $qs = array_keys( $_GET );
  if ( ! empty( $qs ) ) {
    $path = remove_query_arg( $qs, $path );
  }
  return $path;
}

Jetzt können wir einen frühen Hook verwenden, um die URL zu betrachten, und nur wenn sie den gewünschten Pfad enthält, setzen wir die Variable $settore, laden die Vorlage und beenden:

add_action( 'wp_loaded', function() { // 'wp_loaded' hook happen before wp() is ran

  $path = get_relative_url();
  $url_parts = explode( '/', $path );
  if (
    isset( $url_parts[1] )
    && $url_parts[0] === 'settore'
    && in_array( $url_parts[1], array( 'caldareria', 'tessile' ), TRUE )
  ) {
    // ok the current url is something like example.com/settore/tessile
    // and 'tessile' is in the variable $url_parts[1]
    $template = locate_template( 'root-taxonomy.php' );
    if ( empty( $template ) ) return; // do nothing if template not found
    global $settore;
    $settore = $url_parts[1]; // in the template you can access to $settore variable.
    require_once $template;
    exit(); // prevent WordPress to do anything else
  }

} );

Das ist alles.

Im obigen Code war es einfach, zu verstehen, ob die aktuelle URL die richtige ist, und die Variable $settore festzulegen, da die URL-Struktur einfach war. Für komplexere URL-Strukturen benötigen Sie wahrscheinlich einen Regex-Abgleich und können diesen verwenden ein Tool wie Symfony-Routing-Komponente , um die URL mit einigen Variablen abzugleichen.

Dieser Ansatz ist der, den ich in Cortex verwendet habe. Schauen Sie sich dort um, wenn Sie vorhaben, so etwas gemeinsam zu tun.

Fallstricke

wie Sie sehen, wird die Hauptabfrage (global $wp_query) in Code, den ich veröffentlicht habe, nicht verwendet. In Ihrer Vorlage ist sie ein leeres WP_Query-Objekt, sodass sich alle Angaben auf die Hauptabfrage beziehen, z. Template-Tags wie is_tax(), is_archive() oder ähnliches funktionieren nicht.

Dies gilt auch für Kopf- und Fußzeilen, da Sie in Ihrer 'root-taxonomy.php' höchstwahrscheinlich get_header() und get_footer() verwenden werden.

Einige Plugins funktionieren möglicherweise auch nicht ordnungsgemäß, z. Wenn Sie ein SEO-Plugin verwenden, das das Title-Tag basierend auf der Abfrage festlegt, treten Probleme auf.

Eine mögliche Lösung besteht darin, die Hauptabfrageeigenschaften für den Zugriff auf global $wp_query manuell festzulegen oder einen benutzerdefinierten Header zu verwenden, z. get_header('root-tax'), für Ihre benutzerdefinierte Vorlage und Behandlung in header-root-tax.php benutzerdefiniertem Titel-Tag und/oder einem anderen Problem.

4
gmazzap

warum nicht so?

add_action( 'pre_get_posts', 'my_post_queries' );
function my_post_queries( $query ) {
    if ($query->is_main_query() && !is_admin()) {
        // maybe check for specific page here
        // if (is_tax('your-taxonomy') { 
        $query = false;
        remove_all_actions ( '__after_loop');
        // }
    }
}

Oder habe ich die Frage falsch verstanden?

1
Web-Entwickler