web-dev-qa-db-ja.com

自動入力の抜粋フィールド

投稿コンテンツの最初の15単語を抜粋フィールドに自動入力するにはどうすればよいですか。私はこの断片を見つけました:

function wps_excerpt_content( $content ) {
    $content = "YOUR EXCERPT HERE";
    return $content;
}
add_filter( 'default_excerpt', 'wps_excerpt_content' );

しかし、私は必要なものでそれを変更する方法がわかりません。何か手助け?

1
Towfiq

excerpt_length フィルタを使用してはどうですか。

function my_excerpt_lenght( $length ) {
    return 15;
}
add_filter( 'excerpt_length', 'my_excerpt_lenght', 999 );
4
mor7ifer

OPコードスニペットは、投稿を作成するときのデフォルトの抜粋http://example.com/wp-admin/post-new.phpを設定するためのものです。だから、それは望みの行動には役に立ちません。
また、そのフィルタの詳細な使用方法については最後の注意を確認してください。


最初に、私はそれを行うためのsave_postアクションを考えましたが、 このEugene Manuilovからの答え にNiceのヒントが見つかりました。

次のコードでは、投稿が作成または保存されるたびにpost_excerptが自動入力されます。以前の抜粋がない場合は、になります
抜粋の作成は、URLや短い単語を区別しないため、大幅に向上させることができます。

// Define the custom excerpt length
$wpse_40574_custom_excerpt_length = 15;

add_filter( 'wp_insert_post_data', 'wpse_40574_populate_excerpt', 99, 2 );

/** 
 * Checks if the the post has excerpt or not
 * Code reference: https://wordpress.stackexchange.com/a/52897/12615
 */
// 
function wpse_40574_populate_excerpt( $data, $postarr ) 
{   
    global $wpse_40574_custom_excerpt_length;

    // check if it's a valid call
    if ( !in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) && 'post' == $data['post_type'] ) 
    {
        // if the except is empty, call the excerpt creation function
        if ( strlen($data['post_excerpt']) == 0 ) 
            $data['post_excerpt'] = wpse_40574_create_excerpt( $data['post_content'], $wpse_40574_custom_excerpt_length );
    }

    return $data;
}

/** 
 * Returns the original content string if its Word count is lesser than $length, 
 * or a trimed version with the desired length.
 * Reference: see this StackOverflow Q&A - http://stackoverflow.com/q/11521456/1287812
 */
function wpse_40574_create_excerpt( $content, $length = 20 )
{
    $the_string = preg_replace( '#\s+#', ' ', $content );
    $words = explode( ' ', $the_string );

    /**
     * The following is a more efficient way to split the $content into an array of words
     * but has the caveat of spliting Url's into words ( removes the /, :, ., charachters )
     * so, not very useful in this context, could be improved though.
     * Note that $words[0] has to be used as the array to be dealt with (count, array_slice)
     */
    //preg_match_all( '/\b[\w\d-]+\b/', $content, $words );

    if( count($words) <= $length ) 
        $result = $content;
    else
        $result = implode( ' ', array_slice( $words, 0, $length ) );

    return $result;
}

注意

default_excerptフィルターの使用例

add_filter( 'default_excerpt', 'wpse_40574_excerpt_content', 10, 2 );

function wpse_40574_excerpt_content(  $post_excerpt, $post  ) 
{
    // Do nothing if not the correct post type
    // http://codex.wordpress.org/Post_Types
    if( 'post' != $post->post_type )
        return;

    $post_excerpt = "DEFAULT EXCERPT FOR POSTS OF THE TYPE -POST-";

    return $post_excerpt;
}
0
brasofilo