Hinzufügen von Anker zu paginate_links + Safari Anker Bug

Ich verstehe nicht ganz, wie das Umschreiben von pagination_links() funktioniert. Hier ist meine Paginierungsfunktion:

 $big = 999999999; $translated = __( 'Page ', 'epc' ); echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?page=%#%', // Here I'd like to add my anchor #result 'current' => max( 1, get_query_var( 'paged' ) ), 'total' => $wp_query->max_num_pages, 'before_page_number' => ''.$translated.' ', 'prev_text' => __( 'Précédent', 'epc' ), 'next_text' => __( 'Suivant', 'epc' ), 'type' => 'list', ) ); 

Allerdings habe ich einen schönen Permalink eingeschaltet, so dass das Format ?page=%#% in /page/#/ geändert wird. So weit, ist es gut. Aber ich habe zwei Probleme:

  • Erstens hat meine Abfrage zwei Variablen im Permalink wie ?programme=10&type=2 . Wenn ich auf die zweite Seite gehe, fügt wordpress am Ende des Permalinks #038;type=2 hinzu (jetzt habe ich ?programme=10&type=2#038;type=2 ). Ich weiß nicht warum.

  • Zweitens, wenn ich versuche, dem Format einen Anker hinzuzufügen, so wie dies ?page=%#%#result , wird es nicht funktionieren. Wenn ich versuche, die Variable in ?nb=%#%#result umzubenennen, funktioniert sie immer noch nicht. Ich habe sogar versucht, /page/#/#result wie es die schöne Permalink-Struktur passt, aber immer noch kein Glück. Kann mir jemand den richtigen Weg weisen oder erklären, was hier passiert?

Vielen Dank!


AKTUALISIEREN 1

Dank @bonger Kommentar funktioniert der Permalink perfekt mit diesem aktualisierten Code:

 $big = 999999999; $translated = __( 'Page ', 'epc' ); echo paginate_links( array( 'base' => str_replace( $big, '%#%', get_pagenum_link( $big, false ) ), 'current' => max( 1, get_query_var( 'paged' ) ), 'total' => $wp_query->max_num_pages, 'before_page_number' => ''.$translated.' ', 'prev_text' => __( 'Précédent', 'epc' ), 'next_text' => __( 'Suivant', 'epc' ), 'type' => 'list', 'add_fragment' => '#result', ) ); 

Wenn Sie jedoch nach dem Ausgraben etwas mehr klicken, verliert der vorherige Link beim Klicken den Anker in Safari (funktioniert in Chrome und Firefox einwandfrei). Ich habe diesen alten Beitrag gelesen und es scheint, dass etwas mit der Umleitung von Safari etwas seltsam ist.

Richtig wissen, mein vorheriger Link zeigt diese href http://mywebsite.com/page/1/#result oder http://mywebsite.com/page/1/?programme=10&type=2#result abhängig von der Filterung. Wenn ich darauf klicke, wird es jedoch auf http://mywebsite.com/ oder http://mywebsite.com/?programme=10&type=2 umgeleitet. Anscheinend benötigt Safari das / vor dem #anchor aber ich bin mir nicht sicher, wie ich das hinzufügen soll, als ob ich es dem fragment arg hinzufügen würde. Irgendwelche Ideen?

Solutions Collecting From Web of "Hinzufügen von Anker zu paginate_links + Safari Anker Bug"

Wenn es jemandem helfen kann, finden Sie hier die vollständige Antwort auf die Probleme, die auftreten können, wenn Sie die WordPress-Paginierung mit Ankern zu einer Vorlagenseite hinzufügen möchten.


SCHRITT 1

Folgen Sie dem Beispiel im Codex, sodass die function paginate_links() auf Ihre benutzerdefinierte Abfrage und nicht auf die Hauptabfrage angewendet wird.


SCHRITT 2

Ihre function sollte wie folgt aussehen:

 global $wp_query; $big = 999999999; // need an unlikely integer $translated = __( 'Page', 'mytextdomain' ); // Supply translatable string echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => max( 1, get_query_var('paged') ), 'total' => $wp_query->max_num_pages, 'before_page_number' => ''.$translated.' ' ) ); 

Nun können einige Probleme mit diesem Code auftreten, hier sind ein paar Lösungen:

  • Es ist besser, wenn Sie das 'format' => '?paged=%#%', Zeile entfernen und WordPress macht einen Job mit dem Formatieren von Permalink (es kann Probleme mit hübschem Permalink verursachen);

  • Sie können ein Escape-Problem mit der # Ihres Ankers haben, wenn Sie die get_pagenum_link() . In diesem Fall entfernen esc_url() einfach die function esc_url() in diesem Teil esc_url( get_pagenum_link( $big ) ) ;

  • Es gibt ein Argument zum Hinzufügen Ihres Ankers, er heißt add_fragment .

Überprüfen Sie den Codex, um alle Argumente zu sehen, die Sie mit dieser function verwenden können. Am Ende sieht Ihr Code ungefähr so ​​aus:

 $big = 999999999; $translated = __( 'Page', 'mytextdomain' ); echo paginate_links( array( 'base' => str_replace( $big, '%#%', get_pagenum_link( $big, false ) ), 'current' => max( 1, get_query_var( 'paged' ) ), 'total' => $wp_query->max_num_pages, 'before_page_number' => ''.$translated.' ', 'prev_text' => __( 'Précédent', 'epc' ), // In case you want to change the previous link text 'next_text' => __( 'Suivant', 'epc' ), In case you want to change the next link text 'type' => 'list', // How you want the return value to be formatted 'add_fragment' => '#result', // Your anchor ) ); 

SCHRITT 3

Zum Schluss gibt es ein Problem damit, wie Safari die Umleitung von Seiten mit Anker behandelt. Sie können feststellen, dass der Anker nicht angewendet wird, wenn Sie in Safari zur ersten Seite zurückkehren. Was Sie tun müssen (wenn Sie einen schönen Permalink aktiviert haben), ist das Filtern der page/1 , um eine Umleitung zu verhindern. Wie so:

 add_filter( 'paginate_links', 'custom_pagination_redirect' ); function custom_pagination_redirect( $link ) { return preg_replace( '%/page/1/%', '/', $link ); } 

Und das ist es! Vielen Dank an @bonger für die wertvolle Hilfe!