web-dev-qa-db-fra.com

Comment ajouter des règles de réécriture et une pagination pour récupérer des fichiers de pièces jointes?

J'essaie de lister les pièces jointes basées sur différentes taxonomies. À l'heure actuelle, cela ne fonctionne que pour l'URL de base (aucune pagination ajoutée). Par exemple

http://www.example.com/exams/high-school/city-name/subject/math/

Premièrement, j'ai ajouté ma règle de réécriture personnalisée dans functions.php comme suit:

function add_rewrite_rules($aRules) {
    $new_rules = array(
    // rule 1
    'exams/([^/]+)/([^/]+)/subject/([^/]+)/?$'  => 
    'index.php?pagename=exams&level=$matches[1]&city=$matches[2]&subject=$matches[3]',
    // rule 2
    'exams/([^/]+)/([^/]+)/subject/([^/]+)/page/([0-9]+)/?$'  => 
    'index.php?pagename=exams&level=$matches[1]&city=$matches[2]&subject=$matches[3]&page=$matches[4]'
);

    return $new_rules + $aRules;
}
// hook add_rewrite_rules function into rewrite_rules_array
add_filter('rewrite_rules_array', 'add_rewrite_rules');

Je vais sur wordpress, des liens permanents et clique sur enregistrer chaque fois que je change cette fonction.

Deuxièmement, j'ai ajouté les vars de requête que j'utilise dans l'URL (également dans functions.php):

// represents for example the name of the product category
function add_query_vars($aVars) {
    $aVars[] = "level";    
    $aVars[] = "city"; 
    $aVars[] = "subject"; 
    $aVars[] = "page"; 
    return $aVars;
}
// hook add_query_vars function into query_vars
add_filter('query_vars', 'add_query_vars');

Troisièmement, j'ai créé une page nommée 'examens' et un plug-in pour obtenir les attachemets qui ne fonctionnent que si la page que vous regardez est un examen:

// Hooks a function to a filter action, 'the_content' being the action...
add_filter('the_content','me_get_listado');

// Callback function
function me_get_listado($content)
{
    // Checking if on post page.
    if ( is_page('exams') )
    {
            // get the query vars
            if ( get_query_var( 'level' ) && get_query_var( 'city' ) && get_query_var( 'subject' ) )
            {
                // get_post ($args) ... 
            }       
            return  $content; // the new content

        } else {
            // else on blog page / home page etc, just return content as usual.
            return $content;
        }
    }

Eh bien, cela fonctionne presque comme prévu. Quand je vais à

http://www.example.com/exams/high-school/city-name/subject/math/

Je reçois l'attachmet de "maths" de "nom de ville" pour le "lycée". Mais quand je vais à:

http://www.example.com/exams/high-school/city-name/subject/math/page/1 

ou:

http://www.example.com/exams/high-school/city-name/subject/math/page/2

Je suis redirigé vers :

http://www.example.com/exams/1 or http://www.example.com/exams/2

Donc, rien ne fonctionne.

Je me demande quel est le problème avec les règles de réécriture que j'ai déjà ajoutées? Ou si j'interfère avec la logique Wordpress?

NOTE: 'niveau', 'ville' et 'sujet' sont des taxonomies personnalisées.

2
pQB

Basé sur les commentaires de @Milo et en utilisant le plugin d'analyse de réécriture, j'ai trouvé ce que je comprends comme un conflit dans les règles de réécriture ?. L'URL suivante:

exams/high-school/city-name/subject/math/

correspond aux règles suivantes

Pattern:
    (.?.+?)/page/?([0-9]{1,})/?$
Subtitution:
    pagename: exams/high-school/city-name/subject/math
    paged: 1

Pattern:
    (.?.+?)(/[0-9]+)?/?$ 
Subtitution:
    pagename: exams/high-school/city-name/subject/math/page
    page: /1

Pattern: 
    exams/([^/]+)/([^/]+)/subject/([^/]+)/?$    
Subtitution:
    pagename: examns
    level: high-school
    city: city-name
    subject: math
    page: 1

Le dernier est celui que j'essaie de créer. Je ne suis pas un expert des règles de réécriture, mais je pense que le second activait en premier et produisait une redirection incorrecte vers http://www.example.com/exams/1 or http://www.example.com/exams/2.

Alors, j'ai changé la deuxième de mes règles en:

exams/([^/]+)/([^/]+)/subject/([^/]+)/page/?([0-9]{1,})/?$'  => 'index.php?pagename=exams&level=$matches[1]&city=$matches[2]&subject=$matches[3]&pages=$matches[4]

Notez la var comme ' pages ' au pluriel. Ça fonctionne bien. Cependant, le plug-in d'analyse de réécriture ne détecte pas mes règles. '?'

En fait, si je change de 'page' par 'pages' ou ' tout ce que je veux ' et enregistre ce nom de var et le récupère dans mon plugin:

$args = array(  'post_type'         => 'attachment',
    'posts_per_page'    => 2,
    'paged'             => ( get_query_var('whateverIwant') ? get_query_var('whateverIwant') : 1 ),
    'orderby'           => 'post_title',
    'order'             => 'ASC',
    'post_status'       =>'published'
);

Travaille aussi! Ainsi, le premier ensemble de règles que j'ai créé était en conflit avec quelque chose à l'intérieur de wordpress. J'ai beaucoup à apprendre.

PS: Je vais accepter n'importe quelle question avec un argument solide pour résoudre ce problème.

0
pQB