it-swarm.com.de

Optimale Möglichkeit, die Startseite zum Kategoriearchiv umzuleiten?

Frage

Was wäre eine optimale Möglichkeit, die Startseite einer WordPress-Site in ein Kategoriearchiv umzuleiten, ohne externe Faktoren (z. B. Apaches .htaccess), d. H. Innerhalb von WordPress, zu berücksichtigen?

Warum?

(Nur zur Rechtfertigung der Frage. Bitte lassen Sie die Frage dadurch nicht zutoo localizedwerden.)

Es ist eine Nachrichtenseite. Die Kategorien werden alsEditionsverwendet, zum Beispiel:

  • US: http://example.com/main/
  • Großbritannien: http://example.com/uk/
  • Japan: http://example.com/jp/

(Die kategoriebasierte wird entfernt.)

Der Besucher wird standardmäßig zur US-Ausgabe (http://example.com/main/) weitergeleitet, unabhängig davon, woher er kommt. Deshalb möchte ich die Weiterleitung.

Betrachtete Optionen

Ich weiß, dass ich einfach die Hauptabfrage ändern und auf der Startseite nur Beiträge aus der bestimmten Kategorie (Edition) anzeigen kann. Aber die Art und Weise, wie die Features der Site aufgebaut sind, finde ich, dass die Weiterleitung praktikabler und darüber hinaus angemessener ist.

Abgesehen davon möchte ich, dass die URLs dem Besucher den aktuellen Standort verdeutlichen.

Was den Grund angeht, warum ich die einfachere und leistungsfähigere .htaccess-basierte Umleitung nicht verwenden kann - alle Funktionen müssen entweder im Design oder als separates Plugin vorhanden sein. Daher auf der Suche nach dem besten Weg, dies mit WordPress/PHP zu tun.

Ich habe auch darüber nachgedacht, dies in home.php template-Datei hinzuzufügen:

<?php
    wp_redirect( 'http://example.com/main/' );
?>

Und entschied sich dagegen, da es " Serverlast für Homepage fast verdoppelt ".

1
its_me

Eliminiert man alle anderen Lösungen, bleibt mindestens eine übrig: template_redirect :

function wpse121308_redirect_homepage() {
    // Check for blog posts index
    // NOT site front page, 
    // which would be is_front_page()
    if ( is_home() ) {
        wp_redirect( get_category_link( $id ) );
        exit();
    }
}
add_action( 'template_redirect', 'wpse121308_redirect_homepage' );

Sie müssen natürlich die entsprechende Kategorie $id übergeben.

Die Umleitung bei template_redirect hat den Vorteil, dass nur ein Laden der Vorlage stattfindet und nicht eine zweite Umleitung nach der Vorlage.

Bearbeiten

Laut @ Milos Kommentar können Sie auch versuchen, sich unter pre_get_posts noch früher in den Prozess einzuklinken, wodurch möglicherweise eine gesamte Abfrageanforderung gespeichert wird:

add_action( 'pre_get_posts', 'wpse121308_redirect_homepage' );
3
Chip Bennett

Ich habe 2 Kommentare geschrieben, aber jetzt habe ich mehr Zeit und möchte eine Antwort hinzufügen, die für jemanden nützlich sein kann.

Das Problem ist folgendes: Sobald die Weiterleitung durch WordPress ausgelöst wird, müssen wir WordPress 2 mal laden: erst die Weiterleitung durchführen, dann das zweite Mal die gewünschte Homepage anzeigen.

Daher denke ich, dass weniger ich vor der Umleitung lade, der gesamte Prozess schneller ist und weniger der Server ausgelastet ist.

Die ersten nicht von WordPress geladenen Kernelemente sind MU-Plugins. Ich denke, der beste Ort, um das zu tun, was wir wollen, ist ein Mu-Plugin.

Das Problem, mit dem wir konfrontiert sind, ist, dass wir beim Laden von MU-Plugins die Abfrage nicht kennen und auch ein bedingtes Tag nicht funktioniert. In diesem speziellen Fall möchten wir jedoch umleiten, wenn wir uns in der Home-URL befinden, und es ist leicht zu erkennen, wie die URL angezeigt wird.

Das zweite kleine Problem ist, wie man den Link erkennt, über den die Startseite umgeleitet wird. Wir können es im Plugin-Code fest codieren, aber es ist keine elegante Lösung. Wir können einen get_category_link ausführen, aber wenn wir die Leistung verfolgen, ist dies nicht ideal. Ich denke, ein guter Kompromiss kann darin bestehen, ihn in wp-config.php festzukodieren.

Also wp-config.php öffnen und hinzufügen

define( 'WP_SITEURL', 'http://www.example.com' );
define('THEHOMEPAGEREDIRECT', WP_SITEURL . '/main');

Dann erstelle eine Datei, nenne sie thehomepageredirector.php und speichere sie im MU Plugins Ordner.

Standardmäßig heißt dieser Ordner mu-plugins und befindet sich im Ordner wp-content (neben dem Ordner plugins). MU-Plugins müssen nicht aktiviert werden.

In diese Datei sollten Sie nur schreiben:

if ( ! defined('THEHOMEPAGEREDIRECT') ) return;
$home_path = trim( \parse_url( home_url(), PHP_URL_PATH ), '/' );
$url = str_replace( $home_path, '', add_query_arg( array() ) );
if ( $url === '/' ) {
  // pluggable is loaded after MU plugins
  require( ABSPATH . WPINC . '/pluggable.php' );
  wp_safe_redirect(THEHOMEPAGEREDIRECT, 301);
  exit();
}

Auf diese Weise erfolgt die Umleitung beim Aufrufen von http://www.example.com und bevor Plugins und Designs geladen werden, bevor Abfragen ausgelöst werden, bevor viele Hooks ausgelöst werden ... bevor viele von Dingen.

Bearbeiten

Ist auch möglich, die Umleitung nicht auszulösen, wenn sich ungültige oder leere Abfragezeichenfolgen in der URL befinden:

/**
 * Class used only to retrieve all the valid query vars
 */
class WP_Extend extends WP {
  public $all_vars;
  function __construct() {
   $this->all_vars = array_merge($this->public_query_vars, $this->private_query_vars);
  }
}

if ( ! defined('THEHOMEPAGEREDIRECT') ) return;
$home_path = trim( \parse_url( home_url(), PHP_URL_PATH ), '/' );
$url = str_replace( $home_path, '', add_query_arg( array() ) );
$url_array = \explode( '?', $url );
if ( count($url_array) > 1 ) {
  $qs = array();
  parse_str( $url_array[1], $qs );
  $good = array_filter($qs);
  // do not redirect if empty query string are in the url
  if ( empty ( $good  ) ) return;
  $wpe = new WP_Extend;
  $valid = array_intersect( array_keys($good), $wpe->all_vars );
  // do not redirect if not valid query string are in the url
  if ( count( $good ) != count($valid)  ) return;
}
if ( $url === '/' ) {
  // pluggable is loaded after MU plugins
  require( ABSPATH . WPINC . '/pluggable.php' );
  wp_safe_redirect(THEHOMEPAGEREDIRECT, 301);
  exit();
}
1
gmazzap