├── .gitattributes ├── .gitignore ├── README.md ├── archive.php ├── favicon.ico ├── favicon.png ├── footer.php ├── front-page.php ├── functions.breadcrumb.php ├── functions.force-login.php ├── functions.php ├── header.app-icons.php ├── header.php ├── index.php ├── library ├── admin.php ├── bones.php ├── cpt-project_update.php ├── css │ ├── editor-style.css │ ├── ie.css │ ├── login.css │ ├── style.css │ ├── style.css.map │ └── svg-icons │ │ ├── file-music.svg │ │ ├── file-pdf.svg │ │ ├── file-picture.svg │ │ ├── file-play.svg │ │ ├── file-video.svg │ │ └── file-zip.svg ├── images │ ├── custom-post-icon.png │ ├── favicon-16.png │ ├── login-logo.svg │ ├── nothing.gif │ └── nothumb.gif ├── js │ ├── libs │ │ └── modernizr.custom.min.js │ └── scripts.js ├── scss │ ├── admin.scss │ ├── breakpoints │ │ ├── _1030up.scss │ │ ├── _481up.scss │ │ ├── _768up.scss │ │ └── _base.scss │ ├── config.rb │ ├── editor-style.scss │ ├── login.scss │ ├── modules │ │ ├── _alerts.scss │ │ ├── _buttons.scss │ │ └── _forms.scss │ ├── partials │ │ ├── _functions.scss │ │ ├── _mixins.scss │ │ ├── _normalize.scss │ │ ├── _print.scss │ │ ├── _purecss.scss │ │ ├── _typography.scss │ │ ├── _variables.scss │ │ └── purecss │ │ │ ├── base │ │ │ └── base.scss │ │ │ ├── buttons │ │ │ ├── buttons-core.scss │ │ │ └── buttons.scss │ │ │ ├── forms │ │ │ ├── forms-r.scss │ │ │ └── forms.scss │ │ │ ├── grids │ │ │ ├── README.html │ │ │ ├── README.md │ │ │ └── grids-core.scss │ │ │ ├── menus │ │ │ └── css │ │ │ │ ├── menus-core.scss │ │ │ │ ├── menus-dropdown.scss │ │ │ │ ├── menus-horizontal.scss │ │ │ │ ├── menus-scrollable.scss │ │ │ │ └── menus-skin.scss │ │ │ └── tables │ │ │ └── tables.scss │ └── style.scss └── translation │ ├── README.md │ ├── da_DK.mo │ ├── da_DK.po │ ├── de_DE.mo │ ├── de_DE.po │ ├── default.mo │ ├── default.po │ ├── es_ES.mo │ ├── es_ES.po │ ├── fr_FR.mo │ ├── fr_FR.po │ ├── he_IL.mo │ ├── he_IL.po │ ├── hr.mo │ ├── hr.po │ ├── hu_HU.mo │ ├── hu_HU.po │ ├── it_IT.mo │ ├── it_IT.po │ ├── ja.mo │ ├── ja.po │ ├── lt_LT.mo │ ├── lt_LT.po │ ├── nb_NO.mo │ ├── nb_NO.po │ ├── nl_NL.mo │ ├── nl_NL.po │ ├── pl_PL.mo │ ├── pl_PL.po │ ├── pt_PT.mo │ ├── pt_PT.po │ ├── ro_RO.mo │ ├── ro_RO.po │ ├── ru_RU.mo │ ├── ru_RU.po │ ├── sv_SE.mo │ ├── sv_SE.po │ ├── zh_CN.mo │ └── zh_CN.po ├── screenshot.png ├── screenshots ├── homepage.png └── inside.png ├── search.php ├── searchform.php ├── sidebar-footer.php ├── single.php ├── style.css └── taxonomy-project.php /.gitattributes: -------------------------------------------------------------------------------- 1 | # Standards for multi-platform colaboration 2 | 3 | # Set default behaviour, in case users don't have core.autocrlf set. 4 | * text=auto 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # folders and files to be ignored by git 2 | 3 | ############ 4 | ## Bones 5 | ############ 6 | 7 | Bones.esproj/ 8 | 9 | ############ 10 | ## IDEs 11 | ############ 12 | 13 | *.pydevproject 14 | .project 15 | .metadata 16 | *.swp 17 | *~.nib 18 | local.properties 19 | .classpath 20 | .settings/ 21 | .loadpath 22 | .externalToolBuilders/ 23 | *.launch 24 | .cproject 25 | .buildpath 26 | nbproject/ 27 | 28 | ############ 29 | ## OSes 30 | ############ 31 | 32 | [Tt]humbs.db 33 | [Dd]esktop.ini 34 | *.DS_store 35 | .DS_store? 36 | 37 | ############ 38 | ## Misc 39 | ############ 40 | 41 | bin/ 42 | tmp/ 43 | *.tmp 44 | *.bak 45 | *.log 46 | *.[Cc]ache 47 | *.cpr 48 | *.orig 49 | *.php.in 50 | .idea/ 51 | temp/ 52 | ._* 53 | .Trashes 54 | 55 | .svn 56 | 57 | *.codekit 58 | *.scssc 59 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wp-projecthub 2 | A Wordpress Theme that makes it easy to create elegant projecthubs (as advised by Brad Frost) 3 | 4 | ## How-to ? 5 | This theme turns a wordpress install into a Projecthub: 6 | - "posts" become "project updates", and "categories" become "Projects". 7 | - frontpage shows list of Projects for logged in users. 8 | 9 | ## What does it look like? 10 | Clean, lightweight (no webfonts nor decoration) and elegant. 11 | 12 | ### Front page 13 | 14 | ![Front page](http://www.awesomescreenshot.com/upload/8784/8889/2ac896cc-1588-464d-5a6c-f21ee7764b1f.png) 15 | 16 | ### Inside a project 17 | 18 | ![Inside a project](http://www.awesomescreenshot.com/upload/8784/8889/3687e073-1448-4faf-5c24-f04d0f6c315b.png) 19 | 20 | ## what is missing? 21 | - if you want to restrict projects to specific users, you may need to use a plugin that does that. 22 | 23 | ## What is a Projecthub ? 24 | To quote Brad Frost:
It's a centralized index page containing a chronological list all your project’s key design and development materials.
25 | 26 | More info: http://24ways.org/2013/project-hubs/ 27 | 28 | ## Credits 29 | - WP Projecthub theme: [pixeline](https://pixeline.be) 30 | - Theme based on [WP Bones](http://themble.com/bones/) 31 | - Original Idea: [Brad Frost](http://24ways.org/2013/project-hubs/) 32 | - CSS framework: [purecss](purecss.io) 33 | -------------------------------------------------------------------------------- /archive.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
5 |

