0

I'm working for a tire company and I'm writing two plugins.

The first plugin is to show alloy wheels. The second plugin is to show tires.

Both plugins come as a custom post type 'wheels' and 'tires', and both plugins have a template logic in it (templates/archive-wheels.php and templates/archive-tires.php)

My problem: When both plugins are active, the wheels plugin overwrites the tires archive page and I don't know why on earth it is doing it.

I have really tried to avoid namespace conflicts in advance by using other function names, other prefixes etc.

Here is the relevant code for registering the CPTs and the template logic for both plugins:

Register Custom Post Type wheels:


function rg_wp_wheels_register_cpt(){

    // Custom Post Type Name
    $cpt_name = 'wheels';
    // CPT Features
    $cpt_features = array(
        'title',
        'revisions'
    );
    // Slug for archive page
    $cpt_slug = 'designs';
    $labels = array(
        'name'                      =>  __('Wheels', 'rg-wp-wheels'),
        'singular_name'             =>  __('Wheel', 'rg-wp-wheels'),
        'menu_name'                 =>  __('Wheels', 'rg-wp-wheels'),
        'name_admin_bar'            =>  __('Wheel', 'rg-wp-wheels'),
        'all_items'                 =>  __('Designs', 'rg-wp-wheels'), // Archive Page Name
        'add_name'                  =>  __('Add new wheel', 'rg-wp-wheels'),
        'add_new_item'              =>  __('Add new wheel', 'rg-wp-wheels'),
        'edit'                      =>  __('Edit wheel', 'rg-wp-wheels'),
        'edit_item'                 =>  __('Edit wheel', 'rg-wp-wheels'),
        'new_item'                  =>  __('New wheel', 'rg-wp-wheels'),
        'view'                      =>  __('View', 'rg-wp-wheels'),
        'view_item'                 =>  __('View', 'rg-wp-wheels'),
        'search_items'              =>  __('Search ', 'rg-wp-wheels'),
        'parent'                    =>  __('Parent', 'rg-wp-wheels'),
        'not_found'                 =>  __('No wheels found', 'rg-wp-wheels'),
        'not_found_in_trash'        =>  __('No wheels found in Trash', 'rg-wp-wheels')
    );
    $args = array(
        'labels'                =>  $labels,
        'public'                =>  true,
        'publicly_queryable'    =>  true,
        'exclude_from_search'   =>  false,
        'show_in_nav_menus'     =>  true,
        'show_ui'               =>  true,
        'show_in_menu'          =>  true,
        'show_in_admin_bar'     =>  true,
        'menu_position'         =>  21,
        'menu_icon'             =>  'dashicons-marker',
        'can_export'            =>  true,
        'delete_with_user'      =>  false,
        'hierarchical'          =>  false,
        'has_archive'           =>  true,
        'query_var'             =>  true,
        'capability_type'       =>  'post',
        'map_meta_cap'          =>  true,
        // 'capabilities'       => array(),
        'rewrite'               =>  array(
            'slug'      => $cpt_slug,
            'with_front'=> true,
            'pages'     => true,
            'feeds'     => false
        ),
        'supports'      => $cpt_features
    );
    register_post_type($cpt_name, $args);
}
add_action('init', 'rg_wp_wheels_register_cpt');

Template Logic for the wheels plugin

function rg_wp_wheels_template_logic($original_template) {
    $post_type = get_post_type();

    if(is_archive() || is_search() && $post_type == 'wheels') {

        if(file_exists(get_template_directory_uri() . '/archive-wheels.php')) {
            return get_template_directory_uri() . '/archive-wheels.php';
        } else {
            return plugin_dir_path(__FILE__) . 'templates/archive-wheels.php';
        }

    } elseif(is_single() && $post_type == 'wheels') {

        if(file_exists(get_template_directory_uri() . '/single-wheels.php')) {
            return get_template_directory_uri() . '/single-wheels.php';
        } else {
            return plugin_dir_path(__FILE__) . 'templates/single-wheels.php';
        }

    }

    return $original_template;
}
add_action('template_include', 'rg_wp_wheels_template_logic');

Register Custom Post Type tires:

