it-swarm.dev

Oprava stránkování s vlastním archivem taxonomie

Snažil jsem se nastavit způsob, jak psát příspěvky v sérii na mých stránkách. Myšlenka je, že každý příspěvek může patřit do jiné série ve vlastní taxonomii. Dostal jsem se jen o všechno, co jsem chtěl ... s jedinou výjimkou.

Registrace taxonomie

Tato část funguje. Následující kód jsem vypustil do modulu 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 );

Tím se do rozbalovací nabídky Příspěvky přidá označení „Série štítků“ a na obrazovce pro úpravy příspěvků se zobrazí rámeček „Série štítků“. Všechno funguje a můžu označit příspěvky jako součást série. Problém je v další části ...

Výpis položek v taxonomii

Mým cílem je umožnit čtenářům, aby procházeli sérií po jednom místě, počínaje nejstarším příspěvkem a pohybem dopředu chronologicky. To je jiné než typická stránka archivu, protože mám 10 příspěvků na stránku pro mé archivy, ale samozřejmě chci pouze jeden příspěvek na stránku pro můj archiv série.

Vytvořil jsem soubor taxonomy-series.php uvnitř šablony. A to napůl práce. První stránka bude v pořádku - http://localhost/wp/series/my-test-series/ zobrazí první článek v řadě s odkazem "Další záznam" ve spodní části stránky. Zatím je vše dobré ...

Ale když kliknete na "Další záznam" a přejdete na další stránku (http://localhost/wp/series/my-test-series/page/2/), je to nesprávný článek a b) nesprávná šablona!

Nicméně, pokud nastavím "Blogové stránky ukazují maximálně:" na "1" na stránce Reading (je to normálně nastaveno na 10), pak věci fungují v pohodě. Stránka 2 zobrazuje druhý článek, stránka 3 zobrazuje třetí, atd.

Takže ... co musím zkontrolovat, aby se stránka archivu taxonomie vynucila, aby se na každé stránce zobrazoval pouze jeden příspěvek? Vyzkoušela jsem následující:

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

query_posts($new_query);

a

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

k ničemu ... nápady? Tipy? Návrhy?

4
EAMann

Ahoj@EAMann:

I cringe kdykoliv potřebuji udělat něco kreativního s URL ve WordPress jako URL systém je podle mého názoru zdaleka nejvíce nedelegantní aspekt WordPress. Vždycky mám pocit, že musím bojovat s WordPressem, abych to udělal, co chci, a že WordPress mě aktivně bojuje, pokud jde o adresy URL. Takže s tím otvírákem ...

Přemýšlíte nad svým problémem, budu dělat návrh, který není přesně to, o co jste žádali. Pokud nenajdete, že je to to, co hledáte, je to v pořádku, prosím, nedělejte nikoho dolů - protože se snažím pomoci.

Taxonomie není jediný přírůstek a nemá Meta

Jedním z problémů s tím, co se pokoušíte udělat, je systém taxonomie nemá jednorázové řazení a nemá meta. Například v 3 řadách příspěvků můžete najít výrazy s IDs 373, 411 a 492; můžete zjistit, že 373 = #1, 411 = #2 a 492 = #3 ale to je vše, co je ve vzájemném vztahu. Je to jako snažit se umístit kořen vašeho webu WordPressu do zásuvného kódu, ale nevíte, kolik úrovní bude váš kód uložen. Samozřejmě můžete psát kód, aby to všechno a mapovat, ale to dostane složité a nejsem si jistý, že byste si hodně hodnotu z pokusu přijít na to místo použití jiného přístupu.

Explicitně přiřaďte svá čísla stránek

Takže první věc, kterou bych navrhl, je, že vy explicitně přiřaďte vaše čísla stránek pro každý příspěvek ve vaší sérii pomocí post meta/vlastních polí (vybral jsem termín installment místo page, protože mi to dávalo větší smysl, ale jasně byste mohli použít jakýkoli termín, který se hodí pro váš případ použití.)

Přiřazení čísel na stránku/splátku má výhodu v tom, že máte úplnou kontrolu, a tak budete vědět, co je třeba opravit, když se vám něco stane, a pokud chcete změnit pořadí, můžete tak učinit pouze změnou čísel. Předpokládám, že budete mít metabox pro úpravu vlastního názvu pole _installment pro výběr čísel splátky (a mohl by dokonce spravovat/spouštět čísla splátek prostřednictvím AJAX, pokud chcete být kreativní, abyste nikdy neudělali mají stránky mimo synchronizaci.)

Použijte $wp_rewrite->add_rule() k explicitnímu přiřazení adresy URL

Nebudu jít do hloubky, protože vím, že jste obecně dostal šílený WordPress skilz, takže budu poukazovat na to, že $wp_rewrite->add_rule() je tou nejoblíbenější, jak to všechno dostat do práce. Všechno ostatní jen poskytuje podporu kolem výsledku této funkce. Pomocí háčku init přiřaďte své pravidlo 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
}

