Search code examples
phpwordpressadvanced-custom-fieldselementoracfpro

PHP Help Using ACF Pro to Load/Enqueue CSS Stylesheet on WordPress Archives, Pages, and Posts


I have no experience with PHP. I am using ACF select fields to give my client the option of choosing a stylesheet at the individual page, post, and archive level. Just for reference, the fields are singular_css, portfolio_css, and careers_css, depending on the content type, and share these dropdown values:

/wp-content/themes/hello-theme-child-master/custom-css/white.css : White
/wp-content/themes/hello-theme-child-master/custom-css/black.css : Black
/wp-content/themes/hello-theme-child-master/custom-css/blue.css : Blue
/wp-content/themes/hello-theme-child-master/custom-css/tan.css : Tan
/wp-content/themes/hello-theme-child-master/custom-css/gray.css : Gray

This script in the functions.php seems to work as expected to control the stylesheet that gets loaded on singular Posts/Pages, but doesn't allow them to choose a stylesheet for custom post type archives:

/** Insert Dynamic Stylesheet Into <Head> using ACF Field **/
add_action( 'wp_head', 'add_head_script' );
function add_head_script() { ?>

<?php 
$singular_css = get_field('singular_css');
if( $singular_css ): ?>
    <link rel="stylesheet" href="<?php echo esc_url( $singular_css ); ?>">
<?php endif; ?>

<?php }

Since I wasn't able to control the stylesheet on custom post archives the same way, I've created options pages for them:

/** Creates ACF Options Pages **/
if( function_exists('acf_add_options_page') ) {
    
    acf_add_options_sub_page(array(
        'page_title'    => 'Portfolio Style',
        'menu_title'    => 'Portfolio Style',
        'parent_slug'   => 'edit.php?post_type=portfolio',
        'capability'    => 'manage_options'
    ));
    
    acf_add_options_sub_page(array(
        'page_title'    => 'Careers Style',
        'menu_title'    => 'Careers Style',
        'parent_slug'   => 'edit.php?post_type=careers',
        'capability'    => 'manage_options'
    ));
    
}

And tried to enqueue the stylesheets instead, but something isn't working:

/** Enqueue Dynamic Stylesheet using ACF Field **/
function dynamic_style() {
    $singular_css = get_field('singular_css');
    $portfolio_css = get_field('portfolio_css', 'option');
    $careers_css = get_field('careers_css', 'option');

    if (is_singular()) {
    wp_enqueue_style( 'singular_css', get_stylesheet_directory_uri(). $singular_css );
    }
    elseif (is_post_type_archive('portfolio')) {
    wp_enqueue_style( 'portfolio_css', get_stylesheet_directory_uri(). $portfolio_css );
    }
    elseif (is_post_type_archive('careers')) {
    wp_enqueue_style( 'careers_css', get_stylesheet_directory_uri(). $careers_css );
    }
}
add_action( 'wp_enqueue_scripts', 'dynamic_style' );

I also tried writing it this way, but it still doesn't work:

/** Enqueue Dynamic Stylesheet using ACF Field **/
function singular_style() {
    $singular_css = get_field('singular_css');
    if (is_singular()) {
    wp_enqueue_style( 'singular_css', get_stylesheet_directory_uri(). $singular_css );
    }
}
add_action( 'wp_enqueue_scripts', 'singular_style' );
    
function portfolio_style() {
    $portfolio_css = get_field('portfolio_css', 'option');
    if (is_post_type_archive('portfolio')) {
    wp_enqueue_style( 'portfolio_css', get_stylesheet_directory_uri(). $portfolio_css );
    }
}
add_action( 'wp_enqueue_scripts', 'portfolio_style' );  
    
function careers_style() {
    $careers_css = get_field('careers_css', 'option');  
    if (is_post_type_archive('careers')) {
    wp_enqueue_style( 'careers_css', get_stylesheet_directory_uri(). $careers_css );
    }
}
add_action( 'wp_enqueue_scripts', 'careers_style' );

Solution

  • I would suggest you to change the dropdown value to

      /custom-css/white.css : White
        /custom-css/black.css : Black
        /custom-css/blue.css : Blue
        /custom-css/tan.css : Tan
        /custom-css/gray.css : Gray
    

    And then add the following code on functions.php file

     function dynamic_style()
        {
            if (is_singular()) {
                global $post;
                $cog_stylesheet = get_field('cog_background_color', $post->ID);
                wp_enqueue_style('singular_css', get_stylesheet_directory_uri() . $cog_stylesheet);
            }else {
    
        global $post;
        $post_type = get_current_post_types($post);
    
        if ($post_type == 'portfolio') {
            $portfolio_css = get_field('portfolio_css', 'option');
            wp_enqueue_style('portfolio_css', get_stylesheet_directory_uri() . $portfolio_css);
        } elseif ($post_type == 'careers') {
            $careers_css = get_field('careers_css', 'option');
            wp_enqueue_style('careers_css', get_stylesheet_directory_uri() . $careers_css);
        } 
    }
        }
        add_action('wp_enqueue_scripts', 'dynamic_style');
    

    However, if you still want to use the current dropdown value add the following code on the functions.php file to

    function dynamic_style()
    {
        if (is_singular()) {
            global $post;
            $cog_stylesheet = get_field('cog_background_color', $post->ID);
            wp_enqueue_style('singular_css', home_url() . $cog_stylesheet);
        } else {
    
        global $post;
        $post_type = get_current_post_types($post);
    
        if ($post_type == 'portfolio') {
            $portfolio_css = get_field('portfolio_css', 'option');
            wp_enqueue_style('portfolio_css', home_url() . $portfolio_css);
        } elseif ($post_type == 'careers') {
            $careers_css = get_field('careers_css', 'option');
            wp_enqueue_style('careers_css', home_url() . $careers_css);
        } 
    }
    }
    add_action('wp_enqueue_scripts', 'dynamic_style');
    

    And add the following code on functions.php so that we can get post_type on archive page

    function get_current_post_types($object = null)
    {
    
        // if a numeric value passed, assume it is a post ID
        if (($object) && (is_numeric($object))) {
            $object = get_post($object);
        }
        // if an object is passed, assume to be a post object
        if (($object) && (is_object($object))) {
            return get_post_type($object);
        }
    
        // standard single post type checks
        if (is_404()) {
            return '';
        }
        // update: removed this check, handled by is_singular
        // if (is_single()) {return 'post';}
        if (is_page()) {
            return 'page';
        }
        if (is_attachment()) {
            return 'attachment';
        }
        if (is_singular()) {
            return get_post_type();
        }
    
        // if a custom query object was not passed, use $wp_query global
        if ((!$object) || (!is_object($object))) {
            global $wp_query;
            $object = $wp_query;
        }
        if (!is_object($object)) {
            return '';
        } // should not fail
    
        // if the post_type query var has been explicitly set
        // (or implicitly set on the cpt via a has_archive redirect)
        // ie. this is true for is_post_type_archive at least
        // $vqueriedposttype = get_query_var('post_type'); // $wp_query only
        if (property_exists($object, 'query_vars')) {
            $posttype = $object->query_vars['post_type'];
            if ($posttype) {
                return $posttype;
            }
        }