function rg_wp_tires_register_cpt(){

    // Custom Post Type Name
    $cpt_name = 'tires';
    // CPT Features
    $cpt_features = array(
        'title',
        'revisions'
    );
    // Slug
    $cpt_slug_tires = 'profiles';
    $labels = array(
        'name'                      =>  __('Tires', 'rg-wp-tires'),
        'singular_name'             =>  __('Tire', 'rg-wp-tires'),
        'menu_name'                 =>  __('Tires', 'rg-wp-tires'),
        'name_admin_bar'            =>  __('Tires', 'rg-wp-tires'),
        'all_items'                 =>  __('Profiles', 'rg-wp-tires'), // Archive Page Name
        'add_name'                  =>  __('Add new tire', 'rg-wp-tires'),
        'add_new_item'              =>  __('Add new tire', 'rg-wp-tires'),
        'edit'                      =>  __('Edit tire', 'rg-wp-tires'),
        'edit_item'                 =>  __('Edit tire', 'rg-wp-tires'),
        'new_item'                  =>  __('New tire', 'rg-wp-tires'),
        'view'                      =>  __('View', 'rg-wp-tires'),
        'view_item'                 =>  __('View', 'rg-wp-tires'),
        'search_items'              =>  __('Search ', 'rg-wp-tires'),
        'parent'                    =>  __('Parent', 'rg-wp-tires'),
        'not_found'                 =>  __('No tires found', 'rg-wp-tires'),
        'not_found_in_trash'        =>  __('No tires found in Trash', 'rg-wp-tires')
    );

    $args = array(
        'labels'                =>  $labels,
        'public'                =>  true,
        'publicly_queryable'    =>  true,
        'exclude_from_search'   =>  false,
        'show_in_nav_menus'     =>  true,
        'show_ui'               =>  true,
        'show_in_menu'          =>  true,
        'show_in_admin_bar'     =>  true,
        'menu_position'         =>  22,
        'menu_icon'             =>  'dashicons-marker',
        'can_export'            =>  true,
        'delete_with_user'      =>  false,
        'hierarchical'          =>  false,
        'has_archive'           =>  true,
        'query_var'             =>  true,
        'capability_type'       =>  'post',
        'map_meta_cap'          =>  true,
        // 'capabilities'       => array(),
        'rewrite'               =>  array(
            'slug'      => $cpt_slug_tires,
            'with_front'=> true,
            'pages'     => true,
            'feeds'     => false
        ),
        'supports'      => $cpt_features
    );
    register_post_type($cpt_name, $args);
}
add_action('init', 'rg_wp_tires_register_cpt');

Template logic for the tires plugin:

function rg_wp_tires_template_logic($original_template) {
    $post_type = get_post_type();

    if(is_archive() || is_search() && $post_type == 'tires') {

        if(file_exists(get_template_directory_uri() . '/archive-tires.php')) {
            return get_template_directory_uri() . '/archive-tires.php';
        } else {
            return plugin_dir_path(__FILE__) . 'templates/archive-tires.php';
        }

    } elseif(is_single() && $post_type == 'tires') {

        if(file_exists(get_template_directory_uri() . '/single-tires.php')) {
            return get_template_directory_uri() . '/single-tires.php';
        } else {
            return plugin_dir_path(__FILE__) . 'templates/single-tires.php';
        }

    }

    return $original_template;
}
add_action('template_include', 'rg_wp_tires_template_logic');

When I deactivate the wheels plugin, the tire plugin template logic works perfectly fine. When both plugins are active, the archive-wheels.php ALWAYS overwrites the archive-tires.php. Why?

Please help me, I'm losing my mind on this.

1 Answer 1

0

A core contributor had mercy with me - and an answer:

$post_type = get_post_type('tires') is not the correct method to get the post type in a reliable way.

Instead, you need to use is_post_type_archive('tires')

The correct function looks like this:


// Template Logic
function rg_wp_tires_template_logic($original_template) {

    if(is_post_type_archive('tires') || (is_search() && $_GET['post_type'] === 'tires')) {

        if(file_exists(get_template_directory_uri() . '/archive-tires.php')) {
            return get_template_directory_uri() . '/archive-tires.php';
        } else {
            return plugin_dir_path(__FILE__) . 'templates/archive-tires.php';
        }

    } elseif(is_singular('tires')) {

        if(file_exists(get_template_directory_uri() . '/single-tires.php')) {
            return get_template_directory_uri() . '/single-tires.php';
        } else {
            return plugin_dir_path(__FILE__) . 'templates/single-tires.php';
        }

    }

    return $original_template;
}
add_action('template_include', 'rg_wp_tires_template_logic');

I really hope this helps someone in the future.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.