Home › Forums › ACF PRO › Auto-populate Custom Post Excerpt with one or multiple Custom Field(s) › Reply To: Auto-populate Custom Post Excerpt with one or multiple Custom Field(s)
Also i believe there is very close answer to what i need: on stack exchange
The following code auto-populates the post_excerpt whenever a post is created or saved, if it had no previous excerpt.
Note that the excerpt creation can be greatly improved, as it doesn’t differentiates Urls nor short words.
// 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;
}
Note
Example of default_excerpt filter usage:
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;
}
Welcome to the Advanced Custom Fields community forum.
Browse through ideas, snippets of code, questions and answers between fellow ACF users
Helping others is a great way to earn karma, gain badges and help ACF development!
We use cookies to offer you a better browsing experience, analyze site traffic and personalize content. Read about how we use cookies and how you can control them in our Privacy Policy. If you continue to use this site, you consent to our use of cookies.