wordpress-starter 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. data/CHANGELOG.md +1 -0
  2. data/LICENSE +20 -0
  3. data/README.md +34 -0
  4. data/lib/wordpress-starter.rb +29 -0
  5. data/stylesheets/_wordpress.scss +9 -0
  6. data/stylesheets/wordpress/_base.scss +74 -0
  7. data/stylesheets/wordpress/_defaults.scss +28 -0
  8. data/stylesheets/wordpress/_layout.scss +56 -0
  9. data/stylesheets/wordpress/_mixins.scss +57 -0
  10. data/stylesheets/wordpress/_page.scss +364 -0
  11. data/stylesheets/wordpress/_responsive.scss +231 -0
  12. data/stylesheets/wordpress/_theme.scss +83 -0
  13. data/stylesheets/wordpress/_typography.scss +135 -0
  14. data/stylesheets/wordpress/_utils.scss +64 -0
  15. data/templates/project/ie.scss +1 -0
  16. data/templates/project/manifest.rb +21 -0
  17. data/templates/project/print.css +4 -0
  18. data/templates/project/print.scss +104 -0
  19. data/templates/project/readme.txt +1 -0
  20. data/templates/project/screen.scss +1 -0
  21. data/templates/project/style.css +13 -0
  22. data/templates/starter/404.php +24 -0
  23. data/templates/starter/admin/README.txt +25 -0
  24. data/templates/starter/admin/assets/css/admin-style.css +838 -0
  25. data/templates/starter/admin/assets/css/colorpicker.css +177 -0
  26. data/templates/starter/admin/assets/images/1col.png +0 -0
  27. data/templates/starter/admin/assets/images/2-col-portfolio.png +0 -0
  28. data/templates/starter/admin/assets/images/2cl.png +0 -0
  29. data/templates/starter/admin/assets/images/2cr.png +0 -0
  30. data/templates/starter/admin/assets/images/3-col-portfolio.png +0 -0
  31. data/templates/starter/admin/assets/images/3cm.png +0 -0
  32. data/templates/starter/admin/assets/images/3cr.png +0 -0
  33. data/templates/starter/admin/assets/images/4-col-portfolio.png +0 -0
  34. data/templates/starter/admin/assets/images/accept.png +0 -0
  35. data/templates/starter/admin/assets/images/button_check.png +0 -0
  36. data/templates/starter/admin/assets/images/colorpicker/blank.gif +0 -0
  37. data/templates/starter/admin/assets/images/colorpicker/colorpicker_background.png +0 -0
  38. data/templates/starter/admin/assets/images/colorpicker/colorpicker_hex.png +0 -0
  39. data/templates/starter/admin/assets/images/colorpicker/colorpicker_hsb_b.png +0 -0
  40. data/templates/starter/admin/assets/images/colorpicker/colorpicker_hsb_h.png +0 -0
  41. data/templates/starter/admin/assets/images/colorpicker/colorpicker_hsb_s.png +0 -0
  42. data/templates/starter/admin/assets/images/colorpicker/colorpicker_indic.gif +0 -0
  43. data/templates/starter/admin/assets/images/colorpicker/colorpicker_overlay.png +0 -0
  44. data/templates/starter/admin/assets/images/colorpicker/colorpicker_rgb_b.png +0 -0
  45. data/templates/starter/admin/assets/images/colorpicker/colorpicker_rgb_g.png +0 -0
  46. data/templates/starter/admin/assets/images/colorpicker/colorpicker_rgb_r.png +0 -0
  47. data/templates/starter/admin/assets/images/colorpicker/colorpicker_select.gif +0 -0
  48. data/templates/starter/admin/assets/images/colorpicker/colorpicker_submit.png +0 -0
  49. data/templates/starter/admin/assets/images/colorpicker/select.png +0 -0
  50. data/templates/starter/admin/assets/images/dropdown-arrow.png +0 -0
  51. data/templates/starter/admin/assets/images/favicon.ico +0 -0
  52. data/templates/starter/admin/assets/images/icon-add.png +0 -0
  53. data/templates/starter/admin/assets/images/icon-backup.png +0 -0
  54. data/templates/starter/admin/assets/images/icon-delete.png +0 -0
  55. data/templates/starter/admin/assets/images/icon-docs.png +0 -0
  56. data/templates/starter/admin/assets/images/icon-edit.png +0 -0
  57. data/templates/starter/admin/assets/images/icon-home.png +0 -0
  58. data/templates/starter/admin/assets/images/icon-info.png +0 -0
  59. data/templates/starter/admin/assets/images/icon-notice.png +0 -0
  60. data/templates/starter/admin/assets/images/icon-paint.png +0 -0
  61. data/templates/starter/admin/assets/images/icon-settings.png +0 -0
  62. data/templates/starter/admin/assets/images/icon-slider.png +0 -0
  63. data/templates/starter/admin/assets/images/icon-warn.png +0 -0
  64. data/templates/starter/admin/assets/images/icon_option.png +0 -0
  65. data/templates/starter/admin/assets/images/loading-bottom.gif +0 -0
  66. data/templates/starter/admin/assets/images/select.png +0 -0
  67. data/templates/starter/admin/assets/images/sign_warning.png +0 -0
  68. data/templates/starter/admin/assets/images/stop.png +0 -0
  69. data/templates/starter/admin/assets/images/toggle_tabs.png +0 -0
  70. data/templates/starter/admin/assets/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  71. data/templates/starter/admin/assets/images/warning.png +0 -0
  72. data/templates/starter/admin/assets/images/wrench.png +0 -0
  73. data/templates/starter/admin/assets/images/wrench16.png +0 -0
  74. data/templates/starter/admin/assets/js/ajaxupload.js +606 -0
  75. data/templates/starter/admin/assets/js/colorpicker.js +455 -0
  76. data/templates/starter/admin/assets/js/cookie.js +1 -0
  77. data/templates/starter/admin/assets/js/jquery.maskedinput-1.2.2.js +252 -0
  78. data/templates/starter/admin/assets/js/jquery.tipsy.js +241 -0
  79. data/templates/starter/admin/assets/js/of-medialibrary-uploader.js +168 -0
  80. data/templates/starter/admin/assets/js/smof.js +623 -0
  81. data/templates/starter/admin/classes/class.options-machine.php +627 -0
  82. data/templates/starter/admin/front-end/options.php +77 -0
  83. data/templates/starter/admin/functions/functions.admin.php +76 -0
  84. data/templates/starter/admin/functions/functions.interface.php +232 -0
  85. data/templates/starter/admin/functions/functions.load.php +14 -0
  86. data/templates/starter/admin/functions/functions.mediauploader.php +194 -0
  87. data/templates/starter/admin/functions/functions.options.php +507 -0
  88. data/templates/starter/admin/functions/functions.php +0 -0
  89. data/templates/starter/admin/index.php +86 -0
  90. data/templates/starter/admin/layouts/default.css +0 -0
  91. data/templates/starter/admin/layouts/placebo.css +0 -0
  92. data/templates/starter/app.js +97 -0
  93. data/templates/starter/archive.php +57 -0
  94. data/templates/starter/category.php +40 -0
  95. data/templates/starter/comments.php +65 -0
  96. data/templates/starter/content-aside.php +26 -0
  97. data/templates/starter/content-image.php +29 -0
  98. data/templates/starter/content-link.php +27 -0
  99. data/templates/starter/content-none.php +21 -0
  100. data/templates/starter/content-page.php +24 -0
  101. data/templates/starter/content-quote.php +26 -0
  102. data/templates/starter/content-status.php +33 -0
  103. data/templates/starter/content.php +67 -0
  104. data/templates/starter/editor-style.scss +359 -0
  105. data/templates/starter/footer.php +29 -0
  106. data/templates/starter/functions.php +1211 -0
  107. data/templates/starter/header.php +63 -0
  108. data/templates/starter/ie.scss +1 -0
  109. data/templates/starter/images/bg/bg0.png +0 -0
  110. data/templates/starter/images/bg/bg1.png +0 -0
  111. data/templates/starter/images/bg/bg10.png +0 -0
  112. data/templates/starter/images/bg/bg11.png +0 -0
  113. data/templates/starter/images/bg/bg2.png +0 -0
  114. data/templates/starter/images/bg/bg3.png +0 -0
  115. data/templates/starter/images/bg/bg4.png +0 -0
  116. data/templates/starter/images/bg/bg5.png +0 -0
  117. data/templates/starter/images/bg/bg6.jpg +0 -0
  118. data/templates/starter/images/bg/bg7.jpg +0 -0
  119. data/templates/starter/images/bg/bg8.png +0 -0
  120. data/templates/starter/images/bg/bg9.png +0 -0
  121. data/templates/starter/index.php +19 -0
  122. data/templates/starter/loop.php +30 -0
  123. data/templates/starter/manifest.rb +149 -0
  124. data/templates/starter/moderninzr.min.js +4 -0
  125. data/templates/starter/options.php +407 -0
  126. data/templates/starter/page.php +29 -0
  127. data/templates/starter/print.scss +104 -0
  128. data/templates/starter/readme.txt +1 -0
  129. data/templates/starter/screen.scss +1 -0
  130. data/templates/starter/search.php +31 -0
  131. data/templates/starter/search.png +0 -0
  132. data/templates/starter/searchform.php +14 -0
  133. data/templates/starter/sidebar.php +15 -0
  134. data/templates/starter/single.php +31 -0
  135. data/templates/starter/style.css +13 -0
  136. data/templates/starter/tag.php +41 -0
  137. metadata +230 -0
