it-swarm.com.de

Wie kann eine Suche Benutzer auf der richtigen Seite finden, wenn ich einen großen Beitrag mit <! - nextpage -> aufteile?

Ich habe einen großen Post Split mit <!-- nextpage -->. Ein Begriff befindet sich auf Seite 50. Wenn ich nach dem Begriff suche, lande ich auf Seite 1.

F: Wie kann das System mich automatisch auf Seite 50 weiterleiten?

Vielen Dank

2
p.a.

UPDATE: Nachdem ich das selbst gebraucht habe, habe ich es komplett überarbeitet.

Das Ziel

Ich wollte jeden get_permalink()-Aufruf direkt auf die Seite mit den Seiten des Beitrags verweisen - ohne Ausnahme. Zumindest ist dies die Funktion, die von fast jeder anderen Funktion verwendet wird, die irgendwo verknüpft werden muss, so dass sie imo auch die zuverlässigste ist.

Was macht das Plugin?

Es springt ein, wenn WP vollständig geladen ist, und fügt dem the_post-hook eine Aktions-/Rückruffunktion hinzu. Dort prüft es dann den globalen $numpages (enthält die Anzahl der Seiten eines Beitrags) und den $pages (enthält die Teile, in die ein Beitrag unter Verwendung von <!--nextpost--> im Inhalt aufgeteilt wird). Wenn die Anzahl der Seiten nicht größer als 1 ist, wird der Vorgang abgebrochen. Anderenfalls durchsucht es die Postseiten nach der gesuchten Zeichenfolge. Wenn es gefunden wurde, wird die Klasseneigenschaft $link mit _wp_link_page() auf den Seitenlink gesetzt. Dieser Link wird dann innerhalb der von get_permalink() angebotenen Filter angehängt.

Wofür funktioniert es?

Es funktioniert für Posts, Seiten und benutzerdefinierte Post-Typen

Das Plugin

Wie immer: Kostenlos. Nimm es, benutze es. Viel Spass damit.

<?php
/**
 * Plugin Name: (#31913) Search Results - direct link to page
 */

add_action( 'wp', array( 'search_direct_page_links', 'init' ) );

class search_direct_page_links
{
    public static $instance;

    public static $s;

    public $link;

    public static function init()
    {
        is_null( self :: $instance ) AND self:: $instance = new self;
        return self :: $instance;
    }

    public function __construct()
    {
        if ( ! is_search() )
            return;

        is_null( self :: $s ) AND self :: $s = get_query_var( 's' );

        add_action( 'the_post', array( $this, 'is_paged' ) );
    }

    public function is_paged( $post )
    {
        global $numpages, $pages;

        // reset link:
        $this->link = get_permalink();

        // Remove filters attached from the last post
        foreach ( array( 'post_link', 'page_link', 'post_type_link' ) as $filter )
        {
            remove_filter( $filter, array( $this, 'alter_link' ) );
        }

        if ( 1 >= $numpages )
            return;

        $target = 1;
        foreach ( $pages as $i => $p )
        {
            if ( is_int( strpos( $p, self :: $s ) ) )
            {
                $target = absint( $i ) +1;

                // Get the link now, as _wp_link_page()
                // calls get_permalink() internally,
                // which would lead to an endless nested loop.
                $this->link = str_replace(
                     array( '<a href="', '">' )
                    ,''
                    ,_wp_link_page( $target )
                );
            }
        }

        if ( 1 < $target )
        {
            add_filter( 'post_link', array( $this, 'alter_link' ), 10, 3 );
            add_filter( 'page_link', array( $this, 'alter_link' ), 10, 3 );
            add_filter( 'post_type_link', array( $this, 'alter_link' ), 10, 4 );
        }
    }

    public function alter_link( $permalink, $post, $leavename, $sample )
    {
        return $this->link;
    }
}
2
kaiser