web-dev-qa-db-ja.com

カスタム投稿タイプのコンテンツの抜粋のみを表示する方法

<?php
/*
Template Name: second
*/
?>


<?php get_header(); ?>


<?php query_posts(array('post_type'=>'event')); ?>
    <?php if(have_posts()) while(have_posts()) : the_post(); ?>
    <div id="post-<?php the_ID(); ?>" class="entry">
        <div class="thumbnail"><?php the_post_thumbnail('full'); ?></div>
        <h1 class="title"><?php the_title(); ?></h1>
        <div class="content page">
            <?php the_content(); ?>
            <?php wp_link_pages(array('before' => '<div class="page-link">'.__('Pages', 'cpotheme').':', 'after' => '</div>')); ?>
        </div>
    </div>
    <?php endwhile; ?>


<?php get_sidebar(); ?>
<?php get_footer(); ?>

このページはindex.phpのように振る舞います。フルページへのリンクとしてタイトルを作成し、コンテンツの抜粋のみを表示させるには、何を修正すればよいですか。

2
user1735118

2つの小さな変更(1行目と3行目)だけが必要ですが、私はdivのクラスをより適切に見えるように調整するという自由も取りました。

<h1 class="title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
<div class="excerpt event">
   <?php the_excerpt(); ?>
   <?php wp_link_pages(array('before' => '<div class="page-link">'.__('Pages', 'cpotheme').':', 'after' => '</div>')); ?>
</div>
0
mrwweb

Wordpressの関数を使用してHTMLアンカータグを作成する必要があります。これが例です。

例 -

<h1 class="title">
    <a href="<?php the_permalink(); ?>" title="<?php printf( 'Permalink to %s', the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a>
</h1>

抜粋だけを表示するには、 the_excerpt() という関数があります。

0
amit

最初のオフ: 面白い質問!

次に、投稿に<!--nextpage-->タグを1回または複数回追加する必要があります。さもなければそれは働かないでしょう。

プラグイン:

このプラグインが行うことは、get_permalink()によって内部的に呼び出されるwp_link_pages()の出力を傍受することです。 get_permalink()の中に、カスタム投稿タイプに返すget_post_permalink()関数があります。そこに'post_type_link'-フィルタがあります。これがフックするところです。

それからglobal $pagesを取ります。これは<!--nextpage--> HTMLコメントで分割された投稿コンテンツの配列を保持します。静的変数は、関数が呼び出された時間に基づいて(0から)、どの部分を返すべきかを判断するのに役立つカウンターです。

最後のことは、この部分を$pagesからポストリンクに追加することです。 esc_url()関数はパーマリンクを傍受し、すべての大文字、スペースなどをめちゃくちゃにするので、そこにも単一の発砲フィルタを付けて元の文字列を返すだけです。

<?php 
/** Plugin Name: (#67750) »kaiser« Append excerpt to post pagination */

/**
 * Callback for get_post_permalink() that is called by get_permalink() for
 * custom post types. We append the $GLOBALS['pages'][ $current ] excerpt here.
 * @param  string $post_link The original posts page link
 * @param  object $post The post object
 * @param  mixed boolean/string $leavename
 * @param  mixed boolean/string $sample A sample link
 * @return string $post_link
 */
function wpse67750_pagination_excerpt( $post_link, $post, $leavename, $sample )
{
    if (
        'YOUR_POST_TYPE' !== get_post_type()
        OR ! in_the_loop()
        OR ! is_singular()
    )
        return;

    static $n = 0;
    // The global pages array: Contains the current post type pages
    global $pages;

    // We need a callback to reserve the original appended string
    // not messed up by the esc_url() function.
    add_filter( 'clean_url', 'wpse67750_pagination_url_cb', 10, 3 );

    // The current page content
    $curr = $pages[ $n++ ];

    // Build the output
    // Wrap it up for easy targeting via CSS and JS
    // Also append a non visible single HTML tag to allow closing the still open anchor
    $output = sprintf(
         '"> %s <span class="excerpt" id="page-%s">%s</span><a style="display:none" rel="nofollow" href="#'
        ,$n
        ,$n
        ,trim( $curr )
    );
    /*$output = apply_filters(
         'the_excerpt'
        ,$output
    );*/

    // Append to the link
    return $post_link.$output;
}
add_filter( 'post_type_link', 'wpse67750_pagination_excerpt', 10, 4 );

/**
 * The callback to preserve the string appended to the permalink
 * @param  string $url Escaped
 * @param  string $orig_url Not escaped
 * @param  string $context 'display'
 */
function wpse67750_pagination_url_cb( $url, $orig_url, $context )
{
    // Only run once
    remove_filter( current_filter(), __FUNCTION__ );

    // Return the non escaped original
    return $orig_url;
}

解決策は完全に完璧というわけではありません。私は最初の数字を取り除くことを回避していませんでしたし、場合によっては最後のリンクを検索することにわずかな問題があるようです。それは、コアが追加された</a>終了タグを取り除く可能性を提供しないという問題もありました、そこで私はfakeリンクを追加しなければなりませんでした。それらは表示されず、検索エンジンも後に続かず、害もありません。彼らはただ美しくはありませんが、それが唯一の可能性です。

0
kaiser