acf auto increment field
snippet in php

acf auto increment field

user6295

<?php
function wfp_documents_setup_id_incr()
{

    // Check if user has rights to set it up and ACF is enabled.
    if (current_user_can('administrator') && function_exists('get_field')):

        // Initial value
        // === YOU NEED TO UPDATE HERE ===
        // Replace <code>custom_invoice_id</code> with your desired id name.
        add_option('custom_invoice_id', '0001', '', 'yes');

        /**
         * Wrapper to get the id (if i would need to add something to it)
         * @return mixed|void – stored next available id
         */
        function wfp_get_current_invoice_id()
        {
            return get_option('custom_invoice_id');
        }

        /**
         * Count up the id by one and update the globally stored id
         */
        function wfp_increase_invoice_id()
        {
            $curr_invoice_id    = get_option('custom_invoice_id');
            $next_invoice_id    = intval($curr_invoice_id) + 1;
            update_option('custom_invoice_id', $next_invoice_id);
        }

        /**
         * Populate the acf field when loading it.
         */
        function wfp_auto_get_current_document_id($value, $post_id, $field)
        {
            // If the custom field already has a value in it, just return this one (we don't want to overwrite it every single time)
            if ($value !== null && $value !== "") {
                return $value;
            }

            // If the field is empty, get the currently stored next available id and fill it in the field.
            $value = wfp_get_current_invoice_id();
            return $value;
        }

        // Use ACF hooks to populate the field on load
        // ==== YOU NEED TO UPDATE HERE ====
        // Replace <code>invoice_id</code> with the name of your field.
        add_filter('acf/load_value/name=invoice_id', 'wfp_auto_get_current_document_id', 10, 3);

        /**
         * Registers function to check if the globally stored id needs to be updated after a post is saved.
         */
        function wfp_acf_save_post($post_id)
        {
            // Check if the post had any ACF to begin with.
            if (!isset($_POST['acf'])) {
                return;
            }

            $fields = $_POST['acf'];

            // Only move to the next id when any ACF fields were added to that post, otherwise this might be an accident and would skip an id.
            if ($_POST['_acf_changed'] == 0) {
                return;
            }

            // Next we need to find the field out id is stored in
            foreach ($fields as $field_key => $value) {
                $field_object = get_field_object($field_key);

                /**
                 * If we found our field and the value of that field is the same as our currently "next available id" –
                 * we need to increase this id, so the next post doesn't use the same id.
                 */
                if ($field_object['name'] == "invoice_id"
                    && wfp_get_current_invoice_id() == $value) {
                    wfp_increase_invoice_id();

                    return;
                }
            }
        }

        // Use a hook to run this function every time a post is saved.
        add_action('acf/save_post', 'wfp_acf_save_post', 20);

        /**
         * The code below just displays the currently stored next id on an acf-options-page,
         * so it's easy to see which id you're on. The field is disabled to prevent easy tinkering with the id.
         */
        function wfp_load_current_document_ids_settingspage($value, $postid, $field)
        {
            if ($field['name'] == "document_ids-group_current_invoice_id") {
                return wfp_get_current_invoice_id();
            }
            return $value;
        }

        function wfp_disable_acf_field($field)
        {
            $field['disabled'] = 1;

            return $field;
        }

        add_filter('acf/load_field/name=current_invoice_id', 'wfp_disable_acf_field', 10, 3);
        add_filter('acf/load_value/name=current_invoice_id', 'wfp_load_current_document_ids_settingspage', 10, 3);

    endif;
}

add_action('init', 'wfp_documents_setup_id_incr');
?>