Filtern und listen Sie Beiträge einer benutzerdefinierten Taxonomie auf

Ich habe eine benutzerdefinierte Taxonomie namens “Besitzer” und es hat mehrere Beiträge als Eigentümer Namen (Verwendung als eine Kategorie), so dass ich Beiträge nach “Eigentümer” Taxonomie filtern kann.

Ich versuche eine Indexseite aller Besitzernamen zu erstellen, die mit dem Buchstaben ‘A’ beginnt. Ich konnte alle Besitzer mit folgendem Code auflisten.

foreach ( get_terms( 'owner' ) as $o ){ $owner = $o -> name; if($owner[0] === 'A'){ // Coding here... } } 

Das Problem, dem ich gegenüberstehe, ist, dass ich unten auf der Seite eine Seitennummerierung anzeigen möchte, da es Hunderte von Autorensternen mit “A” gibt.

Solutions Collecting From Web of "Filtern und listen Sie Beiträge einer benutzerdefinierten Taxonomie auf"

Bevor wir uns die Paginierung ansehen, benötigen Sie nur die Begriffe, die mit A . Wenn ja, können Sie den Parameter get_terms in get_terms , um nur Begriffe zu erhalten, die mit A . Nur ein Hinweis darauf, die Bedienung des Parameters wurde in WordPress V3.7 geändert, daher müssen Sie den folgenden Filter anwenden, damit er wie erwartet funktioniert ( Kredit an @s_ha_dum, siehe seine Antwort hier .) HINWEIS: Der Code erfordert PHP 5.4+ )

 add_filter( 'terms_clauses', function ($clauses) { remove_filter( 'term_clauses', __FUNCTION__ ); $pattern = '|(name LIKE )\'%(.+%)\'|'; $clauses['where'] = preg_replace($pattern,'$1 \'$2\'',$clauses['where']); return $clauses; }); $terms = get_terms( 'ownwer' ['name__like' => 'A'] ); 

Um eine Liste von Begriffen zu paginieren, benötigen wir:

  • Die aktuelle Seitenzahl

  • Die Gesamtanzahl der Begriffe in der Liste

  • Insgesamt wird es Seiten geben

Um die Seitennummer der aktuellen Seite oder einer beliebigen Seite zu erhalten, ist es einfach. Dies funktioniert auf allen Seiten, einschließlich der statischen Titelseiten und einzelner Post-Seiten

 if ( get_query_var( 'paged' ) ) { $current_page = get_query_var( 'paged' ); } elseif ( get_query_var( 'page' ) ) { $current_page = get_query_var( 'page' ); } else { $current_page = 1; } 

Wir müssen nun die Gesamtzahl der Begriffe aus der Taxonomie kennen. Hier können wir entweder wp_count_terms() , das get_terms() oder get_terms() selbst benutzt. Denken Sie daran, wenn wir den Filter verwenden, um Terme nach einem bestimmten Buchstaben / Namen zu erhalten, wird der Filter auf diesen Lauf von get_terms() / wp_count_terms() angewendet, genauso wie wir eine Schließung verwenden

 $terms_count = get_terms( 'owner', ['name__like' => 'A', 'fields' => 'count'] ); 

Jetzt haben wir die Gesamtzahl der Begriffe, die unseren Kriterien entsprechen. wp_count_terms() daran, wenn Sie wp_count_terms() , denken Sie daran, hide_empty auf “true” zu setzen, wenn Sie keine leeren Begriffe hide_empty müssen. Standardmäßig setzt wp_count_terms() dies auf false

Jetzt können wir unsere maximale Anzahl an Seiten berechnen

 // Set the amount of terms we need to display per page $terms_per_page = 10; // Get the total amount of pages $max_num_pages = $terms_count / $terms_per_page; 

Um Paginierungslinks zur nächsten und vorherigen Seite zu erhalten, ist es wirklich einfach. Das einzige, was eine Paginierungsfunktion jemals aus einer Abfrage wissen muss, ist die maximale Seitenanzahl, sonst nichts. Es muss nicht wissen, was es paginieren soll. Wir können also einfach die functionen next_posts_link() und previous_posts_link() verwenden. Sie können auch paginate_links() oder sogar Ihre eigene function schreiben, um Ihren Anforderungen zu entsprechen. $max_num_pages daran, $max_num_pages als maximale Seitenanzahl an die Paginierungsfunktion zu übergeben

 next_posts_link( 'Next terms', $max_num_pages ); previous_posts_link( 'Previous terms' ); 

Das einzige, was wir noch tun müssen, ist get_terms() , was auch wirklich einfach ist. Wir werden den offset Parameter verwenden, um die Begriffe nach Seite und number zu versetzen, um die erforderliche Anzahl von Begriffen pro Seite zu erhalten

 // Calculate offset $offset = ( $current_page == 1) ? 0 : ( ($current_page - 1) * $terms_per_page ); // Setup our arguments $args = [ 'number' => $terms_per_page, 'offset' => $offset ]; 

Wir können jetzt alles zusammensetzen

JETZT ALLE ZUSAMMEN

Kurz bevor wir es tun, ein paar wichtige Notizen

  • Der gesamte Code wurde nicht getestet

  • Der Code benötigt mindestens PHP 5.4, was die absolute PHP-Mindestversion ist, die Sie zum Zeitpunkt dieses Posts ausführen sollten

  • Modifizieren und auseinander reißen wie nötig

Hier ist der Code, endlich

 add_filter( 'terms_clauses', function ($clauses) { remove_filter( 'term_clauses', __FUNCTION__ ); $pattern = '|(name LIKE )\'%(.+%)\'|'; $clauses['where'] = preg_replace($pattern,'$1 \'$2\'',$clauses['where']); return $clauses; }); $taxonomy = 'owner'; $terms_count = get_terms( $taxonomy, ['name__like' => 'A', 'fields' => 'count'] ); if ( $terms_count && !is_wp_error( $terms ) ) { if ( get_query_var( 'paged' ) ) { $current_page = get_query_var( 'paged' ); } elseif ( get_query_var( 'page' ) ) { $current_page = get_query_var( 'page' ); } else { $current_page = 1; } // Set the amount of terms we need to display per page $terms_per_page = 10; // Get the total amount of pages $max_num_pages = $terms_count / $terms_per_page; // Calculate offset $offset = ( $current_page == 1) ? 0 : ( ($current_page - 1) * $terms_per_page ); // Setup our arguments $args = [ 'number' => $terms_per_page, 'offset' => $offset, 'name__like' => 'A' ]; $terms = get_terms( $taxonomy, $args ); // Do what you need to do with $terms next_posts_link( 'Next terms', $max_num_pages ); previous_posts_link( 'Previous terms' ); } 

Wenn Sie die Anzahl der angezeigten Namen nur visuell einschränken möchten, können Sie die Ergebnisse mit javascript oder jQuery und CSS in kleinere Abschnitte paginieren, die Besucher lesen können. Aber das wird keine echten, eindeutigen Seiten erzeugen.

Ich werde diese Antwort mit einem Codeabschnitt aktualisieren, den ich verwendet habe, um eine lange Liste an X-Nummern von Elementen zu begrenzen, die Sie mit einem vorherigen / nächsten Link durchsuchen, aber auch einfach eine nummerierte Seitennummerierung hinzufügen können.

Ansonsten hat eine schnelle Suche das (WordPress) Plugin erzeugt, aber ich habe es nicht getestet, und bin mir nicht sicher über die Kompatibilität mit aktuellen WP-Versionen: http://wordpress.mfields.org/plugins/taxonomy-list-shortcode/ Es scheint es tut genau das, was Sie wollen (PHP) in Form eines Shortcodes.

Update: Ich hatte den größten Teil dieses Codes von irgendwo abgefangen und modifiziert, um meinen Bedürfnissen gerecht zu werden. In meiner Anwendung habe ich functionen verwendet, um Elemente usw. zu deaktivieren und zu aktivieren, die ich hier in gerade jQuery umgewandelt habe. Berücksichtigen Sie daher, dass dort ein Teil oder ein anderer benutzerdefinierter Code vorhanden ist, der geändert werden muss, um mit Ihrem Ding zu arbeiten.

Dies in jQuery:

 var paginate_list = function(items) { var pageSize = items; // How many items per page var numberOfPages = Math.ceil(($('.lists li').length)/pageSize); // I used list items but you can use anything, this counts how many elements in total, and divides by the previous to know how many pages total var pageCounter = $("#current-page"); // I store the current page number in a hidden input value for my particular situation but you can keep track of it anyway else var prev = $('#navigation .key-prev'); var next = $('#navigation .key-next'); // the navigation buttons pageCounter.val(1); // initialize to page 1, also peculiar to my application prev.attr('disable', true); // disable prev button if page 1 if ( numberOfPages < = 1 ) { next.attr('disable', true); // disable next if only 1 page } next.on('click', function () { // calculate the list offset $(".lists li:nth-child(-n+" + ((pageCounter.val() * pageSize) + pageSize) + ")").show(); $(".lists li:nth-child(-n+" + pageCounter.val() * pageSize + ")").hide(); pageCounter.val(Number(pageCounter.val()) + 1); // update page counter if (pageCounter.val() != 1) { prev.attr('disable', false); // enable previous button } if (pageCounter.val() == numberOfPages) { $(this).attr('disable', true); // disable the next button when you reach the end } }); prev.on('click', function () { // the same in reverse pageCounter.val(Number(pageCounter.val()) - 1); $(".lists li").hide(); $(".lists li:nth-child(-n+" + (pageCounter.val() * pageSize) + ")").show(); $(".lists li:nth-child(-n+" + ((pageCounter.val() * pageSize) - pageSize) + ")").hide(); if (pageCounter.val() == 1) { $(this).attr('disable', true); } if (pageCounter.val() < numberOfPages) { next.attr('disable', false); } }); }; 

Und es würde mit Listen wie dieser funktionieren: