web-dev-qa-db-fra.com

Lorsque je divise un article volumineux avec <! - nextpage ->, comment une recherche peut-elle localiser les utilisateurs sur la bonne page?

J'ai un gros post partagé avec <!-- nextpage -->. Un terme se trouve à la page 50. Lorsque je recherche le terme, je tombe à la page 1.

Q: Comment le système peut-il me transférer automatiquement à la page 50?

Merci

2
p.a.

UPDATE: Après en avoir eu besoin moi-même, je l'ai complètement retravaillé.

Le but

Je voulais pointer chaque appel get_permalink() directement sur la page de publication paginée - sans aucune exception. Au moins, c’est la fonction utilisée par presque toutes les autres fonctions qui ont besoin d’être reliées quelque part, de sorte qu’elle est aussi la plus fiable.

Que fait le plugin?

Il intervient lorsque WP est entièrement chargé et ajoute une fonction action/rappel au crochet the_post-. Là, il vérifie ensuite les globales $numpages (contient le nombre de pages d’une publication) et $pages (contient les parties d’une publication est scindée en utilisant <!--nextpost--> dans le contenu). Si le nombre de pages n'est pas supérieur à 1, il est annulé. Sinon, il cherche dans la page des articles la chaîne recherchée. S'il a été trouvé, il définit la propriété de classe $link sur le lien de page à l'aide de _wp_link_page(). Ce lien est ensuite intégré aux filtres proposés par get_permalink().

Pour quoi ça marche?

Cela fonctionne pour les articles, les pages et les types d'articles personnalisés

Le plugin

Comme à chaque fois: Gratuit pour utilisation. Prenez-le, utilisez-le. Aie du plaisir avec ça.

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