@@ -0,0 +1,29 @@
1
+ <?php
2
+ /**
3
+ * The default template for displaying footer
4
+ *
5
+ * @category Theme
6
+ * @package [starter]
7
+ * @author [Your Name]
8
+ * @copyright 2012 [Your Name]
9
+ */
10
+ ?>
11
+ </div>
12
+ <?php get_sidebar(); ?>
13
+ </section>
14
+ </div>
15
+ <footer class="footer" role="contentinfo">
16
+ <?php do_action( 'starter_footer' ); ?>
17
+ <a href="<?php echo esc_url( __( 'http://wordpress.org/', 'starter' ) ); ?>" title="<?php esc_attr_e( 'Semantic Personal Publishing Platform', 'starter' ); ?>"><?php printf( __( 'Proudly powered by %s', 'starter' ), 'WordPress' ); ?></a>
18
+ </footer>
19
+ </div>
20
+ <?php
21
+ /* Always have wp_footer() just before the closing </body>
22
+ * tag of your theme, or you will break many plugins, which
23
+ * generally use this hook to reference JavaScript files.
24
+ */
25
+
26
+ wp_footer();
27
+ ?>
28
+ </body>
29
+ </html>
@@ -0,0 +1,1211 @@
1
+ <?php
2
+ /**
3
+ * [starter] theme functions and definitions
4
+ *
5
+ * For more information on hooks, actions, and filters, see http://codex.wordpress.org/Plugin_API.
6
+ *
7
+ * @category Theme
8
+ * @package [starter]
9
+ * @author [Your Name]
10
+ * @copyright 2012 [Your Name]
11
+ */
12
+
13
+ global $of_options, $data;
14
+
15
+ /**
16
+ * Set the content width based on the theme's design and stylesheet.
17
+ *
18
+ * Used to set the width of images and content. Should be equal to the width the theme
19
+ * is designed for, generally via the style.css stylesheet.
20
+ */
21
+ if ( ! isset( $content_width ) )
22
+ $content_width = 540;
23
+
24
+ /**
25
+ * Sets up theme defaults and registers support for various WordPress features.
26
+ *
27
+ * Note that this function is hooked into the after_setup_theme hook, which runs
28
+ * before the init hook. The init hook is too late for some features, such as indicating
29
+ * support post thumbnails.
30
+ *
31
+ * To override starter_setup() in a child theme, add your own starter_setup to your child theme's
32
+ * functions.php file.
33
+ *
34
+ * @uses add_theme_support() To add support for post thumbnails, automatic feed links and Post Formats.
35
+ * @uses register_nav_menus() To add support for navigation menus.
36
+ * @uses add_custom_background() To add support for a custom background.
37
+ * @uses add_editor_style() To style the visual editor.
38
+ * @uses load_theme_textdomain() For translation/localization support.
39
+ * @uses set_post_thumbnail_size() To set a custom post thumbnail size.
40
+ *
41
+ * @since [starter] 1.0
42
+ */
43
+ function starter_setup() {
44
+ // SET THEME LANGUAGES DIRECTORY
45
+ // Theme translations can be filed in the my_theme/languages/ directory
46
+ load_theme_textdomain( 'starter', get_template_directory() . '/languages' );
47
+
48
+ // This theme styles the visual editor with editor-style.css to match the theme style.
49
+ add_editor_style( 'stylesheets/editor-style.css' );
50
+
51
+ // Adds support for rss links
52
+ add_theme_support( 'automatic-feed-links' );
53
+
54
+ // Add support for a variety of post formats (http://codex.wordpress.org/Post_Formats)
55
+ // Child Themes inherit the post formats defined by the parent theme
56
+ add_theme_support( 'post-formats', array( 'aside', 'gallery', 'link', 'image', 'quote', 'status', 'video', 'audio', 'chat' ) );
57
+
58
+ // Add post thumbnails (http://codex.wordpress.org/Post_Thumbnails)
59
+ add_theme_support( 'post-thumbnails' );
60
+ set_post_thumbnail_size( 670, 230, true ); // Default Thumbnail Image
61
+
62
+ // Register wp_nav_menu() menus (http://codex.wordpress.org/Function_Reference/register_nav_menus)
63
+ register_nav_menu( 'primary', __( 'Primary menu', 'starter' ) );
64
+
65
+ /*------------------------------------------*/
66
+ /* Options Framework
67
+ /*------------------------------------------*/
68
+ locate_template( 'options.php', true );
69
+ locate_template( 'admin/index.php', true );
70
+
71
+ do_action( 'starter_setup' );
72
+ }
73
+
74
+ add_action( 'after_setup_theme', 'starter_setup' );
75
+
76
+ /**
77
+ * Some cleanup
78
+ *
79
+ * @since [starter] 1.0
80
+ * @return void
81
+ */
82
+ function starter_init() {
83
+ // autolinks in comments
84
+ remove_filter( 'comment_text', 'make_clickable', 9 );
85
+
86
+ // Display the links to the general feeds: Post and Comment Feed
87
+ remove_action( 'wp_head', 'feed_links', 2 );
88
+
89
+ // Display the links to the extra feeds such as category feeds
90
+ remove_action( 'wp_head', 'feed_links_extra', 3 );
91
+
92
+ // Display the link to the Really Simple Discovery service endpoint, EditURI link
93
+ remove_action( 'wp_head', 'rsd_link' );
94
+
95
+ // Display the link to the Windows Live Writer manifest file.
96
+ remove_action( 'wp_head', 'wlwmanifest_link' );
97
+ remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
98
+
99
+ // index link
100
+ remove_action( 'wp_head', 'index_rel_link' );
101
+
102
+ // prev link
103
+ remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
104
+
105
+ // start link
106
+ remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
107
+
108
+ // Display relational links for the posts adjacent to the current post.
109
+ remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 );
110
+
111
+ // Display the XHTML generator that is generated on the wp_head hook, WP version
112
+ remove_action( 'wp_head', 'wp_generator' );
113
+ remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
114
+
115
+ // remove jetpack open graph tags
116
+ remove_action( 'wp_head', 'jetpack_og_tags' );
117
+
118
+ add_filter( 'use_default_gallery_style', '__return_null' );
119
+
120
+ /* Custom oEmbed Providers */
121
+
122
+ // Add Soundcloud oEmbed
123
+ wp_oembed_add_provider( '#http://(www\.)?soundcloud\.com/.*#i', 'http://soundcloud.com/oembed', true );
124
+
125
+ // Add Kickstarter oEmbed
126
+ wp_oembed_add_provider( '#http://(www\.)?kickstarter\.com/projects/.*#i', 'http://www.kickstarter.com/services/oembed', true );
127
+
128
+ // Add Instagram oEmbed
129
+ wp_oembed_add_provider( '#http://(www\.)?instagr(am)?\.(am|com)/.*#i', 'http://api.instagram.com/oembed', true );
130
+
131
+ // Add Slideshare oEmbed
132
+ wp_oembed_add_provider( '#http://(www\.)?slideshare\.net/.*#i', 'http://api.embed.ly/v1/api/oembed', true );
133
+ }
134
+
135
+ add_action( 'init', 'starter_init' );
136
+
137
+ /**
138
+ * Remove the WordPress version from RSS feeds
139
+ */
140
+ add_filter( 'the_generator', '__return_false' );
141
+
142
+ /**
143
+ * Adds custom scripts to theme header
144
+ *
145
+ * @since [starter] 1.0
146
+ * @return void
147
+ */
148
+ function starter_enqueue_scripts() {
149
+ $theme = wp_get_theme();
150
+ $version = $theme['Version'];
151
+
152
+ wp_deregister_script( 'jquery' );
153
+ wp_register_script( 'jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js', false, '1.8.3' );
154
+
155
+ /**
156
+ * We add some JavaScript to pages with the comment form
157
+ * to support sites with threaded comments (when in use).
158
+ */
159
+ if ( is_singular() and comments_open() and get_option( 'thread_comments' ) ) {
160
+ wp_enqueue_script( 'comment-reply' );
161
+ }
162
+
163
+ wp_enqueue_script( 'modernizr', get_template_directory_uri() . '/javascripts/modernizr.min.js', false, '2.6.2' );
164
+ wp_enqueue_script( 'app', get_template_directory_uri() . '/javascripts/app.js', array( 'jquery' ), $version, true );
165
+ }
166
+
167
+ add_action( 'wp_enqueue_scripts', 'starter_enqueue_scripts' );
168
+
169
+ /**
170
+ * Adds custom styles to theme header
171
+ *
172
+ * @since [starter] 1.0
173
+ * @return void
174
+ */
175
+ function starter_enqueue_styles() {
176
+ $theme = wp_get_theme();
177
+ $version = $theme['Version'];
178
+
179
+ wp_enqueue_style( 'app', get_stylesheet_uri(), false, $version, 'all' );
180
+ }
181
+
182
+ add_action( 'wp_enqueue_scripts', 'starter_enqueue_styles' );
183
+
184
+ /**
185
+ * Makes some changes to the <title> tag, by filtering the output of wp_title().
186
+ *
187
+ * If we have a site description and we're viewing the home page or a blog posts
188
+ * page (when using a static front page), then we will add the site description.
189
+ *
190
+ * If we're viewing a search result, then we're going to recreate the title entirely.
191
+ * We're going to add page numbers to all titles as well, to the middle of a search
192
+ * result title and the end of all other titles.
193
+ *
194
+ * The site title also gets added to all titles.
195
+ *
196
+ * @since [starter] 1.0
197
+ *
198
+ * @param string $title Title generated by wp_title()
199
+ * @param string $separator The separator passed to wp_title(). Base theme uses a vertical bar, "|", as a separator in header.php.
200
+ * @return string The new title, ready for the <title> tag.
201
+ */
202
+ function starter_filter_wp_title( $title, $separator ) {
203
+ // Don't affect wp_title() calls in feeds.
204
+ if ( is_feed() or function_exists( 'get_wpseo_options' ) )
205
+ return $title;
206
+
207
+ // The $paged global variable contains the page number of a listing of posts.
208
+ // The $page global variable contains the page number of a single post that is paged.
209
+ // We'll display whichever one applies, if we're not looking at the first page.
210
+ global $paged, $page, $post;
211
+
212
+ if ( is_search() ) {
213
+ // If we're a search, let's start over:
214
+ $title = sprintf( __( 'Search results for %s', 'starter' ), '"' . get_search_query() . '"' );
215
+ // Add a page number if we're on page 2 or more:
216
+ if ( $paged >= 2 ) {
217
+ $title .= " $separator " . sprintf( __( 'Page %s', 'starter' ), $paged );
218
+ }
219
+ // Add the site name to the end:
220
+ $title .= " $separator " . get_bloginfo( 'name', 'display' );
221
+ // We're done. Let's send the new title back to wp_title():
222
+ return $title;
223
+ }
224
+
225
+ $return = array();
226
+
227
+ if ( $title != '' ) {
228
+ $return[] = str_replace( " $separator ", '', apply_filters( 'the_category', $title ) );
229
+ }
230
+
231
+ if ( is_single() ) {
232
+ if ( get_post_meta( $post->ID, 'title', true ) ) {
233
+ $return[] = stripslashes( get_post_meta( $post->ID, 'seo_title', true ) );
234
+ }
235
+ elseif ( ! in_array( $post->post_type, array( 'post', 'page', 'attachment' ) ) ) {
236
+ $post_type_obj = get_post_type_object( $post->post_type );
237
+ $return[] = apply_filters( 'post_type_archive_title', $post_type_obj->labels->name );
238
+ }
239
+ }
240
+
241
+ // Add a page number if necessary:
242
+ if ( $paged >= 2 or $page >= 2 ) {
243
+ $return[] = sprintf( __( 'Page %s', 'starter' ), max( $paged, $page ) );
244
+ }
245
+
246
+ // Add the site name to the end:
247
+ $return[] = get_bloginfo( 'name', 'display' );
248
+
249
+ // If we have a site description and we're on the home/front page, add the description:
250
+ $site_description = get_bloginfo( 'description', 'display' );
251
+ if ( $site_description and ( is_home() or is_front_page() ) ) {
252
+ $return[] = $site_description;
253
+ }
254
+
255
+ // Return the new title to wp_title():
256
+ return implode( " $separator ", $return );
257
+ }
258
+
259
+ add_filter( 'wp_title', 'starter_filter_wp_title', 10, 3 );
260
+
261
+ /**
262
+ * Adds code to header
263
+ *
264
+ * @since [starter] 1.0
265
+ * @return string misc
266
+ */
267
+ function starter_header() {
268
+ ?>
269
+ <!-- For third-generation iPad with high-resolution Retina display: -->
270
+ <link rel="apple-touch-icon-precomposed" sizes="144x144" href="apple-touch-icon-144x144-precomposed.png?1333401433">
271
+ <!-- For iPhone with high-resolution Retina display: -->
272
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="apple-touch-icon-114x114-precomposed.png?1333401433">
273
+ <!-- For first- and second-generation iPad: -->
274
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="apple-touch-icon-72x72-precomposed.png?1333401433">
275
+ <!-- For non-Retina iPhone, iPod Touch, and Android 2.1+ devices: -->
276
+ <link rel="apple-touch-icon-precomposed" href="apple-touch-icon-precomposed.png?1333401433">
277
+ <!-- For non-Retina iPhone, iPod Touch, and Android 2.1+ devices: -->
278
+ <link rel="shortcut icon" href="favicon.ico?1333401433" type="image/x-icon" />
279
+ <?php
280
+ do_action( 'starter_header' );
281
+ }
282
+
283
+ add_action( 'wp_head', 'starter_header', 10 );
284
+
285
+ /**
286
+ * Adds code to footer
287
+ *
288
+ * @since [starter] 1.0
289
+ * @return string misc
290
+ */
291
+ function starter_footer() {}
292
+
293
+ add_action( 'wp_footer', 'starter_footer', 10 );
294
+
295
+ /**
296
+ * Defines widget areas
297
+ *
298
+ * @since [starter] 1.0
299
+ * @return void
300
+ */
301
+ function starter_widgets_init() {
302
+ register_sidebar(
303
+ array(
304
+ 'name' => __( 'Primary widget area', 'starter' ),
305
+ 'id' => 'primary-widget-area',
306
+ 'description' => __( '', 'starter' ),
307
+ 'before_widget' => '<li id="%1$s" class="widget-container %2$s">',
308
+ 'after_widget' => '</li>',
309
+ 'before_title' => '<h3 class="widget-title">',
310
+ 'after_title' => '</h3>',
311
+ )
312
+ );
313
+ }
314
+
315
+ add_action( 'widgets_init', 'starter_widgets_init' );
316
+
317
+ /**
318
+ * Clean up output of stylesheet <link> tags
319
+ *
320
+ * @since [starter] 1.0
321
+ */
322
+ function starter_clean_style_tag( $input ) {
323
+ preg_match_all( "!<link rel='stylesheet'\s?(id='[^']+')?\s+href='(.*)' type='text/css' media='(.*)' />!", $input, $matches );
324
+ // Only display media if it's print
325
+ $media = $matches[3][0] == 'print' ? ' media="print"' : '';
326
+
327
+ return '<link rel="stylesheet" href="' . $matches[ 2 ][ 0 ] . '"' . $media . '>' . "\n";
328
+ }
329
+
330
+ add_filter( 'style_loader_tag', 'starter_clean_style_tag' );
331
+
332
+ /**
333
+ * Remove unnecessary self-closing tags
334
+ *
335
+ * @since [starter] 1.0
336
+ */
337
+ function starter_remove_self_closing_tags( $input ) {
338
+ return str_replace( ' />', '>', $input );
339
+ }
340
+
341
+ add_filter( 'get_avatar', 'starter_remove_self_closing_tags' ); // <img />
342
+ add_filter( 'comment_id_fields', 'starter_remove_self_closing_tags' ); // <input />
343
+ add_filter( 'post_thumbnail_html', 'starter_remove_self_closing_tags' ); // <img />
344
+
345
+ /**
346
+ * Wrap embedded media as suggested by Readability
347
+ *
348
+ * @link https://gist.github.com/965956
349
+ * @link http://www.readability.com/publishers/guidelines#publisher
350
+ * @since [starter] 1.0
351
+ */
352
+ function starter_embed_wrap( $cache, $url, $attr = '', $post_ID = '' ) {
353
+ return '<div class="entry-content-asset">' . $cache . '</div>';
354
+ }
355
+
356
+ add_filter( 'embed_oembed_html', 'starter_embed_wrap', 10, 4 );
357
+ add_filter( 'embed_googlevideo', 'starter_embed_wrap', 10, 2 );
358
+
359
+ /**
360
+ * Remove height/width attributes on images so they can be responsive
361
+ *
362
+ * @since [starter] 1.0
363
+ */
364
+ function starter_remove_thumbnail_dimensions( $html, $id, $alt, $title ) {
365
+ return preg_replace(
366
+ array(
367
+ '/\s+width="\d+"/i',
368
+ '/\s+height="\d+"/i',
369
+ '/alt=""/i',
370
+ ),
371
+ array(
372
+ '',
373
+ '',
374
+ '',
375
+ 'alt="' . $title . '"',
376
+ ),
377
+ $html
378
+ );
379
+ }
380
+
381
+ add_filter( 'post_thumbnail_html', 'starter_remove_thumbnail_dimensions', 10, 4 );
382
+ add_filter( 'image_send_to_editor', 'starter_remove_thumbnail_dimensions', 10, 4 );
383
+ add_filter( 'get_image_tag', 'starter_remove_thumbnail_dimensions', 10, 4 );
384
+
385
+ /**
386
+ * Clean the output of attributes of images in editor.
387
+ *
388
+ * @link http://www.sitepoint.com/wordpress-change-img-tag-html/
389
+ * @since [starter] 1.0
390
+ */
391
+ function starter_image_tag_class( $class, $id, $align, $size ) {
392
+ $align = 'align' . esc_attr( $align );
393
+ return $align;
394
+ }
395
+
396
+ add_filter( 'get_image_tag_class', 'starter_image_tag_class', 0, 4 );
397
+
398
+ /**
399
+ * Add thumbnail class to thumbnail links
400
+ *
401
+ * @since [starter] 1.0
402
+ */
403
+ function starter_add_class_attachment_link( $html ) {
404
+ $postid = get_the_ID();
405
+ $html = str_replace( '<a', '<a class="thumbnail"', $html );
406
+
407
+ return $html;
408
+ }
409
+
410
+ add_filter( 'wp_get_attachment_link', 'starter_add_class_attachment_link', 10, 1 );
411
+
412
+ /**
413
+ * Filter in a link to a content ID attribute for the next/previous image links on image attachment pages
414
+ *
415
+ * @since [starter] 1.0
416
+ */
417
+ function starter_enhanced_image_navigation( $url, $id ) {
418
+ if ( ! is_attachment() && ! wp_attachment_is_image( $id ) )
419
+ return $url;
420
+
421
+ $image = get_post( $id );
422
+ if ( ! empty( $image->post_parent ) && $image->post_parent != $id )
423
+ $url .= '#main';
424
+
425
+ return $url;
426
+ }
427
+
428
+ add_filter( 'attachment_link', 'starter_enhanced_image_navigation', 10, 2 );
429
+
430
+ /**
431
+ * Replace various active menu class names with "active"
432
+ * Remove the id="" on nav menu items
433
+ * Return 'menu-slug' for nav menu classes
434
+ *
435
+ * @since [starter] 1.0
436
+ */
437
+ function starter_wp_nav_menu_class( $classes, $item ) {
438
+ $slug = sanitize_title( $item->title );
439
+ $classes = preg_replace( '/(current(-menu-|[-_]page[-_])(item|parent|ancestor))/', 'active', $classes );
440
+ $classes = preg_replace( '/^((menu|page)[-_\w+]+)+/', '', $classes );
441
+
442
+ $classes[] = 'menu-' . $slug;
443
+
444
+ return array_filter( array_unique( $classes ), 'is_element_empty' );
445
+ }
446
+
447
+ add_filter( 'nav_menu_css_class', 'starter_wp_nav_menu_class', 10, 2 );
448
+ add_filter( 'nav_menu_item_id', '__return_null' );
449
+
450
+ /**
451
+ * Check if $element is empty
452
+ *
453
+ * @since [starter] 1.0
454
+ */
455
+ function is_element_empty( $element ) {
456
+ $element = trim( $element );
457
+
458
+ return ( bool ) ! empty( $element );
459
+ }
460
+
461
+ /**
462
+ * Create a graceful fallback to wp_page_menu
463
+ *
464
+ * @since [starter] 1.0
465
+ */
466
+ function starter_page_menu() {
467
+
468
+ $args = array(
469
+ 'sort_column' => 'menu_order, post_title',
470
+ 'menu_class' => 'nav-menu',
471
+ 'include' => '',
472
+ 'exclude' => '',
473
+ 'echo' => true,
474
+ 'show_home' => false,
475
+ 'link_before' => '',
476
+ 'link_after' => '',
477
+ );
478
+
479
+ wp_page_menu( $args );
480
+ }
481
+
482
+ /**
483
+ * Adds extra info to language attributes string
484
+ *
485
+ * @since [starter] 1.0
486
+ */
487
+ function starter_language_attributes() {
488
+ $attr = array();
489
+ $output = '';
490
+
491
+ if ( function_exists( 'is_rtl' ) ) {
492
+ if ( is_rtl() == 'rtl' ) {
493
+ $attr[] = 'dir="rtl"';
494
+ }
495
+ }
496
+
497
+ $lang = get_bloginfo( 'language' );
498
+
499
+ if ( $lang and $lang !== 'en-US' ) {
500
+ $attr[] = "lang=\"$lang\"";
501
+ }
502
+ else {
503
+ $attr[] = 'lang="en"';
504
+ }
505
+
506
+ return implode( ' ', $attr );
507
+ }
508
+
509
+ add_filter( 'language_attributes', 'starter_language_attributes' );
510
+
511
+ /**
512
+ * remove the p from around imgs
513
+ *
514
+ * @link https://gist.github.com/975026
515
+ * @since [starter] 1.0
516
+ */
517
+ function starter_filter_ptags_on_images( $content ) {
518
+ // Replace br tags inside figures
519
+ $content = preg_replace( '/(<figure .*>)?<br\s?\/?>\s*(<a .*>)?\s*(<img .* \/>)\s*(<\/a>)?\s*/iU', '\1\2\3\4', $content );
520
+ // do a regular expression replace...
521
+ // find all p tags that have just
522
+ // <p>maybe some white space<img all stuff up to /> then maybe whitespace </p>
523
+ // replace it with just the image tag...
524
+ $content = preg_replace( '/<p>\s*(<a .*>)?\s*(<img .* \/>)\s*(<\/a>)?\s*<\/p>/iU', '\1\2\3', $content );
525
+ // now pass that through and do the same for iframes...
526
+ return preg_replace( '/<p>\s*(<iframe .*>*.<\/iframe>)\s*<\/p>/iU', '\1', $content );
527
+ }
528
+
529
+ add_filter( 'the_content', 'starter_filter_ptags_on_images' );
530
+
531
+ /**
532
+ * Adds browser detection body class
533
+ * Adds extra classes to body tag on custom taxonomies
534
+ *
535
+ * @since [starter] 1.0
536
+ */
537
+ function starter_body_classes( $classes ) {
538
+ global $wp_query, $is_lynx, $is_gecko, $is_IE, $is_opera, $is_NS4, $is_safari, $is_chrome, $is_iphone;
539
+
540
+ if ( isset( $wp_query->query_vars['taxonomy'] ) or isset( $wp_query->query_vars['term'] ) ) {
541
+ array_push( $classes, 'custom-taxonomy-archive', 'custom-taxonomy-' . ( isset( $wp_query->query_vars[ 'taxonomy' ] ) ? get_query_var( 'taxonomy' ) : get_query_var( 'term' ) ) . '-archive' );
542
+ }
543
+
544
+ if ( $is_lynx ) $classes[] = 'lynx';
545
+ elseif ( $is_gecko ) $classes[] = 'gecko';
546
+ elseif ( $is_opera ) $classes[] = 'opera';
547
+ elseif ( $is_NS4 ) $classes[] = 'ns4';
548
+ elseif ( $is_safari ) $classes[] = 'safari';
549
+ elseif ( $is_chrome ) $classes[] = 'chrome';
550
+ elseif ( $is_IE ) $classes[] = 'ie';
551
+ else $classes[] = 'unknown';
552
+
553
+ if ( $is_iphone ) $classes[] = 'iphone';
554
+
555
+ // Add post/page slug
556
+ if ( is_single() or is_page() and ! is_front_page() ) {
557
+ $classes[] = basename( get_permalink() );
558
+ }
559
+
560
+ // Remove unnecessary classes
561
+ $home_id_class = 'page-id-' . get_option( 'page_on_front' );
562
+ $remove_classes = array(
563
+ 'page-template-default',
564
+ $home_id_class,
565
+ );
566
+
567
+ $classes = array_diff( $classes, $remove_classes );
568
+
569
+ return $classes;
570
+ }
571
+
572
+ add_filter( 'body_class', 'starter_body_classes' );
573
+
574
+ /**
575
+ * Modifies output of custom post formats.
576
+ *
577
+ * @since [starter] 1.0
578
+ */
579
+ function starter_custom_content( $content ) {
580
+ /* Check if we're displaying a 'quote' post. */
581
+ if ( has_post_format( 'quote' ) ) {
582
+ /* Match any <blockquote> elements. */
583
+ preg_match( '/<blockquote.*?>/', $content, $matches );
584
+
585
+ /* If no <blockquote> elements were found, wrap the entire content in one. */
586
+ if ( empty( $matches ) ) {
587
+ $content = "<blockquote>{$content}</blockquote>";
588
+ }
589
+ }
590
+ elseif ( has_post_format( 'aside' ) and ! is_singular() ) {
591
+ preg_match( '/<p>(.*?)<\/p>(?!\s*<p>)/', $content, $matches );
592
+
593
+ $content = str_replace( $matches[1], $matches[1] . ' <a href="' . get_permalink() . '">&#8734;</a>', $content );
594
+ }
595
+
596
+ return $content;
597
+ }
598
+
599
+ add_filter( 'the_content', 'starter_custom_content' );
600
+
601
+ /**
602
+ * Remove <p> and <br /> in the shortcodes
603
+ *
604
+ * @since [starter] 1.0
605
+ */
606
+ function starter_shortcode_empty_paragraph_fix( $content ) {
607
+ $array = array(
608
+ '<p>[' => '[',
609
+ ']</p>' => ']',
610
+ ']<br />' => ']',
611
+ );
612
+
613
+ // replace the strings in the $content
614
+ $content = strtr( $content, $array );
615
+
616
+ return $content;
617
+ }
618
+
619
+ add_filter( 'the_content', 'starter_shortcode_empty_paragraph_fix' );
620
+
621
+ /**
622
+ * Prints HTML with meta information for current post: categories, tags, permalink, author, and date.
623
+ *
624
+ * Create your own starter_entry_meta() to override in a child theme.
625
+ *
626
+ * @since [starter] 1.0
627
+ */
628
+ function starter_entry_meta() {
629
+ // Translators: used between list items, there is a space after the comma.
630
+ $categories_list = get_the_category_list( __( ', ', 'starter' ) );
631
+
632
+ // Translators: used between list items, there is a space after the comma.
633
+ $tag_list = get_the_tag_list( '', __( ', ', 'starter' ) );
634
+
635
+ $date = sprintf(
636
+ '<a href="%1$s" title="%2$s" rel="bookmark"><time class="entry-date" datetime="%3$s">%4$s</time></a>',
637
+ esc_url( get_permalink() ),
638
+ esc_attr( get_the_time() ),
639
+ esc_attr( get_the_date( 'c' ) ),
640
+ esc_html( get_the_date() )
641
+ );
642
+
643
+ $author = sprintf(
644
+ '<span class="author vcard"><a class="url fn n" href="%1$s" title="%2$s" rel="author">%3$s</a></span>',
645
+ esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ),
646
+ esc_attr( sprintf( __( 'View all posts by %s', 'starter' ), get_the_author() ) ),
647
+ get_the_author()
648
+ );
649
+
650
+ // Translators: 1 is category, 2 is tag, 3 is the date and 4 is the author's name.
651
+ if ( $tag_list ) {
652
+ $utility_text = __( 'This entry was posted in %1$s and tagged %2$s on %3$s<span class="by-author"> by %4$s</span>.', 'starter' );
653
+ }
654
+ elseif ( $categories_list ) {
655
+ $utility_text = __( 'This entry was posted in %1$s on %3$s<span class="by-author"> by %4$s</span>.', 'starter' );
656
+ }
657
+ else {
658
+ $utility_text = __( 'This entry was posted on %3$s<span class="by-author"> by %4$s</span>.', 'starter' );
659
+ }
660
+
661
+ printf(
662
+ $utility_text,
663
+ $categories_list,
664
+ $tag_list,
665
+ $date,
666
+ $author
667
+ );
668
+ }
669
+
670
+ /**
671
+ * Returns a "Continue Reading" link for excerpts
672
+ *
673
+ * @since [starter] 1.0
674
+ */
675
+ function starter_continue_reading_link() {
676
+ $read_more_link = ' <a href="' . get_permalink() . '" class="more-link">' . __( 'Continue reading', 'starter' ) . '</a>';
677
+
678
+ return $read_more_link;
679
+ }
680
+
681
+ /**
682
+ * Replaces "[...]" (appended to automatically generated excerpts ) with starter_continue_reading_link().
683
+ *
684
+ * To override this in a child theme, remove the filter and add your own
685
+ * function tied to the excerpt_more filter hook.
686
+ *
687
+ * @since [starter] 1.0
688
+ */
689
+ function starter_auto_excerpt_more( $more ) {
690
+ return starter_continue_reading_link();
691
+ }
692
+
693
+ add_filter( 'excerpt_more', 'starter_auto_excerpt_more' );
694
+ add_filter( 'the_content_more_link', 'starter_auto_excerpt_more' );
695
+
696
+ /**
697
+ * Adds a pretty "Continue Reading" link to custom post excerpts.
698
+ *
699
+ * To override this link in a child theme, remove the filter and add your own
700
+ * function tied to the get_the_excerpt filter hook.
701
+ *
702
+ * @since [starter] 1.0
703
+ */
704
+ function starter_custom_excerpt_more( $output ) {
705
+ if ( has_excerpt() and ! is_attachment() ) {
706
+ $output .= starter_continue_reading_link();
707
+ }
708
+ return $output;
709
+ }
710
+
711
+ add_filter( 'get_the_excerpt', 'starter_custom_excerpt_more' );
712
+
713
+ /**
714
+ * Adds nofollow rel atribute to content links
715
+ *
716
+ * @since [starter] 1.0
717
+ */
718
+ function starter_nofollow_links_in_post( $text ) {
719
+ global $post;
720
+
721
+ if ( get_post_meta( $post->ID, 'nofollow_links', true ) ) {
722
+ preg_match_all( '/<a.*? href=\"(.*? )\".*?>(.*? )<\/a>/i', $text, $links );
723
+ $match_count = count( $links[0] );
724
+
725
+ for ( $i = 0; $i < $match_count; ++$i ) {
726
+ if ( ! preg_match( '/rel=[\"\']*nofollow[\"\']*/', $links[0][$i] ) ) {
727
+ preg_match_all( '/<a.*? href=\"(.*? )\"(.*? )>(.*? )<\/a>/i', $links[0][$i], $link_text );
728
+
729
+ $search = '>'.$link_text[3][0].'</a>';
730
+ $replace = ' rel="nofollow">'.$link_text[3][0].'</a>';
731
+
732
+ $text = str_replace( $search, $replace, $text );
733
+ }
734
+ }
735
+ }
736
+
737
+ return $text;
738
+ }
739
+
740
+ add_action( 'the_content', 'starter_nofollow_links_in_post' );
741
+
742
+ /**
743
+ * Custom tag clould args
744
+ *
745
+ * @since [starter] 1.0
746
+ */
747
+ function starter_widget_tag_cloud_args( $args ) {
748
+ $args['number'] = 20; // show less tags
749
+ $args['largest'] = 13; // make largest and smallest the same
750
+ $args['smallest'] = 13;
751
+ $args['unit'] = 'px';
752
+ $args['format'] = 'list'; // ul with a class of wp-tag-cloud
753
+ // $args['exclude'] = array(20, 80, 92); // exclude tags by ID
754
+ // $args['taxonomy'] = array('post_tag', 'ingredients'); // add post tags and ingredients taxonomy
755
+
756
+ return $args;
757
+ }
758
+
759
+ add_filter( 'widget_tag_cloud_args', 'starter_widget_tag_cloud_args' );
760
+
761
+ /**
762
+ * Filter tag clould output so that it can be styled by CSS
763
+ *
764
+ * @since [starter] 1.0
765
+ */
766
+ function starter_add_tag_class( $taglinks ) {
767
+ $tags = explode( '</a>', $taglinks );
768
+ $regex = "#(.*tag-link[-])(.*)(' title.*)#e";
769
+ foreach ( $tags as $tag ) {
770
+ $tagn[] = preg_replace( $regex, "('$1$2 label tag-'.get_tag($2)->slug.'$3')", $tag );
771
+ }
772
+
773
+ return implode( '</a>', $tagn );
774
+ }
775
+
776
+ add_filter( 'wp_tag_cloud', 'starter_add_tag_class' );
777
+
778
+ /**
779
+ * Outputs WP Pagenavi pagination or wordpress navigation
780
+ *
781
+ * @since [starter] 1.0
782
+ */
783
+ function pagination( $query = false ) {
784
+ global $wp_query;
785
+
786
+ if ( is_single() ) {
787
+ ?>
788
+ <nav id="comment-nav-below" class="navigation" role="navigation">
789
+ <h1 class="assistive-text section-heading"><?php _e( 'Post Navigation', 'starter' ); ?></h1>
790
+ <?php
791
+ if ( $previous = get_previous_post() ):?>
792
+ <div class="nav-previous alignleft">
793
+ <a href="<?php echo get_permalink( $previous );?>" title="<?php printf( __( 'Permalink to %s', 'starter' ), get_the_title( $previous ) );?>"><?php _e( 'Previous', 'starter' ); ?></a>
794
+ </div>
795
+ <?php endif;?>
796
+ <?php
797
+ if ( $next = get_next_post() ):?>
798
+ <div class="nav-next alignright">
799
+ <a href="<?php echo get_permalink( $next );?>" title="<?php printf( __( 'Permalink to %s', 'starter' ), get_the_title( $next ) );?>"><?php _e( 'Next', 'starter' ); ?></a>
800
+ </div>
801
+ <?php endif;?>
802
+ </nav>
803
+ <?php
804
+ } else {
805
+ if ( $wp_query->max_num_pages > 1 ) {
806
+ if ( function_exists( 'wp_pagenavi' ) ) {
807
+ $args = array( 'options' => PageNavi_Core::$options->get_defaults() );
808
+
809
+ if ( $query ) {
810
+ $args[ 'query' ] = $query;
811
+ }
812
+
813
+ wp_pagenavi( $args );
814
+ } else {
815
+ //get_template_part( 'templates/pager' );
816
+ $big = 999999999; // This needs to be an unlikely integer
817
+
818
+ // For more options and info view the docs for paginate_links()
819
+ // http://codex.wordpress.org/Function_Reference/paginate_links
820
+ $paginate_links = paginate_links(
821
+ array(
822
+ 'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
823
+ 'current' => max( 1, get_query_var( 'paged' ) ),
824
+ 'total' => $wp_query->max_num_pages,
825
+ 'mid_size' => 5,
826
+ 'prev_next' => True,
827
+ 'prev_text' => __( '&larr;' ),
828
+ 'next_text' => __( '&rarr;' ),
829
+ 'type' => 'list',
830
+ )
831
+ );
832
+
833
+ // Display the pagination if more than one page is found
834
+ if ( $paginate_links ) {
835
+ echo $paginate_links;
836
+ }
837
+ }
838
+ }
839
+ }
840
+ }
841
+
842
+ add_action( 'pagination', 'pagination' );
843
+
844
+ /**
845
+ * Template for comments and pingbacks.
846
+ * Used as a callback by wp_list_comments() for displaying the comments.
847
+ *
848
+ * @since [starter] 1.0
849
+ */
850
+ function starter_comment( $comment, $args, $depth ) {
851
+ $GLOBALS['comment'] = $comment;
852
+ switch ( $comment->comment_type ) {
853
+ case 'pingback' :
854
+ case 'trackback' :
855
+ // Display trackbacks differently than normal comments.
856
+ ?>
857
+ <li <?php comment_class(); ?> id="comment-<?php comment_ID(); ?>">
858
+ <p><?php _e( 'Pingback:', 'starter' ); ?> <?php comment_author_link(); ?> <?php edit_comment_link( __( '(Edit)', 'starter' ), '<span class="edit-link">', '</span>' ); ?></p>
859
+ <?php
860
+ break;
861
+ default :
862
+ // Proceed with normal comments.
863
+ global $post;
864
+ ?>
865
+ <li <?php comment_class(); ?> id="li-comment-<?php comment_ID(); ?>">
866
+ <article id="comment-<?php comment_ID(); ?>" class="comment">
867
+ <header class="comment-meta comment-author vcard clearfix">
868
+ <?php
869
+ echo get_avatar( $comment, 44 );
870
+ printf(
871
+ '<cite class="fn">%1$s %2$s</cite>',
872
+ get_comment_author_link(),
873
+ // If current post author is also comment author, make it known visually.
874
+ ( $comment->user_id === $post->post_author ) ? '<span> ' . __( 'Post author', 'starter' ) . '</span>' : ''
875
+ );
876
+ printf(
877
+ '<a href="%1$s"><time datetime="%2$s">%3$s</time></a>',
878
+ esc_url( get_comment_link( $comment->comment_ID ) ),
879
+ get_comment_time( 'c' ),
880
+ /* translators: 1: date, 2: time */
881
+ sprintf( __( '%1$s at %2$s', 'starter' ), get_comment_date(), get_comment_time() )
882
+ );
883
+ ?>
884
+ </header>
885
+
886
+ <?php
887
+ if ( '0' == $comment->comment_approved ):
888
+ ?>
889
+ <p class="comment-awaiting-moderation"><?php _e( 'Your comment is awaiting moderation.', 'starter' ); ?></p>
890
+ <?php endif; ?>
891
+
892
+ <section class="comment-content comment clearfix">
893
+ <?php comment_text(); ?>
894
+ </section>
895
+
896
+ <div class="reply">
897
+ <?php edit_comment_link( __( 'Edit', 'starter' ), '<span class="edit-link">', '</span> / ' ); ?>
898
+ <?php comment_reply_link( array_merge( $args, array( 'reply_text' => __( 'Reply', 'starter' ), 'after' => ' <span>&darr;</span>', 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?>
899
+ </div>
900
+ </article>
901
+ <?php
902
+ break;
903
+ } // end comment_type check
904
+ }
905
+
906
+ /**
907
+ * Redirect to post when search query returns single result
908
+ *
909
+ * @see http://wpsnipp.com/index.php/functions-php/redirect-to-post-when-search-query-returns-single-result/
910
+ * @since [starter] 1.0
911
+ */
912
+ function starter_single_result() {
913
+ if ( is_search() ) {
914
+ global $wp_query;
915
+ if ( $wp_query->post_count == 1 ) {
916
+ wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );
917
+ }
918
+ }
919
+ }
920
+ add_action( 'template_redirect', 'starter_single_result' );
921
+
922
+ /**
923
+ * Add postMessage support for site title and description for the Theme Customizer.
924
+ *
925
+ * @since [starter] 1.0
926
+ *
927
+ * @param WP_Customize_Manager $wp_customize Theme Customizer object.
928
+ * @return void
929
+ */
930
+ function starter_customize_register( $wp_customize ) {
931
+ $wp_customize->get_setting( 'blogname' )->transport = 'postMessage';
932
+ $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage';
933
+ }
934
+ add_action( 'customize_register', 'starter_customize_register' );
935
+
936
+ /* SHORTCODES */
937
+
938
+ // Allow shortcodes in widgets
939
+ add_filter( 'widget_text', 'do_shortcode' );
940
+
941
+ /**
942
+ * The supported attributes for the shortcode are 'id', 'align', 'width', and 'caption'.
943
+ *
944
+ * @since [starter] 1.0
945
+ */
946
+ function starter_shortcode_caption( $atts, $content = null ) {
947
+ extract(
948
+ shortcode_atts(
949
+ array(
950
+ 'id' => '',
951
+ 'align' => 'alignnone',
952
+ 'width' => '',
953
+ 'caption' => '',
954
+ ), $atts
955
+ )
956
+ );
957
+
958
+ if ( 1 > ( int ) $width )
959
+ return $content;
960
+
961
+ if ( empty( $caption ) ) {
962
+ preg_match( '/(<img[^>]+>)[ ]?(.*)/i', $content, $match );
963
+ $content = $match[1];
964
+ $caption = $match[2];
965
+ }
966
+
967
+ if ( $id ) {
968
+ $idtag = 'id="' . esc_attr( $id ) . '" ';
969
+ }
970
+
971
+ $out[] = '<figure ' . $idtag . 'aria-describedby="figcaption_' . $id . '" class="post-image wp-caption ' . $align . '">';
972
+ $out[] = do_shortcode( $content );
973
+ $out[] = '<figcaption id="figcaption_' . $id . '" class="caption wp-caption-text">' . wpautop( wptexturize( $caption ) ) . '</figcaption>';
974
+ $out[] = '</figure>';
975
+
976
+ return implode( "\n", $out );
977
+ }
978
+
979
+ add_shortcode( 'wp_caption', 'starter_shortcode_caption' );
980
+ add_shortcode( 'caption', 'starter_shortcode_caption' );
981
+
982
+
983
+ /* ADMIN STUFF */
984
+
985
+ /**
986
+ * Remove unnecessary dashboard widgets
987
+ *
988
+ * @link http://www.deluxeblogtips.com/2011/01/remove-dashboard-widgets-in-wordpress.html
989
+ * @since [starter] 1.0
990
+ */
991
+ function starter_remove_dashboard_widgets() {
992
+ // Incoming Links Widget
993
+ remove_meta_box( 'dashboard_incoming_links', 'dashboard', 'normal' );
994
+
995
+ // Plugins Widget
996
+ remove_meta_box( 'dashboard_plugins', 'dashboard', 'normal' );
997
+
998
+ remove_meta_box( 'dashboard_primary', 'dashboard', 'normal' );
999
+ remove_meta_box( 'dashboard_secondary', 'dashboard', 'normal' );
1000
+
1001
+ // Sitepress WPML Plugin Widget
1002
+ remove_meta_box( 'icl_dashboard_widget', 'dashboard', 'normal' );
1003
+
1004
+ // Yoast's SEO Plugin Widget
1005
+ remove_meta_box( 'yoast_db_widget', 'dashboard', 'normal' );
1006
+ }
1007
+
1008
+ add_action( 'admin_init', 'starter_remove_dashboard_widgets' );
1009
+
1010
+ /**
1011
+ * Adds custom menu to admin bar
1012
+ *
1013
+ * @since [starter] 1.0
1014
+ */
1015
+ function starter_bar_menu( $wp_admin_bar ) {
1016
+ if ( ! is_super_admin() or ! is_admin_bar_showing() )
1017
+ return;
1018
+
1019
+ /**
1020
+ * Change "Howdy"
1021
+ */
1022
+ // get the node that contains "howdy"
1023
+ $my_account = $wp_admin_bar->get_node( 'my-account' );
1024
+ // change the "howdy"
1025
+ $my_account->title = str_replace( 'Howdy,', __( 'Hi,', 'starter' ), $my_account->title );
1026
+ // remove the original node
1027
+ $wp_admin_bar->remove_node( 'my-account' );
1028
+ // add back our modified version
1029
+ $wp_admin_bar->add_node( $my_account );
1030
+
1031
+ /**
1032
+ * Removing the "W" menu
1033
+ * I have nothing against it, but I *never* use it
1034
+ */
1035
+ $wp_admin_bar->remove_menu( 'wp-logo' );
1036
+
1037
+ /**
1038
+ * Create a "Favorites" menu
1039
+ * First, just create the parent menu item
1040
+ */
1041
+ $wp_admin_bar->add_menu(
1042
+ array(
1043
+ 'id' => 'favorites',
1044
+ 'parent' => 'top-secondary', // puts it on the right-hand side
1045
+ 'title' => __( 'Favorites', 'starter' ),
1046
+ )
1047
+ );
1048
+
1049
+ /**
1050
+ * Then add links to it
1051
+ * This link goes to the All Settings page,
1052
+ * so only show it to users that have appropriate privileges
1053
+ */
1054
+ if ( current_user_can( 'manage_options' ) ) {
1055
+ $wp_admin_bar->add_menu(
1056
+ array(
1057
+ 'id' => 'all-settings',
1058
+ 'parent' => 'favorites',
1059
+ 'title' => __( 'Options', 'starter' ),
1060
+ 'href' => admin_url( 'options.php' ),
1061
+ )
1062
+ );
1063
+ }
1064
+
1065
+ // This one goes to the list of the current user's posts
1066
+ $wp_admin_bar->add_menu(
1067
+ array(
1068
+ 'id' => 'my-posts',
1069
+ 'parent' => 'favorites',
1070
+ 'title' => __( 'My Posts', 'starter' ),
1071
+ 'href' => admin_url( 'edit.php?post_type=post&author=' . get_current_user_id() ),
1072
+ )
1073
+ );
1074
+
1075
+ // MySQL query and script execution timer output
1076
+ $wp_admin_bar->add_menu(
1077
+ array(
1078
+ 'id' => 'do_query_bar',
1079
+ 'parent' => 'top-secondary', // puts it on the right-hand side
1080
+ 'title' => get_num_queries() . 'Q - ' . timer_stop() . 's', // link title
1081
+ 'href' => '#',
1082
+ 'meta' => false,
1083
+ )
1084
+ );
1085
+ }
1086
+
1087
+ add_action( 'admin_bar_menu', 'starter_bar_menu', '1000' );
1088
+
1089
+ /**
1090
+ * This simple hack will remove the AIM, Yahoo and Jabber fields and will replace them with a bunch of other social network profiles.
1091
+ *
1092
+ * @since [starter] 1.0
1093
+ */
1094
+ function starter_user_contactmethods( $contactmethods ) {
1095
+ unset( $contactmethods['aim'], $contactmethods['yim'], $contactmethods['jabber'] );
1096
+
1097
+ // Add Location
1098
+ $contactmethods['user_location'] = __( 'Location', 'starter' );
1099
+
1100
+ // Add Facebook
1101
+ $contactmethods['user_fb'] = __( 'Facebook', 'starter' );
1102
+
1103
+ // Add Pinterest
1104
+ $contactmethods['user_pt'] = __( 'Pinterest', 'starter' );
1105
+
1106
+ // Add Twitter
1107
+ $contactmethods['user_tw'] = __( 'Twitter', 'starter' );
1108
+
1109
+ // Add Linkedin
1110
+ $contactmethods['user_lk'] = __( 'Linkedin', 'starter' );
1111
+
1112
+ // Add Github
1113
+ $contactmethods['user_gh'] = __( 'Github', 'starter' );
1114
+
1115
+ // Add Google+
1116
+ $contactmethods['google_profile'] = __( 'Google+ profile', 'starter' );
1117
+
1118
+ return $contactmethods;
1119
+ }
1120
+
1121
+ add_filter( 'user_contactmethods', 'starter_user_contactmethods' );
1122
+
1123
+ /**
1124
+ * Adds previous/next links to post edition window
1125
+ *
1126
+ * @since [starter] 1.0
1127
+ */
1128
+ function starter_add_navigation_edit_posts() {
1129
+ if ( isset( $_GET['post'] ) and isset( $_GET['action'] ) and $_GET['action'] == 'edit' ) {
1130
+ global $post;
1131
+
1132
+ $args = array(
1133
+ 'public' => true,
1134
+ '_builtin' => false,
1135
+ );
1136
+ $output = 'names'; // names or objects, note names is the default
1137
+ $operator = 'and'; // 'and' or 'or'
1138
+
1139
+ $post_types = get_post_types( $args, $output, $operator );
1140
+
1141
+ $post_types['post'] = 'post';
1142
+ $post_types['page'] = 'page';
1143
+
1144
+ if ( is_object( $post ) and in_array( $post->post_type, $post_types ) ) {
1145
+ $wtf = array( true, false );
1146
+ foreach ( $wtf as $prev ) {
1147
+ $p = get_adjacent_post( false, '', $prev );
1148
+
1149
+ if ( ! empty( $p ) ) {
1150
+ echo '<script>
1151
+ jQuery(function($) {
1152
+ $(".wrap h2" )
1153
+ .append(\'<a class="add-new-h2" href="' . admin_url( 'post.php?action=edit&post=' . $p->ID ) . '" title="' . __( 'Editar', 'starter' ) . ' ' . apply_filters( 'the_title', $p->post_title ) . '">' . ( $prev ? '&laquo; ' : '' ) . apply_filters( 'the_title', $p->post_title ) . ( ! $prev ? ' &raquo;' : '' ) . '</a>\' );
1154
+ });
1155
+ </script>';
1156
+ }
1157
+ }
1158
+ }
1159
+ }
1160
+ }
1161
+
1162
+ add_action( 'admin_head', 'starter_add_navigation_edit_posts' );
1163
+
1164
+ /**
1165
+ * Custom Login Logo Support
1166
+ *
1167
+ * @since [starter] 1.0
1168
+ */
1169
+ function starter_custom_login_logo() {
1170
+ echo '<style type="text/css">
1171
+ h1 a { background-image:url(' . get_template_directory_uri() . '/images/login-logo.png) !important; }
1172
+ </style>';
1173
+ }
1174
+
1175
+ add_action( 'login_head', 'starter_custom_login_logo' );
1176
+
1177
+ /**
1178
+ * Custom Login URL
1179
+ *
1180
+ * @since [starter] 1.0
1181
+ */
1182
+ function starter_wp_login_url() {
1183
+ return home_url();
1184
+ }
1185
+
1186
+ add_filter( 'login_headerurl', 'starter_wp_login_url' );
1187
+
1188
+ /**
1189
+ * Custom Login Title
1190
+ *
1191
+ * @since [starter] 1.0
1192
+ */
1193
+ function starter_wp_login_title() {
1194
+ return get_option( 'blogname' );
1195
+ }
1196
+
1197
+ add_filter( 'login_headertitle', 'starter_wp_login_title' );
1198
+
1199
+ /**
1200
+ * Custom Backend Footer
1201
+ *
1202
+ * @since [starter] 1.0
1203
+ */
1204
+ function starter_custom_admin_footer() {
1205
+ $credits = '<span id="footer-thankyou">Crafted by <a href="//alexsancho.name" target="_blank">Alex Sancho</a></span>.';
1206
+
1207
+ echo apply_filters( 'starter_custom_admin_footer', $credits );
1208
+ }
1209
+
1210
+ // adding it to the admin area
1211
+ add_filter( 'admin_footer_text', 'starter_custom_admin_footer' );