web-dev-qa-db-fra.com

Nom de domaine multiple - un WP Installation (non multisite) - Par défaut, chaque nom de domaine dans l'archive de catégories

Le cas d'utilisation est un peu simple - voici:

  1. Cinq personnes partagent une même installation wordpress - pas multi-utilisateur
  2. Chaque personne blogue et place ses messages dans une catégorie unique.
  3. Chaque personne a son propre nom de domaine
  4. Tous les noms de domaine sont pointés ou garés dans le même dossier WP install
  5. Le nom de domaine de chaque personne ne montre que les publications de sa catégorie, c.-à-d.

  6. Indexation Google conviviale pour chaque nom de domaine
  7. Préférez la solution de réécriture plutôt que la redirection, mais la redirection est acceptable
  8. Un compte "maître" serait en mesure de publier ou de modifier toutes les publications des blogueurs via le nom de domaine "principal".
  9. Bonus - si cela pouvait être étendu aux types d'articles personnalisés

Environnement

  1. Une installation de la dernière version de WP (non multi-utilisateur)
  2. Jolis Permaliens
  3. Cpanel - pour mettre en place un parking de domaine
  4. Aucun sous-domaine
  5. Accès au .htaccess
  6. Accès au functions.php
3
aj martin

Voici deux solutions différentes (éditer les spécificités de votre cas d'utilisation) :

Faire une redirection:

1.) En haut de votre fichier /wp-config.php, ajoutez ce qui suit:

if ( is_yoursite_blogger_domain( $_SERVER['SERVER_NAME'] ) ) {
  $domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] );
  define( 'WP_SITEURL', 'http://' . $domain );
  define( 'WP_HOME', 'http://' . $domain );
} else if ( ! is_main_domain( $_SERVER['SERVER_NAME'] ) ) {
  header( "Location:http://{$yoursite_main_domain}", true, 301 );
  exit;
}
function is_main_domain( $domain ) {
  $domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] );
  return strpos( $domain, 'maindomain.com' ) !== false;
}
function is_yoursite_blogger_domain( $domain ) {
  $domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] );
  return in_array( $domain, array(
    'blogger1.com',
    'blogger2.com',
    'blogger3.com',
    'blogger4.com',
    'blogger5.com',
    'uncategorized.dev', // Only here for use on my own test site
   ) );
}

2.) Ajoutez ensuite ceci au fichier functions.php de votre thème:

add_action( 'template_redirect', 'yoursite_template_redirect' );
function yoursite_template_redirect() {
  $path = $_SERVER['REQUEST_URI'];
  if (strpos($path,"/category/") === false) {
    $domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] ) ;
    $category = str_replace( '.com', '', $domain );
    $category = str_replace( '.dev', '', $domain );  // Only for my own test site
    $location = "http://{$domain}/category/{$category}/" ;
      wp_safe_redirect( $location );
      exit;
    }
  }
}

Ce qui précède effectuera une redirection 302 vers http://blogger1.com/category/blogger1/ lorsqu’une requête est faite pour une URL http://blogger1.com autre que celle commençant par http://blogger1.com/category/ (vous devez apporter certaines modifications pour prendre en charge d’autres URL.)

Faire un "Rewrite":

Ce que ce qui précède ne prend pas en charge est "réécrire" vs. a "redirect" solution. Si vous voulez cela, c'est un peu plus compliqué. Le code suivant entraînera le chargement de la page de catégorie dans le chemin racine de tout domaine mappé dans votre fonction is_yoursite_blogger_domain(). Bien sûr, votre fonction is_yoursite_blogger_domain() pourrait valider par rapport aux catégories existantes, mais je ne connais pas tous les critères, je l'ai donc codée en dur. Vous pouvez copier ce code dans le fichier theme.php de votre fonction ou le placer dans un fichier .php d'un plug-in en cours d'écriture. Notez que ce code requiert également le code du fichier /wp-config.php ci-dessus:

add_action( 'category_link', 'yoursite_category_link', 11, 2 );
function yoursite_category_link( $category_link, $category_id ) {
  // Make sure any blogger category links are truncated to the root
  $parts = explode( '/', $category_link );
  if ( is_yoursite_blogger_domain( $parts[2] ) ) {
    // if %category% in http://%domain%/category/%category%/ 
    // equals %domain% minus the 'com' extension
    if ( "{$parts[4]}." == substr( $parts[2], 0, strlen( $parts[4] ) + 1 ) ) {
     $category_link = "http://{$parts[2]}/"; // Strip 'category/%category%/'
    }
  }
  return $category_link;
}