abstract

6 |
7 | 8 |
9 | '; 11 | single_cat_title(); 12 | echo ''; 13 | the_archive_description( '
', '
' ); 14 | ?> 15 |
16 | 17 |
18 | 19 |
20 |
21 |

timeline

22 |
23 |
24 | 25 |
    26 | 27 |
  1. 28 |

    29 |
    30 | %2$s '.__( 'by', 'bonestheme').' %3$s', get_the_time('Y-m-j'), get_the_time(get_option('date_format')), get_the_author_link( get_the_author_meta( 'ID' ) )); ?> 31 |
    32 |
    33 |
    'attachment', 36 | 'numberposts' => null, 37 | 'post_status' => null, 38 | 'post_parent' => $post->ID 39 | ); 40 | $attachments = get_posts($args); 41 | if ($attachments) {?> 42 |
      43 | 44 |
    1. ID, false); ?>
    2. 45 | 46 |
    47 | 48 |
    49 |
  2. 50 | 51 |
52 |
53 |
54 | 55 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pixeline/wp-projecthub/69e009a79607c9aaccd9e03b5cd22e14a5becf16/favicon.ico -------------------------------------------------------------------------------- /favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pixeline/wp-projecthub/69e009a79607c9aaccd9e03b5cd22e14a5becf16/favicon.png -------------------------------------------------------------------------------- /footer.php: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /front-page.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |
6 |

projects

7 |
8 |
9 |
    10 | '', 13 | 'orderby' => 'name', 14 | 'order' => 'ASC', 15 | 'style' => 'list', 16 | 'show_count' => 0, 17 | 'hide_empty' => 0, 18 | 'use_desc_for_title' => 1, 19 | 'title_li' => __( '' ), 20 | 'show_option_none' => __( '' ), 21 | 'number' => null, 22 | 'echo' => 1, 23 | 'depth' => 0, 24 | 'current_category' => 0, 25 | 'pad_counts' => 0, 26 | 'taxonomy' => 'category' 27 | ); 28 | wp_list_categories($args); 29 | ?> 30 |
31 |
32 |
33 | -------------------------------------------------------------------------------- /functions.breadcrumb.php: -------------------------------------------------------------------------------- 1 | '; // tag before delimiter 22 | $delim_after = ''; // tag after delimiter 23 | $show_home_link = 1; // 1 - show the 'Home' link, 0 - don't show 24 | $show_on_home = 1; // 1 - show breadcrumbs on the homepage, 0 - don't show 25 | $show_current = 1; // 1 - show current page title, 0 - don't show 26 | $show_title = 1; // 1 - show the title for the links, 0 - don't show 27 | $before = ''; // tag before the current crumb 28 | $after = ''; // tag after the current crumb 29 | /* === END OF OPTIONS === */ 30 | 31 | global $post; 32 | $home_link = home_url('/'); 33 | $link_before = ''; 34 | $link_after = ''; 35 | $link_attr = ' itemprop="url"'; 36 | $link_in_before = ''; 37 | $link_in_after = ''; 38 | $link = $link_before . '' . $link_in_before . '%2$s' . $link_in_after . '' . $link_after; 39 | $frontpage_id = get_option('page_on_front'); 40 | $parent_id = $post->post_parent; 41 | $delimiter = ' ' . $delim_before . $delimiter . $delim_after . ' '; 42 | 43 | if (is_home() || is_front_page()) { 44 | 45 | if ($show_on_home == 1) echo ''; 46 | 47 | } else { 48 | 49 | echo ''; 172 | 173 | } 174 | } // end dimox_breadcrumbs() 175 | 176 | ?> -------------------------------------------------------------------------------- /functions.force-login.php: -------------------------------------------------------------------------------- 1 | 91 | for the 600 x 150 image: 92 | 93 | 94 | You can change the names and dimensions to whatever 95 | you like. Enjoy! 96 | */ 97 | 98 | add_filter( 'image_size_names_choose', 'bones_custom_image_sizes' ); 99 | 100 | function bones_custom_image_sizes( $sizes ) { 101 | return array_merge( $sizes, array( 102 | 'projecthub-600' => __('600px by 200px'), 103 | ) ); 104 | } 105 | 106 | /* 107 | The function above adds the ability to use the dropdown menu to select 108 | the new images sizes you have just created from within the media manager 109 | when you add media to your content blocks. If you add more image sizes, 110 | duplicate one of the lines in the array and name it according to your 111 | new image size. 112 | */ 113 | 114 | /************* THEME CUSTOMIZE *********************/ 115 | 116 | /* 117 | A good tutorial for creating your own Sections, Controls and Settings: 118 | http://code.tutsplus.com/series/a-guide-to-the-wordpress-theme-customizer--wp-33722 119 | 120 | Good articles on modifying the default options: 121 | http://natko.com/changing-default-wordpress-theme-customization-api-sections/ 122 | http://code.tutsplus.com/tutorials/digging-into-the-theme-customizer-components--wp-27162 123 | 124 | To do: 125 | - Create a js for the postmessage transport method 126 | - Create some sanitize functions to sanitize inputs 127 | - Create some boilerplate Sections, Controls and Settings 128 | */ 129 | 130 | function bones_theme_customizer($wp_customize) { 131 | // $wp_customize calls go here. 132 | // 133 | // Uncomment the below lines to remove the default customize sections 134 | 135 | $wp_customize->remove_section('title_tagline'); 136 | $wp_customize->remove_section('colors'); 137 | $wp_customize->remove_section('background_image'); 138 | $wp_customize->remove_section('static_front_page'); 139 | $wp_customize->remove_section('nav'); 140 | 141 | // Uncomment the below lines to remove the default controls 142 | // $wp_customize->remove_control('blogdescription'); 143 | 144 | // Uncomment the following to change the default section titles 145 | // $wp_customize->get_section('colors')->title = __( 'Theme Colors' ); 146 | // $wp_customize->get_section('background_image')->title = __( 'Images' ); 147 | } 148 | 149 | add_action( 'customize_register', 'bones_theme_customizer' ); 150 | 151 | /************* ACTIVE SIDEBARS ********************/ 152 | 153 | // Sidebars & Widgetizes Areas 154 | function bones_register_sidebars() { 155 | register_sidebar(array( 156 | 'id' => 'footer', 157 | 'name' => __( 'Footer Sidebar', 'bonestheme' ), 158 | 'description' => __( 'Sidebar Footer.', 'bonestheme' ), 159 | 'before_widget' => '
', 160 | 'after_widget' => '
', 161 | 'before_title' => '

