Wordpress

WordPress vlastní typy obsahu

Dnešní WordPress toho zvládne velice moc. A to také díky možnosti rozšíření o „Vlastní typy obsahu“, což většinou není nic jiného než klasické příspěvky s jinou hodnotou u post_type v databázi.

Vlastní typy lze vytvářet buď pomocí pluginů nebo pomocí rozšíření kódu ve functions.php.

Tak na příklad na tomto WEBu s rozšířením ve Functions funguje blok Portfolio.

Vlastní typy obsahu – portfolio
//tento kód stačí vložit do functions.php
  
if ( function_exists( 'add_theme_support' ) ) { 
    add_theme_support( 'post-thumbnails' );
    set_post_thumbnail_size( 280, 210, true ); // Normal post thumbnails
    add_image_size( 'screen-shot', 720, 540 ); // Full size screen
}

add_action('init', 'portfolio_register');  
   
function portfolio_register() {  
    $args = array(  
        'label' => __('Portfolio'),  
        'singular_label' => __('Project'),  
        'public' => true,  
        'show_ui' => true,  
        'capability_type' => 'post',  
        'hierarchical' => false,  
        'rewrite' => true,  
        'supports' => array('title', 'editor', 'thumbnail')  
       );  
   
    register_post_type( 'portfolio' , $args );  
}

register_taxonomy("project-type", array("portfolio"), array("hierarchical" => true, "label" => "Portfolio rubriky", "singular_label" => "Portfolio rubriky", "rewrite" => true));

add_action("admin_init", "portfolio_meta_box");   
 
 
function portfolio_meta_box(){  
    add_meta_box("projInfo-meta", "Project Options", "portfolio_meta_options", "portfolio", "side", "low");  
}  
   
 
function portfolio_meta_options(){  
        global $post;  
        if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
        $custom = get_post_custom($post->ID);  
        $link = $custom["projLink"][0];  
?>  
    <label>Link: </label><input name="projLink" value="<?php echo $link; ?>" />  
<?php 
    }
    
add_action('save_post', 'save_project_link'); 
   
function save_project_link(){  
    global $post;  
     
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ){ 
        return $post_id;
    }else{
        update_post_meta($post->ID, "projLink", $_POST["projLink"]); 
    } 
}

add_filter("manage_edit-portfolio_columns", "project_edit_columns");   
   
function project_edit_columns($columns){  
        $columns = array(  
            "cb" => "<input type=\"checkbox\" />",  
            "title" => "Project",  
            "description" => "Description",  
            "link" => "Link",  
            "type" => "Type of Project",  
        );  
   
        return $columns;  
}  
 
add_action("manage_posts_custom_column",  "project_custom_columns"); 
   
function project_custom_columns($column){  
        global $post;  
        switch ($column)  
        {  
            case "description":  
                the_excerpt();  
                break;  
            case "link":  
                $custom = get_post_custom();  
                echo $custom["projLink"][0];  
                break;  
            case "type":  
                echo get_the_term_list($post->ID, 'project-type', '', ', ','');  
                break;  
        }  
}

add_filter('excerpt_length', 'my_excerpt_length');
 
function my_excerpt_length($length) {
 
    return 25; 
 
}
 
add_filter('excerpt_more', 'new_excerpt_more');  
 
function new_excerpt_more($text){  
 
    return ' ';  
 
}  
 
function portfolio_thumbnail_url($pid){
    $image_id = get_post_thumbnail_id($pid);  
    $image_url = wp_get_attachment_image_src($image_id,'screen-shot');  
    return  $image_url[0];  
}

Časem jsem si ale všimnul jiného problému, chybného nastavení „current_page_parent menu-item-nn“ v navigaci. V portfolio přehledu to bylo OK, při detailním zobrazení položky portfolia byla v menu chybně prosvícena položka Blog (V mém případě Magazín).
Proto bylo nutné dodat další následující kód do Functions.php.

Vlastní typy obsahu – portfolio úprava navigace
//tento kód stačí vložit do functions.php
add_filter( 'nav_menu_css_class', 'je_portfolio_menu_item_classes', 10, 2 );
/**
 * Add css classes to Portfolio CPT menu item, remove from Blog item
 **/function je_portfolio_menu_item_classes( $classes, $item )
{
  switch ( get_query_var('post_type') ) {
    // Only run on portfolio post type
    case 'portfolio':
      // Remove current_page_parent from Blog menu item
      if( $item->title == 'Magazín' ) {
        $classes = array_diff( $classes, array( 'current_page_parent' ) );
      }
      // Add current_page_parent class to the portfolio menu item
      if ( $item->title == 'Portfolio' ) {
        $classes[] = 'current_page_parent';
      }
    break;
  }
  return $classes;
}

Více třeba zde

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *