web-dev-qa-db-fra.com

Règle de réécriture de type de message personnalisé pour l'auteur et la pagination?

J'utilise WordPress 3.0.1 et j'ai créé un post-type personnalisé appelé 'dienasgramatas'. Mon plugin crée également des règles de réécriture personnalisées pour l'affichage de toutes les publications de ce type de publication et même une structure permalien personnalisée pour interroger les publications avec ce type de publication provenant d'un auteur défini, mais je ne peux pas créer de règle pour la pagination:

C'est celui qui fonctionne:

$new_rules['dienasgramatas' . '/([^/]+)/?$'] = 
  'index.php?post_type=dienasgramata&author_name=' . $wp_rewrite->preg_index(1);

Il donne cette règle de réécriture:

[dienasgramatas/([^/]+)/?$] => index.php?post_type=dienasgramata&author_name=$matches[1]

Mais celui-ci:

$new_rules['dienasgramatas' . '/([^/]+)/page/?([0-9]{1,})/?$'] = 
  'index.php?post_type=dienasgramata&author_name=' . $wp_rewrite->preg_index(1). 
  '&paged=' . $wp_rewrite->preg_index(2);

Affiche cette règle de réécriture (défectueuse):

[dienasgramatas/([^/]+)/page/?([0-9]{1,})/?$] => 
  index.php?dienasgramata=$matches[1]&paged=$matches[2]

Comme vous pouvez le constater, post_type est ignoré et cette règle de réécriture ne fonctionne pas comme il se doit.

Quelqu'un peut-il me dire pourquoi cela ne fonctionne pas ou comment le corriger?

filtre pour funcion:

add_filter('generate_rewrite_rules', 'add_rewrite_rules');

La fonction complète est la suivante:

function add_rewrite_rules($wp_rewrite) {

$new_rules['dienasgramatas' . '/([^/]+)/?$'] = 'index.php?post_type=dienasgramata&author_name=' . $wp_rewrite->preg_index(1);
$new_rules['dienasgramatas' . '/([^/]+)/page/?([0-9]{1,})/?$'] = 'index.php?author_name=' . $wp_rewrite->preg_index(1) . '&paged=' . $wp_rewrite->preg_index(2) . '&post_type=dienasgramata';

$wp_rewrite->rules = array_merge($new_rules, $wp_rewrite->rules);
return $wp_rewrite;

}

Le besoin fondamental est que je veux aller à

www.example.com/dienasgramatas/admin/page/2

et obtenez les publications de 'admin' avec post_type = 'dienasgramata' et la deuxième page (par exemple, 10 publications compensées). La règle de réécriture sans page/2 fonctionne bien. Peut-être est-ce un problème de regex ou de vars de requête ou comment les règles de réécriture sont attribuées.

exemple de site en direct: http://dev.fiicha.lv/jb/dienasgramatas/juris/ - fonctionne bien http://dev.fiicha.lv/jb/dienasgramatas/juris/page/2/ - ne fonctionne pas

en bas il y a toutes les règles de réécriture et les vars de requête

2
banesto

Bonjour @ banesto :

Je pense que la réponse simple est peut-être que vous avez besoin que votre URL paginée soit spécifiée avant votre URL plus courte, mais comme je ne l'ai pas testée, je ne suis pas sûre à 100%.

Cela dit, j'ai toujours eu beaucoup de problèmes avec le hook 'generate_rewrite_rules'. Je suis sûr qu'un meilleur développeur que moi pourrait le faire fonctionner, mais pour moi, il a été beaucoup plus simple d'utiliser la fonction add_rewrite_rule(), c'est pourquoi je montre que vous devez créer votre route d'URL.

Voici un plugin pour faire ce que vous avez demandé (l'appel register_post_type() n'est là que pour permettre à ce plugin de fonctionner dans mon installation test de WordPress; vous pouvez le remplacer par le vôtre):

<?php
/*
Plugin Name: Dienasgramatas Urls
Version: 1.0
Author: Mike Schinkel
Author URI: http://mikeschinkel.com/
*/

if (!class_exists('Dienasgramatas_Urls')) {
  class Dienasgramatas_Urls {
    static function init() {
      $post_type = 'dienasgramatas' ;
      register_post_type($post_type,
        array(
          'label'           => 'Dienasgramatas',
          'public'          => true,
          'show_ui'         => true,
          'query_var'       => 'dienasgramatas',
          'rewrite'         => array('slug' => 'dienasgramatas'),
          'hierarchical'    => false,
          'supports'        => array('title','editor','custom-fields'),
        )
      );

      add_rewrite_rule("{$post_type}/([^/]+)/page/?([2-9][0-9]*)",
        "index.php?post_type={$post_type}&author_name=\$matches[1]&paged=\$matches[2]", 'top');

      add_rewrite_rule("{$post_type}/([^/]+)",
        "index.php?post_type={$post_type}&author_name=\$matches[1]", 'top');

    }
    static function on_load() {
      add_action('init',array(__CLASS__,'init'));
    }
    static function register_activation_hook() {
      self::init();
      flush_rewrite_rules(false); 
    }
  }
  Dienasgramatas_Urls::on_load();
}

Bien sûr, chaque fois que vous ajoutez des règles de réécriture, vous devez vider les règles de réécriture ou elles ne fonctionneront tout simplement pas. Idéalement, vous ne voulez pas vider les règles à chaque chargement de page, la méthode standard consiste donc à utiliser le hook d'activation du plugin . J'ai donc créé un plugin pour vous, mais n'hésitez pas à utiliser les appels add_rewrite_rule() dans le fichier functions.php de votre thème et à vider manuellement vos URL en cliquant sur "Enregistrer les modifications" dans le " Paramètres> Permaliens " section de la console d'administration.

2
MikeSchinkel