it-swarm-eu.dev

Optimální způsob přesměrování domovské stránky do archivu kategorií?

Otázka

Jaký je optimální způsob, jak přesměrovat domovskou stránku webu WordPressu do archivu kategorií bez zahrnutí externích faktorů (např. Apache .htaccess), tj. V rámci WordPressu?

Proč?

(Pouze za účelem ospravedlnění otázky. Nechte to, aby se otázka nevrátila na příliš lokalizovanou .)

Je to zpravodajský web. Kategorie se používají jako Edice , například:

  • USA: http://example.com/main/
  • UK: http://example.com/uk/
  • Japonsko: http://example.com/jp/

(Kategorie je odstraněna.)

Návštěvník má být standardně převezen do americké edice (http://example.com/main/) bez ohledu na to, odkud je, a proto chci přesměrování.

Možnosti zvažovány

Vím, že mohu jednoduše změnit hlavní dotaz a mít domovskou stránku pouze příspěvky z konkrétní kategorie (Edition). Ale způsob, jakým jsou stránky vytvořeny, považuji přesměrování za proveditelnější a navíc vhodné.

Kromě toho chci, aby adresy URL zpřístupnily návštěvníkům aktuální polohu.

Pokud jde o to, proč nemohu použít jednodušší a lépe výkonné přesměrování založené na technologii htaccess - všechny funkce musí být buď v rámci tématu, nebo jako samostatný plugin. Proto hledá nejlepší způsob, jak to udělat s WordPress/PHP.

Zvažoval jsem také přidávání do souboru šablony home.php :

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

A rozhodl se proti němu jako " téměř zdvojnásobuje zatížení serveru pro domovskou stránku ".

1
its_me

Odstraněním všech ostatních řešení je zbývající alespoň jedno: 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' );

Samozřejmě musíte složit příslušnou kategorii $id.

Výhodou přesměrování na template_redirect je to, že se místo jednoho přesměrování po načtení šablony provede pouze jedno načítání šablony.

Upravit

Podle komentáře uživatele @ Milo můžete také zkusit zaháknutí do procesu ještě dříve, v souboru pre_get_posts, čímž můžete potenciálně uložit celý požadavek dotazu:

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

Napsal jsem 2 komentáře, ale teď mám více času a chci přidat odpověď, která může být pro někoho užitečná.

Problém je v tom: jakmile chceme redirect spustit WordPress my musí načíst WordPress 2 krát: jedle udělat přesměrování, podruhé zobrazit požadovanou domovskou stránku.

Takže moje myšlenka méně jsem zatížení před přesměrování, rychlejší bude celý proces, a méně zatížení serveru.

Nejdůležitějšími položkami načtenými aplikací WordPress jsou moduly plug-in MU. Takže si myslím, že nejlepší místo na to, co chceme, je plugin Mu.

Problém, kterému musíme čelit, je, že když pluginy MU načtou, dotaz neznáme a alo podmíněné označení nefunguje. V tomto konkrétním případě však chceme přesměrovat, když se nacházíme v domovské url, a je snadné rozpoznat pohled na adresu URL.

Druhým malým problémem je, jak znát odkaz na domovskou stránku přesměrování. Můžeme to hardcoding v kódu plugin, ale není elegantní řešení. Můžeme spustit get_category_link, ale jakmile budeme pronásledování výkon není ideální, myslím, že dobrý kompromis může být hardcoding to v wp-config.php.

Otevřete soubor wp-config.php a přidejte

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

Pak vytvořte soubor, pojmenujte ho thehomepageredirector.php a uložte jej do složky zásuvných modulů MU.

Ve výchozím nastavení se tato složka nazývá mu-plugins a nachází se ve složce wp-content (vedle složky plugins). Pluginy MU nemusí být aktivovány.

V tomto souboru byste měli uvést pouze:

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

Tímto způsobem se přesměrování stane, když navštívíte http://www.example.com a stane se to dříve, než budou načteny všechny pluginy a téma, než dojde k požáru dotazu, než bude spoušteno mnoho háčků ... před a lotof věci.

Upravit

Je také možné nespouštět přesměrování, pokud jsou v adrese URL neplatné nebo prázdné řetězce dotazů:

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