it-swarm.dev

Vlastní příspěvek Typ přepisu pravidla pro autora a stránkování?

Používám WordPress 3.0.1 a udělal jsem vlastní post-type s názvem 'dienasgramatas'. Můj plugin také dělá vlastní pravidla pro přepsání pro zobrazování všech příspěvků z tohoto typu příspěvku a dokonce i vlastní struktury permalinků k příspěvkům s tímto typem příspěvků z definovaného autora, ale nemohu vytvořit pravidlo pro stránkování:

To je ten, který funguje:

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

To dává toto pravidlo přepsání:

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

Ale tohle:

$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);

Výstup tohoto pravidla (chybného) přepsání:

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

Jak vidíte, post_type je ignorováno a toto pravidlo přepsání nefunguje tak, jak má.

Může mi někdo říct, proč to nefunguje, nebo jak to udělat správně?

filtr pro funcion:

add_filter('generate_rewrite_rules', 'add_rewrite_rules');

Plná funkce je následující:

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;

}

Základní potřebou je, že chci jít

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

a získat příspěvky od admin s post_type = 'dienasgramata' a druhou stránkou (např. 10 post offset). Pravidlo přepsání bez stránky/2 funguje dobře. Možná je to problém s regexem nebo dotazem vars nebo jak jsou přiřazena pravidla pro přepsání.

live site example: http://dev.fiicha.lv/jb/dienasgramatas/juris/ - funguje ok http://dev.fiicha.lv/jb/dienasgramatas/juris/page/2/ - nefunguje

v dolní části jsou všechna pravidla pro přepsání a vars dotazu

2
banesto

Ahoj @ banesto :

Myslím, že jednoduchá odpověď může být, že potřebujete, aby vaše stránkovaná adresa URL byla zadána před kratší adresou URL, ale protože jsem ji nezkoušela, nejsem 100% jistá.

To znamená, že jsem vždy narazil na spoustu problémů s hákem 'generate_rewrite_rules'. Jsem si jistý, že lepší vývojář, než já, by to dokázalo fungovat, ale pro mě je to mnohem čistší použít funkci add_rewrite_rule(), takže to, jak mám ukázat, že musíte vytvořit svou adresu URL.

Zde je plugin k tomu, co jste požadovali(volání register_post_type() je tam jen proto, aby tento plugin fungoval v mé testovací instalaci WordPressu; můžete jej nahradit vlastním):

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

Samozřejmě vždy, když přidáte pravidla pro přepsání, musíte pravidla pro přepsání vyprázdnit nebo prostě nebudou fungovat. V ideálním případě nechcete vypouštět pravidla pro každé načtení stránky, takže standardní způsob, jak to udělat, je v zásuvném moduluactivationhook. Tak jsem pro vás vytvořil plugin, ale neváhejte použít volání add_rewrite_rule() v souboru functions.php vašeho tématu a ručně vyprázdnit adresy URL kliknutím na tlačítko"Uložit změny"v"Nastavení> Permalinks"sekce administrační konzoly.

2
MikeSchinkel