Použijte parse_query hook k překladu URL do dotazu Vars

Druhá polovina tohoto řešení používá háček parse_query, o kterém vím, že s ním velmi dobře znáte. Obecně zachycujeme query_vars definované v init a zachycené pomocí pravidla URL a převádíme je na to, co potřebujeme k dotazování příspěvků WordPress s taxonomy + term zpracovávajícími vaše series a meta_key + meta_value zpracovávající explicitně přiřazenou splátku/stránku:

<?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
  }
}

Souhrn

Normálně bych šel do mnohem větší hloubky vysvětlující odpověď, ale je pozdě, měl jsem příliš málo spánku v posledních 48 hodinách, a co je nejdůležitější, vím, že na to můžeš přijít, pravděpodobně jsi potřeboval jednu věc, o které jsem se zde zmínil .

Doufám, že se vám toto řešení líbí. Dokonce i když nemáte dvě části s init a parse_query a $wp_rewrite->add_rule() a $query->query_vars[] respektive to, co potřebujete, i když se chcete držet své původní architektury. Hodně štěstí a těšíme se na to, až budete mít hotovo a online!

Mimochodem, doufám, že to pomůže.

6
MikeSchinkel

Zde je kód, který používám ke změně počtu příspěvků v archivních stránkách kategorií a značek:

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

Nemůžete-li tuto práci provést s vlastním taxonomickým pokusem, zkuste s nativními (kategoriemi, značkami) zkontrolovat, zda je problém se samotným kódem, s taxonomií nebo s něčím jiným.

Také si nejsem jistý, jestli jste zmeškali nebo vynechali, ale $ paged není globální proměnná. Musí být načteno jako get_query_var ('paged')

2
Rarst

Jakmile jsem se s tím setkal s problémem a prošel těžkými dobami až hodinou tahem za vlasy. I googled a nenašel žádné konkrétní řešení o těchto tématech. Našel jsem několik článků o talentu, ale neuspokojovaly mé problémy. Vlastní stránkování stránek vlastní taxonomie archivace závisí na některých nastaveních argumentů souvisejících funkcí. Takže vlastně chodím sem, abych se podělil o své myšlenky na vyřešení problému s stránkováním archivu taxonomie.

Pět věcí, které potřebujete pro správné stránkování stránek vlastní taxonomie:

(1) Nepokládejte parametr parametru exclude_from_search jako parametr parametru register_post_type nebo ho nastavte 'exclude_from_search' => false. Ve výchozím nastavení je false.

(2) Taxonomie, která bude použita s vlastním typem příspěvku, nastaví parametr 'taxonomies' => 'custom_taxonomy_name' jako parametr parametru register_post_type nebo použije parametr register_taxonomy_for_object_type() přímo. Vlastní taxonomie musí být ještě registrovány pomocí register_taxonomy().

(3) Při dotazování v rámci new WP_Query ($args)

i) Pokud není nastaveno v adminstatic front page use before new WP_Query($args)

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

a použít $query = new WP_Query( array( 'paged' => $paged ) );

ii) Pokud je nastaveno v administraci statické front page použití před 'new WP_Query ($ args)':

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

a použít $query = new WP_Query( array( 'page' => $paged ) );

Nezapomeňte použít parametr posts_per_page a paged v poli new WP_Query($arg) argument.

Pokud nenastavíte statickou stránku, měli byste použít parametr page v poli new WP_Query ($arg) argument.

(4) Použijte funkci Wordpress paginate_links( $args ) jako příklad uvedený níže k vykreslení stránkování v souboru šablony archivu.

<?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) Funkce paginate_links() vypisuje ul li seznam s page-numbers třídou. Použijete-li zaváděcí_příkaz pagination třídy do ul pomocí javascriptu nebo jquery a výstupem bude pěkná fantázie.

Doufám, že si nyní můžete vychutnat stránkování v šabloně archivu taxonomie bez problému 404 :-)

0
saifulmasud