add_action( 'init', 'yoursite_init' );
function yoursite_init() {
  // Remove the canonical redirect to the category page
  // if %category% in http://%category%.%ext%/ is a blogger category.
  if ( is_yoursite_blogger_domain( $_SERVER['SERVER_NAME'] ) ) {
    $parts = explode( '/', strtolower( $_SERVER['REQUEST_URI'] ) );
    if (count($parts) > 1) {
      $category_base = get_option( 'category_base' );
      if ( empty( $category_base ) )
        $category_base = 'category';
      if ( $category_base == $parts[1] ) {
        remove_filter( 'template_redirect', 'redirect_canonical' );
      }
    }
  }
}

add_action( 'template_redirect', 'yoursite_template_redirect' );
function yoursite_template_redirect() {
  // Redirect any http://%category%.%ext%/category/%category%/ to http://%category%.%ext%/
  if ( is_yoursite_blogger_domain( $_SERVER['SERVER_NAME'] ) ) {
    $category_base = get_option('category_base');
    if (empty($category_base))
      $category_base = 'category';
    $parts = explode( '/', strtolower( $_SERVER['REQUEST_URI'] ) );
    if ( $category_base == $parts[1] &&
       "{$parts[2]}." == substr( $_SERVER['SERVER_NAME'], 0, strlen( $parts[2] ) + 1 ) ) {
      wp_safe_redirect( "http://{$_SERVER['SERVER_NAME']}/", 301 );
      exit;
    }
  }
}

add_action( 'request', 'yoursite_request' );
function yoursite_request($query_vars) {
  // If %category% in http://%category%.%ext%/ is a blogger category set the
  // 'category_name' query var to tell WordPress to display the category page.
  $domain = $_SERVER['SERVER_NAME'];
  if ( is_yoursite_blogger_domain( $domain ) ) {
    $path = $_SERVER['REQUEST_URI'];
    if ( strpos( $path, "/category/" ) === false ) {
      $domain = str_replace( 'www.', '', $domain ) ;
      $category_name = substr( $domain, 0, strrpos( $domain, '.' ) );
      $query_vars = array( 'category_name' => $category_name );
    }
  }
  return $query_vars;
}

Et voici une capture d'écran pour montrer le deuxième exemple en action:

 Screenshot of a WordPress site using hooks to enable a category page to be displayed in the URL root for selected categories 
(source: mikeschinkel.com )

Une autre meilleure méthode serait probablement d’utiliser une taxonomie personnalisée au lieu de catégories ou, mieux encore, d’affecter le domaine à un nom d’utilisateur. De cette manière, vous réduisez le travail des auteurs et vous n'avez pas à vous soucier de maintenir la liste des blogueurs dans le code ou dans une liste de taxonomie séparée.

Quant à toi "bonus" , désolé mais je ne suis pas ce que tu veux là-bas.

4
MikeSchinkel
  1. Créer le ou les alias de domaine

  2. Ajoutez ceci à votre fichier wp-config:

    define('WP_SITEURL','http://'.$_SERVER['SERVER_NAME']);
    define('WP_HOME','http://'.$_SERVER['SERVER_NAME']);
    
  3. Accédez à votre thème et ajoutez quelque chose comme ceci pour charger le contenu principal (utilisé pour un document d'une page):

    $home=get_page_by_path(substr($_SERVER['SERVER_NAME'], 0, strlen($_SERVER['SERVER_NAME'])-4));
    echo do_shortcode($home->post_content);
    
  4. remplacez la catégorie, la page ou le slug par le nom de domaine min du domaine de premier niveau, dans ce cas un domaine de premier niveau composé uniquement de 4 caractères. Par exemple: .com .net .org si vous voulez utiliser quelque chose comme .nl .be ou .de, changez le 4 en 3. Si vous voulez utiliser les deux, vous devez ajouter des conditions.

Remarque: Cela peut ne fonctionner que pour une page, mais je ne vous en donne que l'idée. Vous pouvez étendre les fonctionnalités du code vous-même si nécessaire

0
Fleuv