web-dev-qa-db-ja.com

大きな投稿を<! - nextpage - >で分割した場合、検索でユーザーを正しいページに見つけるにはどうすればよいですか。

私は<!-- nextpage -->で大きな記事を分割しています。用語は50ページにあります。用語を検索すると、1ページに着陸します。

Q:システムが50ページに自動転送するにはどうすればよいですか。

ありがとう

2
p.a.

更新:私がこれを自分で必要とした後、私はそれを完全に作り直しました。

目標

私はすべてのget_permalink()呼び出しを直接ページングされた投稿ページを指すようにしたかった - 例外なく。少なくとも、これはどこかにリンクする必要がある他のほとんどすべての関数によって使用される関数です。そのため、imoも最も信頼性があります。

プラグインは何をする

WPが完全にロードされたときにジャンプし、アクション/コールバック関数をthe_post-hookに追加します。その後、グローバルな$numpages(投稿のページ数を保持する)と$pages(コンテンツ内で<!--nextpost-->を使用して投稿が分割される部分を保持する)をチェックします。ページ数が1以下であれば、それは中止されます。そうでなければ、検索された文字列の投稿ページを検索します。見つかった場合は、_wp_link_page()を使用して$linkクラスプロパティをページリンクに設定します。このリンクはそれからget_permalink()によって提供されるフィルタの中に添付されます。

それは何のために働くのですか?

投稿、ページ、カスタム投稿タイプに有効です。

プラグイン

いつでも無料でご利用いただけます。それをつかむ、それを使う。楽しんでください。

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