', 162 | 'after_title' => '

', 163 | )); 164 | /* 165 | To call the sidebar in your template, you can just copy 166 | the sidebar.php file and rename it to your sidebar's name. 167 | So using the above example, it would be: 168 | sidebar-sidebar2.php 169 | 170 | */ 171 | } // don't remove this bracket! 172 | 173 | 174 | /************* COMMENT LAYOUT *********************/ 175 | 176 | // Comment Layout 177 | function bones_comments( $comment, $args, $depth ) { 178 | $GLOBALS['comment'] = $comment; ?> 179 |
> 180 |
181 |
182 | ' ); 186 | */ 187 | ?> 188 | 189 | 193 | 194 | 195 | %1$s %2$s', 'bonestheme' ), get_comment_author_link(), edit_comment_link(__( '(Edit)', 'bonestheme' ),' ','') ) ?> 196 | 197 | 198 |
199 | comment_approved == '0') : ?> 200 |
201 |

202 |
203 | 204 |
205 | 206 |
207 | $depth, 'max_depth' => $args['max_depth']))) ?> 208 |
209 | is added by WordPress automatically ?> 210 | -------------------------------------------------------------------------------- /header.app-icons.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /header.php: -------------------------------------------------------------------------------- 1 | 2 | class="no-js"> 3 | 4 | 5 | 6 | 7 | 8 | <?php wp_title(''); ?> 9 | 10 | 11 | 12 | 13 | 14 | 15 | > 16 | 17 |
18 |
19 |

20 | 21 |

22 |
23 |
24 | 27 |
28 |
29 |

30 | Log out 31 |

32 |
33 |
-------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
5 |

abstract

6 |
7 | 8 |
9 | 10 | 11 |
role="article"> 12 | 13 |
14 | 15 |

16 | 24 | 25 |
26 | 27 |
28 | 29 |
30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
39 |

40 |
41 |

