Best Way to Create a List of Musician Gigs in WordPress

I am currently designing a musician’s wordpress theme, and am looking to create a user-controlled dynamic gig list. I’ve done this before using PHP, but am wondering what the best way to do it in WordPress would be.

I’ve tested a method using custom post types, but I feel like some users would be confused about creating “post” for a an event, and then having to write the date in a custom field at the bottom.

Read More

How can I get my theme to create it’s own table in the wp database? Can I avoid that and make my own “insert gig” interface that creates a custom post type, but with an easier to understand “date, venue, about” way of inputting the info?

Related posts

Leave a Reply

3 comments

  1. Create a Custom Post Type named “Gig” and WordPress will take care of the UI creation, then all that is left for you is to add a Metabox with the fields you want (date, venue, about).

    Here is a simple step by step guide:

    First: Register Your Gig Post Type

    //register your custom post type gig
    add_action( 'init', 'register_cpt_gig' );
    function register_cpt_gig() {
        $labels = array( 
            'name'          => _x( 'gigs', 'gig' ),
            'singular_name' => _x( 'gig', 'gig' ),
            'add_new'       => _x( 'Add New', 'gig' ),
            'add_new_item'  => _x( 'Add New gig', 'gig' ),
            'edit_item'     => _x( 'Edit gig', 'gig' ),
            'new_item'      => _x( 'New gig', 'gig' ),
            'view_item'     => _x( 'View gig', 'gig' ),
            'search_items'  => _x( 'Search gigs', 'gig' ),
            'not_found'     => _x( 'No gigs found', 'gig' ),
            'not_found_in_trash' => _x( 'No gigs found in Trash', 'gig' ),
            'parent_item_colon'  => _x( 'Parent gig:', 'gig' ),
            'menu_name'     => _x( 'Gigs', 'gig' ),
        );
    
        $args = array( 
            'labels'        => $labels,
            'hierarchical'  => false,
            'description'   => 'just a simple "where, when, with who" kind of thing',
            'supports'      => array( 'title', 'custom-fields' ),
            'public'        => true,
            'show_ui'       => true,
            'show_in_menu'  => true,
            'menu_icon'     => 'http://i.imgur.com/4nTMD.png',
            'show_in_nav_menus'     => true,
            'publicly_queryable'    => true,
            'exclude_from_search'   => false,
            'has_archive'   => true,
            'query_var'     => true,
            'can_export'    => true,
            'rewrite'       => true,
            'capability_type'=> 'post'
        );
    
        register_post_type( 'gig', $args );
    }
    

    This will give you a new Post Type and an admin UI for creating your gigs:

    Gig Post Type Admin Page

    Next you need to create a Metabox (to avoid using the regular custom fields)

    There are a million tutorials online on how to create and add your Metabox so I’m not going into that but I’ll show you a fast easy way to do it.
    Download this class and once you put this in your theme the creation of the Metabox should be something like this:

    if( is_admin() ) {
        //include the main class file
        require_once( "meta-box-class/my-meta-box-class.php" );
        $prefix = '_gigs';
    
        //configure your meta box
        $config = array(
            'id'        => 'gigs-info',
            'title'     => 'Gig Info',
            'pages'     => array('gig'),
            'context'   => 'normal', 
            'priority'  => 'high', 
            'fields'    => array(), 
            'local_images'   => false,
            'use_with_theme' => false //change path if used with theme set to true, false for a plugin or anything else for a custom path(default false).
        );
        $my_meta = new AT_Meta_Box( $config );
    
        //Add fields to your meta box
        $my_meta->addText( $prefix . 'where', array( 'name'=> 'Where is the Gig ' ) );
        $my_meta->addDate( $prefix . 'when', array( 'name'=> 'When is the Gig ' ) );
        $my_meta->addTime( $prefix . 'start_time', array( 'name'=> 'When Does it Start ' ) );
        $my_meta->addTime( $prefix . 'end_time', array( 'name'=> 'When Does it End ' ) );
        $my_meta->addText( $prefix . 'with_who', array( 'name'=> 'With Who is the Gig ' ) );
        $my_meta->addTextarea( $prefix . 'words', array( 'name'=> 'A few words on the gig ' ) );
        $my_meta->Finish();
    }
    

    You will end up with something looking similar to this:

    Add New Gig Admin Page

    Here’s another image to show the fancy timepicker:

    Gig Timepicker

    To read more on the field types you can use and add to your Metabox read this.

    That’s about it! Just to wrap up I’m posting this as a plugin to test but make sure you download the Metabox class first so it will work.

    <?php
    /*
    Plugin Name: wp-gigs
    Plugin URI: http://en.bainternet.info
    Description: create list of gigs.
    Version: 0.1
    Author: Bainternet
    Author URI: http://en.bainternet.info
    */
    
    //register your custom post type gig
    add_action( 'init', 'register_cpt_gig' );
    function register_cpt_gig() {
        $labels = array( 
            'name'          => _x( 'gigs', 'gig' ),
            'singular_name' => _x( 'gig', 'gig' ),
            'add_new'       => _x( 'Add New', 'gig' ),
            'add_new_item'  => _x( 'Add New gig', 'gig' ),
            'edit_item'     => _x( 'Edit gig', 'gig' ),
            'new_item'      => _x( 'New gig', 'gig' ),
            'view_item'     => _x( 'View gig', 'gig' ),
            'search_items'  => _x( 'Search gigs', 'gig' ),
            'not_found'     => _x( 'No gigs found', 'gig' ),
            'not_found_in_trash' => _x( 'No gigs found in Trash', 'gig' ),
            'parent_item_colon'  => _x( 'Parent gig:', 'gig' ),
            'menu_name'     => _x( 'Gigs', 'gig' ),
        );
    
        $args = array( 
            'labels'        => $labels,
            'hierarchical'  => false,
            'description'   => 'just a simple "where, when, with who" kind of thing',
            'supports'      => array( 'title', 'custom-fields' ),
            'public'        => true,
            'show_ui'       => true,
            'show_in_menu'  => true,
            'menu_icon'     => 'http://i.imgur.com/4nTMD.png',
            'show_in_nav_menus'     => true,
            'publicly_queryable'    => true,
            'exclude_from_search'   => false,
            'has_archive'   => true,
            'query_var'     => true,
            'can_export'    => true,
            'rewrite'       => true,
            'capability_type' => 'post'
        );
    
        register_post_type( 'gig', $args );
    }
    
    if( is_admin() ) {
        //include the main class file
        require_once( "meta-box-class/my-meta-box-class.php" );
        $prefix = '_gigs';
    
        //configure your meta box
        $config = array(
            'id'        => 'gigs-info',
            'title'     => 'Gig Info',
            'pages'     => array( 'gig' ),
            'context'   => 'normal', 
            'priority'  => 'high', 
            'fields'    => array(), 
            'local_images'  => false,
            'use_with_theme'=> false //change path if used with theme set to true, false for a plugin or anything else for a custom path(default false).
        );
        $my_meta = new AT_Meta_Box( $config );
    
        //Add fields to your meta box
        $my_meta->addText( $prefix . 'where', array( 'name'=> 'Where is the Gig ' ) );
        $my_meta->addDate( $prefix . 'when', array( 'name'=> 'When is the Gig ' ) );
        $my_meta->addTime( $prefix . 'start_time', array( 'name'=> 'When Does it Start ' ) );
        $my_meta->addTime( $prefix . 'end_time', array( 'name'=> 'When Does it End ' ) );
        $my_meta->addText( $prefix . 'with_who', array( 'name'=> 'With Who is the Gig ' ) );
        $my_meta->addTextarea( $prefix . 'words', array( 'name'=> 'A few words on the gig ' ) );
        $my_meta->Finish();
    }
    
  2. Might I suggest Event Organiser?

    Full disclosure: this is a plug-in I’ve developed

    It essentially does what you are attempting to achieve (creates a custom post type), allows date selection, venues and custom fields so it can be extended for your own particular use.

    As for incorporating it into your theme, there are four basic ‘example’ templates the plug-in comes with. Just copy these into your theme folder and you can edit them however you like, making use of the template functions that come with the plug-in to display event/venue details.