Question

J'ai essayé de mettre en place un moyen d'écrire des messages dans une série sur mon site. L'idée est que chaque poste peut appartenir à une autre série dans une taxonomie personnalisée. J'ai eu à peu près tout ensemble la façon dont je le veux ... à une exception près.

Enregistrement de la taxonomie

Cette partie fonctionne. Je l'ai laissé tomber le code suivant dans un plug-in:

function jdm_build_series_taxonomy() {
    $labels = array(
        'name' => _x('Series Labels', 'taxonomy general name'),
        'singular_name' => _x('Series Label', 'taxonomy singular name'),
        'search_items' => __('Search Series Labels'),
        'popular_items' => __('Popular Series Labels'),
        'all_items' => __('All Series Labels'),
        'parent_item' => __('Parent Series Label'),
        'parent_item_colon' => __('Parent Series Label:'),
        'edit_item' => __('Edit Series Label'),
        'update_item' => __('Update Series Label'),
        'add_new_item' => __('Add New Series Label'),
        'new_item_name' => __('New Series Label Name')
    );

    register_taxonomy(
        'series',
        'post',
        array(
            'hierarchical' => true,
            'label' => __('Series'),
            'labels' => $labels,
            'query_var' => true,
            'rewrite' => true
        )
    );
}

add_action( 'init', 'jdm_build_series_taxonomy', 0 );

Cela ajoute « Les étiquettes de la série » aux messages le menu déroulant et me donne une boîte « série d'étiquettes » sur l'écran de la modifier. tout fonctionne, et je peux marquer les messages comme une partie d'une série parfaitement. Les mensonges de problème dans la section suivante ...

Liste des éléments de la taxonomie

Mon but est de permettre aux lecteurs de marcher à travers une série d'un poste à la fois, en commençant par le plus ancien poste et le déplacement vers l'avant par ordre chronologique. Ceci est différent d'une page typique d'archives, parce que j'ai 10 messages par page pour mes archives, mais je veux évidemment un seul poste par page pour mes séries d'archives.

J'ai créé un fichier taxonomy-series.php dans mon modèle. Et il moitié fonctionne. La première page fonctionne très bien - http://localhost/wp/series/my-test-series/ affiche le premier article de la série avec le lien « Next Entry» » au bas de la page. Jusqu'à présent, si bien ...

