web-dev-qa-db-fra.com

Moyen optimal pour rediriger la page d'accueil vers l'archive des catégories?

Question

Quel serait le moyen optimal de rediriger la page d'accueil d'un site WordPress vers une archive de catégories sans impliquer de facteurs externes (par exemple, le fichier .htaccess d'Apache), c'est-à-dire au sein de WordPress?

Pourquoi?

(Seulement pour justifier la question. S'il vous plaît, ne laissez pas cette question devenirtrop localisée.)

C'est un site de nouvelles. Les catégories sont utilisées sous la formeEditions, par exemple:

  • US: http://example.com/main/
  • Royaume-Uni: http://example.com/uk/
  • Japon: http://example.com/jp/

(La catégorie basée est supprimée.)

Le visiteur doit être amené à l'édition américaine (http://example.com/main/) par défaut, peu importe d'où il vient, et c'est pourquoi je souhaite la redirection.

Options envisagées

Je sais que je peux simplement modifier la requête principale et que la page d'accueil n'inclut que les publications de la catégorie spécifique (Edition). Mais dans la manière dont les fonctionnalités du site sont construites, je trouve la redirection plus pratique et, en outre, plus appropriée.

En plus de cela, je veux que les URL rendent le lieu actuel clair pour le visiteur.

En ce qui concerne les raisons pour lesquelles je ne peux pas utiliser la redirection basée sur .htaccess, plus simple et plus performante, toutes les fonctionnalités doivent figurer dans le thème ou sous forme de plug-in séparé. Par conséquent, chercher le meilleur moyen de le faire avec WordPress/PHP.

J'ai également envisagé d'ajouter ceci dans home.php fichier de modèle:

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

Et décidé contre, car " double presque la charge du serveur pour la page d'accueil ".

1
its_me

En éliminant toutes les autres solutions, il en reste au moins une: 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' );

Vous devrez bien sûr passer la catégorie appropriée $id.

L'avantage de la redirection à template_redirect est que vous ne recevez qu'un seul chargement de modèle, plutôt qu'une deuxième redirectionaprèsle modèle se charge.

Modifier

Selon le commentaire de @ Milo, vous pouvez également essayer de vous connecter au processus encore plus tôt, à pre_get_posts, en économisant ainsi potentiellement une requête de requête complète:

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

J'ai écrit 2 commentaires, mais maintenant j'ai plus de temps et je veux ajouter une réponse qui puisse être utile à quelqu'un.

Le problème est le suivant: une fois que nous voulons que la redirection soit déclenchée par WordPress, nousdevonschargeons WordPress 2 fois: les sapins effectuent la redirection, la deuxième fois pour afficher la page d'accueil souhaitée.

Donc, ma pensée moins je charge avant la redirection, plus vite sera le processus complet, et moins la charge du serveur.

Les premiers éléments non chargés par WordPress sont des plugins MU. Je pense donc que le meilleur endroit pour faire ce que nous voulons est un plugin Mu.

Le problème auquel nous devons faire face est que lorsque plugins MU load, nous ne connaissons pas la requête et que les balises conditionnelles ne fonctionnent pas. Toutefois, dans ce cas particulier, nous souhaitons rediriger les données lorsque nous sommes dans l'URL du site et il est facile de reconnaître que regarder dans l'URL.

Deuxième petit problème est de savoir comment connaître le lien vers la page d'accueil de redirection. Nous pouvons le coder en dur dans le code du plugin, mais ce n’est pas une solution élégante. Nous pouvons exécuter un get_category_link, mais une fois que nous persécutons la performance n'est pas idéale, je pense qu'un bon compromis peut consister en un codage en dur dans wp-config.php.

Alors, ouvrez wp-config.php et ajoutez

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

Créez ensuite un fichier, nommez-le thehomepageredirector.php et enregistrez-le dans le dossier MU Plugins.

Par défaut, ce dossier s'appelle mu-plugins et se trouve à l'intérieur du dossier wp-content (à côté du dossier plugins). Les plugins MU n'ont pas besoin d'être activés.

Dans ce fichier, vous ne devez mettre que:

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();
}

De cette façon, la redirection se produit lorsque vous visitez http://www.example.com et avant le chargement des plugins et des thèmes, avant le déclenchement de la requête, avant le déclenchement de nombreux points d'ancrage ... avant beaucoup .

Modifier

Est également possible de ne pas déclencher la redirection lorsque des chaînes de requête non valides ou vides sont dans l'URL:

/**
 * 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