42 |
43 | 44 |
45 | 46 | 47 | 48 |
49 |
50 | 51 | 52 | -------------------------------------------------------------------------------- /library/admin.php: -------------------------------------------------------------------------------- 1 | get_item_quantity(7); // specify number of items 75 | $items = $feed->get_items(0, $limit); // create an array of items 76 | } 77 | } 78 | if ($limit == 0) echo '
The RSS Feed is either empty or unavailable.
'; // fallback message 79 | else foreach ($items as $item) { ?> 80 | 81 |

82 | 83 | get_title(); ?> 84 | 85 |

86 |

87 | get_description(), 0, 200); ?> 88 |

89 | Developed by Your Site Name. Built using Bones.', 'bonestheme' ); 142 | } 143 | 144 | // adding it to the admin area 145 | add_filter( 'admin_footer_text', 'bones_custom_admin_footer' ); 146 | 147 | ?> 148 | -------------------------------------------------------------------------------- /library/bones.php: -------------------------------------------------------------------------------- 1 | from around images 18 | - customizing the post excerpt 19 | 20 | */ 21 | 22 | /********************* 23 | WP_HEAD GOODNESS 24 | The default wordpress head is 25 | a mess. Let's clean it up by 26 | removing all the junk we don't 27 | need. 28 | *********************/ 29 | 30 | function bones_head_cleanup() { 31 | // category feeds 32 | // remove_action( 'wp_head', 'feed_links_extra', 3 ); 33 | // post and comment feeds 34 | // remove_action( 'wp_head', 'feed_links', 2 ); 35 | // EditURI link 36 | remove_action( 'wp_head', 'rsd_link' ); 37 | // windows live writer 38 | remove_action( 'wp_head', 'wlwmanifest_link' ); 39 | // previous link 40 | remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 ); 41 | // start link 42 | remove_action( 'wp_head', 'start_post_rel_link', 10, 0 ); 43 | // links for adjacent posts 44 | remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 ); 45 | // WP version 46 | remove_action( 'wp_head', 'wp_generator' ); 47 | // remove WP version from css 48 | add_filter( 'style_loader_src', 'bones_remove_wp_ver_css_js', 9999 ); 49 | // remove Wp version from scripts 50 | add_filter( 'script_loader_src', 'bones_remove_wp_ver_css_js', 9999 ); 51 | 52 | } /* end bones head cleanup */ 53 | 54 | // A better title 55 | // http://www.deluxeblogtips.com/2012/03/better-title-meta-tag.html 56 | function rw_title( $title, $sep, $seplocation ) { 57 | global $page, $paged; 58 | 59 | // Don't affect in feeds. 60 | if ( is_feed() ) return $title; 61 | 62 | // Add the blog's name 63 | if ( 'right' == $seplocation ) { 64 | $title .= get_bloginfo( 'name' ); 65 | } else { 66 | $title = get_bloginfo( 'name' ) . $title; 67 | } 68 | 69 | // Add the blog description for the home/front page. 70 | $site_description = get_bloginfo( 'description', 'display' ); 71 | 72 | if ( $site_description && ( is_home() || is_front_page() ) ) { 73 | $title .= " {$sep} {$site_description}"; 74 | } 75 | 76 | // Add a page number if necessary: 77 | if ( $paged >= 2 || $page >= 2 ) { 78 | $title .= " {$sep} " . sprintf( __( 'Page %s', 'dbt' ), max( $paged, $page ) ); 79 | } 80 | 81 | return $title; 82 | 83 | } // end better title 84 | 85 | // remove WP version from RSS 86 | function bones_rss_version() { return ''; } 87 | 88 | // remove WP version from scripts 89 | function bones_remove_wp_ver_css_js( $src ) { 90 | if ( strpos( $src, 'ver=' ) ) 91 | $src = remove_query_arg( 'ver', $src ); 92 | return $src; 93 | } 94 | 95 | // remove injected CSS for recent comments widget 96 | function bones_remove_wp_widget_recent_comments_style() { 97 | if ( has_filter( 'wp_head', 'wp_widget_recent_comments_style' ) ) { 98 | remove_filter( 'wp_head', 'wp_widget_recent_comments_style' ); 99 | } 100 | } 101 | 102 | // remove injected CSS from recent comments widget 103 | function bones_remove_recent_comments_style() { 104 | global $wp_widget_factory; 105 | if (isset($wp_widget_factory->widgets['WP_Widget_Recent_Comments'])) { 106 | remove_action( 'wp_head', array($wp_widget_factory->widgets['WP_Widget_Recent_Comments'], 'recent_comments_style') ); 107 | } 108 | } 109 | 110 | // remove injected CSS from gallery 111 | function bones_gallery_style($css) { 112 | return preg_replace( "!!s", '', $css ); 113 | } 114 | 115 | 116 | /********************* 117 | SCRIPTS & ENQUEUEING 118 | *********************/ 119 | 120 | // loading modernizr and jquery, and reply script 121 | function bones_scripts_and_styles() { 122 | 123 | global $wp_styles; // call global $wp_styles variable to add conditional wrapper around ie stylesheet the WordPress way 124 | 125 | if (!is_admin()) { 126 | 127 | // register main stylesheet 128 | wp_register_style( 'bones-stylesheet', get_stylesheet_directory_uri() . '/library/css/style.css', array(), '', 'all' ); 129 | 130 | // comment reply script for threaded comments 131 | if ( is_singular() AND comments_open() AND (get_option('thread_comments') == 1)) { 132 | wp_enqueue_script( 'comment-reply' ); 133 | } 134 | 135 | //adding scripts file in the footer 136 | wp_register_script( 'bones-js', get_stylesheet_directory_uri() . '/library/js/scripts.js', array( 'jquery' ), '', true ); 137 | 138 | // enqueue styles and scripts 139 | wp_enqueue_style( 'bones-stylesheet' ); 140 | 141 | /* 142 | I recommend using a plugin to call jQuery 143 | using the google cdn. That way it stays cached 144 | and your site will load faster. 145 | */ 146 | wp_enqueue_script( 'jquery' ); 147 | wp_enqueue_script( 'bones-js' ); 148 | 149 | } 150 | } 151 | 152 | /********************* 153 | THEME SUPPORT 154 | *********************/ 155 | 156 | // Adding WP 3+ Functions & Theme Support 157 | function bones_theme_support() { 158 | 159 | // wp thumbnails (sizes handled in functions.php) 160 | add_theme_support( 'post-thumbnails' ); 161 | 162 | // default thumb size 163 | set_post_thumbnail_size(125, 125, true); 164 | 165 | // wp custom background (thx to @bransonwerner for update) 166 | add_theme_support( 'custom-background', 167 | array( 168 | 'default-image' => '', // background image default 169 | 'default-color' => '', // background color default (dont add the #) 170 | 'wp-head-callback' => '_custom_background_cb', 171 | 'admin-head-callback' => '', 172 | 'admin-preview-callback' => '' 173 | ) 174 | ); 175 | 176 | // rss thingy 177 | add_theme_support('automatic-feed-links'); 178 | 179 | // wp menus 180 | add_theme_support( 'menus' ); 181 | 182 | // registering wp3+ menus 183 | register_nav_menus( 184 | array( 185 | 'main-nav' => __( 'The Main Menu', 'bonestheme' ), // main nav in header 186 | 'footer-links' => __( 'Footer Links', 'bonestheme' ) // secondary nav in footer 187 | ) 188 | ); 189 | 190 | // Enable support for HTML5 markup. 191 | add_theme_support( 'html5', array( 192 | 'comment-list', 193 | 'search-form', 194 | 'comment-form' 195 | ) ); 196 | 197 | } /* end bones theme support */ 198 | 199 | 200 | /********************* 201 | RELATED POSTS FUNCTION 202 | *********************/ 203 | 204 | // Related Posts Function (call using bones_related_posts(); ) 205 | function bones_related_posts() { 206 | echo '