Support

Account

Forum Replies Created

  • Hi John,

    Thank you for pointing me to the right direction but i actually got it working with the solution below. When i edit the custom field value and just click save, the excerpt gets updated as well.

    Would you still recommend that i use the acf/save_post method?

    function update_custom_post_excerpt_with_acf_field( $post_id ) {
        // Ensure ACF is loaded
        if (function_exists('get_field')) {
            // Check if this is a post of your custom post type and not an autosave.
            if ( get_post_type( $post_id ) === 'watercraft' && ! wp_is_post_autosave( $post_id ) && ! wp_is_post_revision( $post_id ) ) {
                // Get the value of the custom field using ACF's get_field function.
                $custom_field_value = get_field( 'watercraft_stock_number', $post_id );
    
                // Check if the custom field value is not empty.
                if ( ! empty( $custom_field_value ) ) {
                    // Prepare an array to update the post excerpt.
                    $post_data = array(
                        'ID'           => $post_id,
                        'post_excerpt' => $custom_field_value,
                    );
    
                    // Update the post excerpt without triggering an infinite loop.
                    remove_action( 'save_post', 'update_custom_post_excerpt_with_acf_field' );
                    wp_update_post( $post_data );
                    add_action( 'save_post', 'update_custom_post_excerpt_with_acf_field' );
                }
            }
        }
    }
    
    // Hook into the save_post action.
    add_action( 'save_post', 'update_custom_post_excerpt_with_acf_field' );
  • 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;
    }
Viewing 2 posts - 1 through 2 (of 2 total)