Mais lorsque vous cliquez sur « Next Entry» » et allez à la page suivante (http://localhost/wp/series/my-test-series/page/2/), il est a) le mauvais article et b) le mauvais modèle!

Cependant, si je mets « pages blog montrer au plus: » à « 1 » sur la page de lecture (il est normalement réglé sur 10) alors les choses fonctionnent très bien. Page 2 affiche le deuxième article, la page 3 affiche le troisième, etc.

Alors ... que dois-je vérifier pour forcer la page d'archives de taxonomie pour afficher un seul poste sur chaque page? J'ai essayé ce qui suit:

$new_query = wp_parse_args(
    $query_string, 
    array(
        'posts_per_page' => 1,
        'paged' => $paged
    )
);

query_posts($new_query);

et

query_posts($query_string.'&posts_per_page=1&paged='.$paged);

en vain ... des idées? Conseils? Suggestions?

Était-ce utile?

La solution

Salut @EAMann :

Je grincer des dents chaque fois que je dois faire quelque chose de créatif avec des URL dans WordPress comme système d'URL est à mon avis de loin l'aspect le plus inélégant de WordPress. Je me sens toujours que je vais avoir à se battre WordPress pour lui faire faire ce que je veux, et que WordPress me bats activement dos liés aux URL. Donc, avec cette ouverture ...

Penser à travers votre question, je vais faire une suggestion qui ne correspond pas exactement ce que vous avez demandé. Si vous ne trouvez pas être ce que vous cherchez c'est bien juste s'il vous plaît ne pas tomber personne-vote parce que je suis juste essayer d'aider.

La taxonomie est pas simple Increment et n'a pas Meta

L'un des problèmes avec ce que vous essayez de faire est le système de taxonomie ne pas une commande d'incrément et ne dispose pas des méta . Par exemple, dans une 3 série post que vous pourriez trouver des termes avec IDs de 373, 411 et 492; vous pouvez comprendre que 373 = #1, 411 = #2 et 492 = #3 mais c'est tout hasard et par rapport à l'autre. Il est comme essayer de l'emplacement de la racine de votre site WordPress dans le code du plugin, mais vous ne savez pas combien de niveaux de profondeur votre code sera stocké. Bien sûr peut écrire du code pour comprendre tout et cartographier les mais cela devient difficile et je ne suis pas sûr que vous obtiendrez beaucoup de valeur hors d'essayer de le comprendre au lieu d'utiliser une approche différente.

Explicitement attribuant les numéros Page

La première chose que je dirais est que explicitement assign votre numéros de page pour chaque poste dans votre série en utilisant méta / custom post champs (j'ai choisi le terme installment au lieu de page parce qu'il était plus logique pour moi, mais vous pouvez clairement utiliser un terme qui convient pour votre cas d'utilisation.)

Affectation page / numéros versement a l'avantage de vous être en contrôle complet et de cette façon vous saurez ce qu'il faut corriger quand somethings détraqué et si vous voulez vous réorganisez peut le faire en changeant simplement les chiffres. Je suppose que vous aurez un modifier METABOX un nom champ personnalisé _installment pour sélectionner les numéros de versement (et il pourrait même gérer / jongler avec les numéros de versement via AJAX si vous voulez obtenir si créatif que vous n'avez des pages désynchronisés. )

Utilisez $wp_rewrite->add_rule() pour Explicitement cédez votre URL

Je ne vais pas aller en profondeur depuis que je sais que vous avez généralement obtenu skilz fou de WordPress, donc je vais juste le point que $wp_rewrite->add_rule() est la cruz d'obtenir tout cela au travail. Tout est fourni d'autre support autour du résultat de cette fonction. Utilisez le crochet init assign votre règle URL:

<?php
add_action('init', 'add_series_installment_url');
function add_series_installment_url() {
  global $wp,$wp_rewrite;
  $wp->add_query_var('series');
  $wp->add_query_var('installment');
  $wp_rewrite->add_rule('series/([^/]+)/(installment-\d+)','index.php?series=$matches[1]&installment=$matches[2]','top');
  $wp_rewrite->flush_rules(false);  // This should really be done in a plugin activation
}

Utiliser un crochet parse_query à Traduire URL de la requête Vars

La 2ème moitié de cette solution utilise le crochet parse_query que je sais que vous beaucoup plus familier. En général, nous saisissons l'query_vars définie dans init et capturé par la règle d'URL et les convertir en ce que nous avons besoin d'interroger les messages de WordPress avec taxonomy + term la manipulation de votre series et meta_key + meta_value manipulation de la tranche assignée explicitement / page:

<?php
add_action('parse_query', 'apply_series_installment_to_query');
function apply_series_installment_to_query(&$query) {
  if (isset($query->query['series']) && isset($query->query['installment']) && 
     preg_match('#^installment-(\d+)$#',$query->query['installment'],$match)) {
    $query->query_vars['post_type'] = 'post';
    $query->query_vars['taxonomy'] = 'series';
    $query->query_vars['term'] = $query->query['series'];
    $query->query_vars['meta_key'] = '_installment';
    $query->query_vars['meta_value'] = $match[1];
    unset($query->query_vars['series']);            // You don't need this
    unset($query->query_vars['installment']);       // or this
    unset($query->query_vars['name']);              // or this
  }
}

Résumé

Normalement, je serais allé dans beaucoup plus de profondeur expliquant une réponse, mais il est tard, je l'ai eu trop peu de sommeil dans les 48 dernières heures, et surtout je sais que vous pouvez le comprendre, vous avez probablement juste besoin d'une chose je l'ai mentionné ici.

J'espère que vous aimez cette solution. Même si vous ne les deux parties avec init et parse_query et la $wp_rewrite->add_rule() et $query->query_vars[] respectivement sont ce que vous avez besoin, même si vous voulez coller avec votre architecture originale. Bonne chance et attendons avec impatience de le voir quand vous l'avez fait et en ligne!

Quoi qu'il en soit, Espoirson aide.

Autres conseils

Voici le code que j'utilise pour modifier nombre de messages sur les pages d'archives des catégories et tags:

query_posts( array_merge( array(
'posts_per_page' => 1
), $wp_query->query ) );

Si vous ne pouvez pas faire ce travail avec essai de taxonomie personnalisée avec natifs (catégories, tags) pour vérifier si le problème est avec lui-même code, avec la taxonomie ou tout autre chose.

Aussi je ne suis pas sûr si vous avez manqué ce ou à gauche, mais paginée $ n'est pas variable globale. Il doit être tiré par les cheveux comme get_query_var ( 'paginée')

Une fois que je l'ai fait face problème à ce sujet et passé temps difficiles heures à heures en tirant les cheveux. Je googlé et n'a pas trouvé une solution spécifique sur les sujets. J'ai trouvé l'article de plusieurs talents, mais ils n'étaient pas satisfaire mes problèmes. En fait sur mesure taxonomie page archives pagination est fonction de certains paramètres des arguments des fonctions connexes. Je vais donc en fait partager ici mes pensées de résoudre le problème de la pagination des archives de taxonomie.

Cinq choses dont vous avez besoin pour la page de pagination archives taxonomie personnalisée fonctionne parfaitement:

(1) Ne pas mettre la clé des paramètres de exclude_from_search comme paramètre argument register_post_type ou le mettre 'exclude_from_search' => false. Par défaut, il est réglé false.

(2) La taxonomie qui sera utilisé avec le type de poste personnalisé jeu 'taxonomies' => 'custom_taxonomy_name' comme paramètre argument register_post_type ou de l'utilisation register_taxonomy_for_object_type() directement. taxonomies personnalisées doivent encore être enregistrés auprès register_taxonomy().

(3) Bien que l'interrogation au sein new WP_Query ($args)

i) Dans le cas contraire mis en service admin static front page avant new WP_Query($args)

$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;

et l'utilisation $query = new WP_Query( array( 'paged' => $paged ) );

ii) Si elle est définie dans l'utilisation de la page avant statique admin avant 'nouvelle WP_Query ($ args)':

  $paged = ( get_query_var('page') ) ? get_query_var('page') : 1;

et l'utilisation $query = new WP_Query( array( 'page' => $paged ) );

Rappelez-vous d'utiliser le paramètre de posts_per_page et paged dans le tableau des arguments de new WP_Query($arg).

Si non réglée première page statique, vous devez utiliser le paramètre de page dans le tableau des arguments de new WP_Query ($arg).

(4) L'utilisation de la fonction de Wordpress paginate_links( $args ) comme dans l'exemple ci-dessous pour rendre pagination dans le fichier de modèle d'archives.

<?php $big = 999999999; // need an unlikely integer
echo paginate_links( array(
                  'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
                  'format' => '?paged=%#%',  or   '/paged=%#%',  // if using pretty permalink
                   'current' => max( 1, get_query_var('paged') ),
                   'total' => $query->max_num_pages ) ); // Here $max_num_pages is the properties of  new WP_Query() object . It is total number of pages. Is the result of $found_posts / $posts_per_page
 ?>

(5) La sortie de la fonction de paginate_links() la ul li liste de la classe de page-numbers.         Si vous utilisez la classe inject pagination bootstrap à la ul avec l'aide de javascript ou jquery et une belle fantaisie sera mise en page est sortie.

Espoir vous pouvez maintenant profiter de la pagination dans le modèle d'archive de taxonomie sans problème 404: -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top