Лучшая коллекция кода для вашего файла functions.php

Пожалуйста, проголосуйте на вопрос и любые ответы, которые вы найдете полезными, нажав на стрелку вверх в левой части вопроса или ответа.

Как и многие другие, которые сейчас просматривают этот пост, я читал различные блоги, форумы и дискуссионные группы, чтобы узнать и улучшить свои навыки в WordPress. За последние 12 месяцев я был на миссии, чтобы заменить мое использование плагинов, добавив код в мой файл functions.php . Хотя я полностью согласен с тем, что плагины очень полезны во многих ситуациях, мой опыт показал, что в 90% случаев использования, хотя плагин может существовать, на самом деле его использование может создать ненужные сложности и проблемы совместимости. Кроме того, во многих случаях такие плагины добавили меню и другие элементы администрирования, которые мне не нужны или не нужны.

Чаще всего я обнаружил, что, проанализировав код плагинов, я смог вырезать фрагмент кода, который я хотел, и жестко закодировать его в моих functions.php . Это обеспечило мне нужную мне функциональность без необходимости включать ненужные элементы.

Таким образом, цель этого сообщения – моя попытка привлечь вас, читателя / администратора / разработчика, поделиться со мной и другими здесь любыми кодовыми битами, которые вы найдете полезными, и добавили в файл function.php вашей темы для расширения или улучшения WordPress без использования плагина.

Когда вы отправляете ответ здесь, пожалуйста, любезно дайте каждому биту кода заголовок, сообщите нам, с какой версией WordPress вы знаете его совместимость, включите любое описание, которое лучше всего описывает его функция, и (если применимо) включите ссылку на оригинал плагин или источник, где вы нашли информацию.

Я с нетерпением жду всех ваших ответов и, конечно же, постоянно буду добавлять свои новые находки, когда найду их.

Включить функцию скрытого администратора, отображающую ВСЕ настройки сайта

Протестировано на: WordPress 3.1 RC3

Этот маленький кусок кода делает что-то довольно круто. Он добавит дополнительную опцию в меню настроек со ссылкой на «все настройки», которая покажет вам полный список всех настроек, которые у вас есть в вашей базе данных, связанные с вашим сайтом WordPress. В приведенном ниже коде будет отображаться только эта ссылка для пользователя admin и скрыть ее для всех других пользователей.

 // CUSTOM ADMIN MENU LINK FOR ALL SETTINGS function all_settings_link() { add_options_page(__('All Settings'), __('All Settings'), 'administrator', 'options.php'); } add_action('admin_menu', 'all_settings_link'); 

Изменить URL-адрес логотипа и изображения входа в систему

Проверено на: WordPress 3.0.1

Этот код позволит вам легко изменить логотип страницы входа в WordPress, а также ссылку href и текст заголовка этого логотипа.

 add_filter( 'login_headerurl', 'namespace_login_headerurl' ); /** * Replaces the login header logo URL * * @param $url */ function namespace_login_headerurl( $url ) { $url = home_url( '/' ); return $url; } add_filter( 'login_headertitle', 'namespace_login_headertitle' ); /** * Replaces the login header logo title * * @param $title */ function namespace_login_headertitle( $title ) { $title = get_bloginfo( 'name' ); return $title; } add_action( 'login_head', 'namespace_login_style' ); /** * Replaces the login header logo */ function namespace_login_style() { echo '<style>.login h1 a { background-image: url( ' . get_template_directory_uri() . '/images/logo.png ) !important; }</style>'; } 

EDIT: если вы хотите использовать логотип сайта для замены логотипа входа в систему, вы можете использовать следующее, чтобы динамически извлекать эту информацию (проверено на WP3.5 ):

 function namespace_login_style() { if( function_exists('get_custom_header') ){ $width = get_custom_header()->width; $height = get_custom_header()->height; } else { $width = HEADER_IMAGE_WIDTH; $height = HEADER_IMAGE_HEIGHT; } echo '<style>'.PHP_EOL; echo '.login h1 a {'.PHP_EOL; echo ' background-image: url( '; header_image(); echo ' ) !important; '.PHP_EOL; echo ' width: '.$width.'px !important;'.PHP_EOL; echo ' height: '.$height.'px !important;'.PHP_EOL; echo ' background-size: '.$width.'px '.$height.'px !important;'.PHP_EOL; echo '}'.PHP_EOL; echo '</style>'.PHP_EOL; } 

Удалить уведомление об обновлении для всех пользователей, кроме пользователя ADMIN

Проверено на: WordPress 3.0.1

Этот код гарантирует, что никакие пользователи, кроме «admin», не будут уведомлены wordpress при наличии обновлений.

 // REMOVE THE WORDPRESS UPDATE NOTIFICATION FOR ALL USERS EXCEPT SYSADMIN global $user_login; get_currentuserinfo(); if ($user_login !== "admin") { // change admin to the username that gets the updates add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 ); add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) ); } 

Измененная версия содержит только уведомление об обновлении для пользователей admin (в отличие от пользователя «admin»):

 // REMOVE THE WORDPRESS UPDATE NOTIFICATION FOR ALL USERS EXCEPT SYSADMIN global $user_login; get_currentuserinfo(); if (!current_user_can('update_plugins')) { // checks to see if current user can update plugins add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 ); add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) ); } 

Включите персонализированные типы сообщений в результатах поиска.

 // MAKE CUSTOM POST TYPES SEARCHABLE function searchAll( $query ) { if ( $query->is_search ) { $query->set( 'post_type', array( 'site', 'plugin', 'theme', 'person' )); } return $query; } add_filter( 'the_search_query', 'searchAll' ); 

Добавьте свои собственные типы сообщений в основной RSS-канал своих сайтов по умолчанию.

 // ADD CUSTOM POST TYPES TO THE DEFAULT RSS FEED function custom_feed_request( $vars ) { if (isset($vars['feed']) && !isset($vars['post_type'])) $vars['post_type'] = array( 'post', 'site', 'plugin', 'theme', 'person' ); return $vars; } add_filter( 'request', 'custom_feed_request' ); 

Включить персонализированные типы сообщений в виджета панели управления «Right Now»

Это будет включать ваши пользовательские типы сообщений и количество сообщений для каждого типа в виджетах панели «Right Now».

 // ADD CUSTOM POST TYPES TO THE 'RIGHT NOW' DASHBOARD WIDGET function wph_right_now_content_table_end() { $args = array( 'public' => true , '_builtin' => false ); $output = 'object'; $operator = 'and'; $post_types = get_post_types( $args , $output , $operator ); foreach( $post_types as $post_type ) { $num_posts = wp_count_posts( $post_type->name ); $num = number_format_i18n( $num_posts->publish ); $text = _n( $post_type->labels->singular_name, $post_type->labels->name , intval( $num_posts->publish ) ); if ( current_user_can( 'edit_posts' ) ) { $num = "<a href='edit.php?post_type=$post_type->name'>$num</a>"; $text = "<a href='edit.php?post_type=$post_type->name'>$text</a>"; } echo '<tr><td class="first num b b-' . $post_type->name . '">' . $num . '</td>'; echo '<td class="text t ' . $post_type->name . '">' . $text . '</td></tr>'; } $taxonomies = get_taxonomies( $args , $output , $operator ); foreach( $taxonomies as $taxonomy ) { $num_terms = wp_count_terms( $taxonomy->name ); $num = number_format_i18n( $num_terms ); $text = _n( $taxonomy->labels->singular_name, $taxonomy->labels->name , intval( $num_terms )); if ( current_user_can( 'manage_categories' ) ) { $num = "<a href='edit-tags.php?taxonomy=$taxonomy->name'>$num</a>"; $text = "<a href='edit-tags.php?taxonomy=$taxonomy->name'>$text</a>"; } echo '<tr><td class="first b b-' . $taxonomy->name . '">' . $num . '</td>'; echo '<td class="t ' . $taxonomy->name . '">' . $text . '</td></tr>'; } } add_action( 'right_now_content_table_end' , 'wph_right_now_content_table_end' ); 

Загрузка jQuery из CDN Google

Проверено на: WordPress 3.0.1

 // even more smart jquery inclusion :) add_action( 'init', 'jquery_register' ); // register from google and for footer function jquery_register() { if ( !is_admin() ) { wp_deregister_script( 'jquery' ); wp_register_script( 'jquery', ( 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js' ), false, null, true ); wp_enqueue_script( 'jquery' ); } } 

Удаление информации о версии WordPress для безопасности

Проверено на: WordPress 3.0.1

 // remove version info from head and feeds function complete_version_removal() { return ''; } add_filter('the_generator', 'complete_version_removal'); 

Добавить спам и удалить ссылки на комментарии к Front End

Проверено на: WordPress 3.0.1

Это упрощает управление комментариями из внешнего интерфейса путем добавления спама и удаления ссылок. **

 // spam & delete links for all versions of wordpress function delete_comment_link($id) { if (current_user_can('edit_post')) { echo '| <a href="'.get_bloginfo('wpurl').'/wp-admin/comment.php?action=cdc&c='.$id.'">del</a> '; echo '| <a href="'.get_bloginfo('wpurl').'/wp-admin/comment.php?action=cdc&dt=spam&c='.$id.'">spam</a>'; } } 

Отложить публикацию публики на RSS-канал

Проверено на: WordPress 3.0.1

Наконец, мне нравится откладывать отправку в свои RSS-каналы в течение 10-15 минут, потому что я всегда нахожу по крайней мере пару ошибок в моем тексте. Другие виды использования – в случае, если вы хотите, чтобы контент был эксклюзивным для вашего сайта в течение дня или недели, прежде чем выталкивать его для ваших читателей RSS.

 // delay feed update function publish_later_on_feed($where) { global $wpdb; if (is_feed()) { // timestamp in WP-format $now = gmdate('Ymd H:i:s'); // value for wait; + device $wait = '10'; // integer // http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_timestampdiff $device = 'MINUTE'; // MINUTE, HOUR, DAY, WEEK, MONTH, YEAR // add SQL-sytax to default $where $where .= " AND TIMESTAMPDIFF($device, $wpdb->posts.post_date_gmt, '$now') > $wait "; } return $where; } add_filter('posts_where', 'publish_later_on_feed'); 

Инструменты профайла WordPress

Мне нравится добавлять инструменты профилирования в отдельный файл, который затем включается из functions.php при необходимости:

 <?php if ( !defined('SAVEQUERIES') && isset($_GET['debug']) && $_GET['debug'] == 'sql' ) define('SAVEQUERIES', true); if ( !function_exists('dump') ) : /** * dump() * * @param mixed $in * @return mixed $in **/ function dump($in = null) { echo '<pre style="margin-left: 0px; margin-right: 0px; padding: 10px; border: solid 1px black; background-color: ghostwhite; color: black; text-align: left;">'; foreach ( func_get_args() as $var ) { echo "\n"; if ( is_string($var) ) { echo "$var\n"; } else { var_dump($var); } } echo '</pre>' . "\n"; return $in; } # dump() endif; /** * add_stop() * * @param mixed $in * @param string $where * @return mixed $in **/ function add_stop($in = null, $where = null) { global $sem_stops; global $wp_object_cache; $queries = get_num_queries(); $milliseconds = timer_stop() * 1000; $out = "$queries queries - {$milliseconds}ms"; if ( function_exists('memory_get_usage') ) { $memory = number_format(memory_get_usage() / ( 1024 * 1024 ), 1); $out .= " - {$memory}MB"; } $out .= " - $wp_object_cache->cache_hits cache hits / " . ( $wp_object_cache->cache_hits + $wp_object_cache->cache_misses ); if ( $where ) { $sem_stops[$where] = $out; } else { dump($out); } return $in; } # add_stop() /** * dump_stops() * * @param mixed $in * @return mixed $in **/ function dump_stops($in = null) { if ( $_POST ) return $in; global $sem_stops; global $wp_object_cache; $stops = ''; foreach ( $sem_stops as $where => $stop ) $stops .= "$where: $stop\n"; dump("\n" . trim($stops) . "\n"); if ( defined('SAVEQUERIES') && $_GET['debug'] == 'sql' ) { global $wpdb; foreach ( $wpdb->queries as $key => $data ) { $query = rtrim($data[0]); $duration = number_format($data[1] * 1000, 1) . 'ms'; $loc = trim($data[2]); $loc = preg_replace("/(require|include)(_once)?,\s*/ix", '', $loc); $loc = "\n" . preg_replace("/,\s*/", ",\n", $loc) . "\n"; dump($query, $duration, $loc); } } if ( $_GET['debug'] == 'cache' ) dump($wp_object_cache->cache); if ( $_GET['debug'] == 'cron' ) { $crons = get_option('cron'); foreach ( $crons as $time => $_crons ) { if ( !is_array($_crons) ) continue; foreach ( $_crons as $event => $_cron ) { foreach ( $_cron as $details ) { $date = date('Ymd H:m:i', $time); $schedule = isset($details['schedule']) ? "({$details['schedule']})" : ''; if ( $details['args'] ) dump("$date: $event $schedule", $details['args']); else dump("$date: $event $schedule"); } } } } return $in; } # dump_stops() add_action('init', create_function('$in', ' return add_stop($in, "Load"); '), 10000000); add_action('template_redirect', create_function('$in', ' return add_stop($in, "Query"); '), -10000000); add_action('wp_footer', create_function('$in', ' return add_stop($in, "Display"); '), 10000000); add_action('admin_footer', create_function('$in', ' return add_stop($in, "Display"); '), 10000000); /** * init_dump() * * @return void **/ function init_dump() { global $hook_suffix; if ( !is_admin() || empty($hook_suffix) ) { add_action('wp_footer', 'dump_stops', 10000000); add_action('admin_footer', 'dump_stops', 10000000); } else { add_action('wp_footer', 'dump_stops', 10000000); add_action("admin_footer-$hook_suffix", 'dump_stops', 10000000); } } # init_dump() add_action('wp_print_scripts', 'init_dump'); /** * dump_phpinfo() * * @return void **/ function dump_phpinfo() { if ( isset($_GET['debug']) && $_GET['debug'] == 'phpinfo' ) { phpinfo(); die; } } # dump_phpinfo() add_action('init', 'dump_phpinfo'); /** * dump_http() * * @param array $args * @param string $url * @return array $args **/ function dump_http($args, $url) { dump(preg_replace("|/[0-9a-f]{32}/?$|", '', $url)); return $args; } # dump_http() /** * dump_trace() * * @return void **/ function dump_trace() { $backtrace = debug_backtrace(); foreach ( $backtrace as $trace ) dump( 'File/Line: ' . $trace['file'] . ', ' . $trace['line'], 'Function / Class: ' . $trace['function'] . ', ' . $trace['class'] ); } # dump_trace() if ( $_GET['debug'] == 'http' ) add_filter('http_request_args', 'dump_http', 0, 2); ?> 

Установите максимальное количество почтовых изменений, чтобы избежать раздувания DB.

Проверено на: WordPress 3.0.1

Значение по умолчанию бесконечно, это заставит его запомнить только последние 5 изменений:

 /** * Set the post revisions unless the constant was set in wp-config.php */ if (!defined('WP_POST_REVISIONS')) define('WP_POST_REVISIONS', 5); 

FWIW есть тонна отличных идей для CONSTANTS, которые можно установить на странице Codex. Редактирование wp-config.php .

Удалить метаподы WordPress по умолчанию

Проверено на: WordPress 3.0.1

Этот код позволит вам удалить определенные мета-поля, которые WordPress добавляет по умолчанию к окнам Add / Edit Post и Add / Edit Page.

 // REMOVE META BOXES FROM DEFAULT POSTS SCREEN function remove_default_post_screen_metaboxes() { remove_meta_box( 'postcustom','post','normal' ); // Custom Fields Metabox remove_meta_box( 'postexcerpt','post','normal' ); // Excerpt Metabox remove_meta_box( 'commentstatusdiv','post','normal' ); // Comments Metabox remove_meta_box( 'trackbacksdiv','post','normal' ); // Talkback Metabox remove_meta_box( 'slugdiv','post','normal' ); // Slug Metabox remove_meta_box( 'authordiv','post','normal' ); // Author Metabox } add_action('admin_menu','remove_default_post_screen_metaboxes'); // REMOVE META BOXES FROM DEFAULT PAGES SCREEN function remove_default_page_screen_metaboxes() { remove_meta_box( 'postcustom','page','normal' ); // Custom Fields Metabox remove_meta_box( 'postexcerpt','page','normal' ); // Excerpt Metabox remove_meta_box( 'commentstatusdiv','page','normal' ); // Comments Metabox remove_meta_box( 'trackbacksdiv','page','normal' ); // Talkback Metabox remove_meta_box( 'slugdiv','page','normal' ); // Slug Metabox remove_meta_box( 'authordiv','page','normal' ); // Author Metabox } add_action('admin_menu','remove_default_page_screen_metaboxes'); 

Sharpen Resized Images (только jpg)

Эта функция повышает резкость изображений jpg. Пример разницы: http://dl.dropbox.com/u/1652601/forrst/gdsharpen.png

 function ajx_sharpen_resized_files( $resized_file ) { $image = wp_load_image( $resized_file ); if ( !is_resource( $image ) ) return new WP_Error( 'error_loading_image', $image, $file ); $size = @getimagesize( $resized_file ); if ( !$size ) return new WP_Error('invalid_image', __('Could not read image size'), $file); list($orig_w, $orig_h, $orig_type) = $size; switch ( $orig_type ) { case IMAGETYPE_JPEG: $matrix = array( array(-1, -1, -1), array(-1, 16, -1), array(-1, -1, -1), ); $divisor = array_sum(array_map('array_sum', $matrix)); $offset = 0; imageconvolution($image, $matrix, $divisor, $offset); imagejpeg($image, $resized_file,apply_filters( 'jpeg_quality', 90, 'edit_image' )); break; case IMAGETYPE_PNG: return $resized_file; case IMAGETYPE_GIF: return $resized_file; } return $resized_file; } add_filter('image_make_intermediate_size', 'ajx_sharpen_resized_files',900); 

Удалите «Wordpress» в фильтр «WordPress»

Проверено на: WordPress 3.0.1

Был добавлен фильтр с WordPress версии 3.0, который автоматически преобразует все экземпляры «Wordpress» (без капитала P) в «WordPress» (с капиталом P) в пост-контент, пост-заголовки и текст комментария. Некоторые люди считают это навязчивым, мне просто нужно время от времени ошибаться в WordPress и считаю фильтр несколько раздражающим.

 // Remove annoying P filter if(function_exists('capital_P_dangit')) { foreach ( array( 'the_content', 'the_title' ) as $filter ) remove_filter( $filter, 'capital_P_dangit', 11 ); remove_filter('comment_text', 'capital_P_dangit', 31 ); } 

Настроить панель инструментов

 add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets'); function my_custom_dashboard_widgets() { global $wp_meta_boxes; 

Удалите эти виджеты панели управления …

  unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']); unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']); unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']); не  unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']); unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']); unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']); не  unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']); unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']); unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']); 

Добавьте собственный виджет под названием «Справка и поддержка»,

  wp_add_dashboard_widget('custom_help_widget', 'Help and Support', 'custom_dashboard_help'); } 

Это содержимое вашего пользовательского виджета

  function custom_dashboard_help() { echo '<p>Lorum ipsum delor sit amet et nunc</p>'; } 

Добавление полей пользовательского профиля пользователя

Поместите код ниже в файл functions.php, чтобы добавить пользовательские поля профиля пользователя. Редактируйте или добавьте строки по своему усмотрению.

Не забудьте удалить строку: return $ contactmethods; иначе это не сработает.

 // CUSTOM USER PROFILE FIELDS function my_custom_userfields( $contactmethods ) { // ADD CONTACT CUSTOM FIELDS $contactmethods['contact_phone_office'] = 'Office Phone'; $contactmethods['contact_phone_mobile'] = 'Mobile Phone'; $contactmethods['contact_office_fax'] = 'Office Fax'; // ADD ADDRESS CUSTOM FIELDS $contactmethods['address_line_1'] = 'Address Line 1'; $contactmethods['address_line_2'] = 'Address Line 2 (optional)'; $contactmethods['address_city'] = 'City'; $contactmethods['address_state'] = 'State'; $contactmethods['address_zipcode'] = 'Zipcode'; return $contactmethods; } add_filter('user_contactmethods','my_custom_userfields',10,1); 

Чтобы отобразить настраиваемые поля, вы можете использовать один из двух методов, перечисленных ниже.

Опция 1:

 the_author_meta('facebook', $current_author->ID) 

Вариант 2:

 <?php $current_author = get_userdata(get_query_var('author')); ?> <p><a href="<?php echo esc_url($current_author->contact_phone_office);?>" title="office_phone"> Office Phone</a></p> 

Настроить порядок меню администратора

проверено на: WordPress 3.0.1

Этот код позволит вам реорганизовать порядок элементов в меню администратора. Все, что вам нужно сделать, это нажать на существующую ссылку в меню администратора и скопировать все до / wp-admin / URL. Ниже представлен порядок, который будет иметь новое меню администратора.

 // CUSTOMIZE ADMIN MENU ORDER function custom_menu_order($menu_ord) { if (!$menu_ord) return true; return array( 'index.php', // this represents the dashboard link 'edit.php?post_type=events', // this is a custom post type menu 'edit.php?post_type=news', 'edit.php?post_type=articles', 'edit.php?post_type=faqs', 'edit.php?post_type=mentors', 'edit.php?post_type=testimonials', 'edit.php?post_type=services', 'edit.php?post_type=page', // this is the default page menu 'edit.php', // this is the default POST admin menu ); } add_filter('custom_menu_order', 'custom_menu_order'); add_filter('menu_order', 'custom_menu_order'); 

Добавить миниатюры в Управление сообщениями / Список страниц

Вы можете добавить это в свои функции, чтобы отобразить на странице «Управление / Редактировать сообщение» и «Страницы» новый столбец с предварительным просмотром миниатюр.

 /****** Add Thumbnails in Manage Posts/Pages List ******/ if ( !function_exists('AddThumbColumn') && function_exists('add_theme_support') ) { // for post and page add_theme_support('post-thumbnails', array( 'post', 'page' ) ); function AddThumbColumn($cols) { $cols['thumbnail'] = __('Thumbnail'); return $cols; } function AddThumbValue($column_name, $post_id) { $width = (int) 35; $height = (int) 35; if ( 'thumbnail' == $column_name ) { // thumbnail of WP 2.9 $thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true ); // image from gallery $attachments = get_children( array('post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image') ); if ($thumbnail_id) $thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true ); elseif ($attachments) { foreach ( $attachments as $attachment_id => $attachment ) { $thumb = wp_get_attachment_image( $attachment_id, array($width, $height), true ); } } if ( isset($thumb) && $thumb ) { echo $thumb; } else { echo __('None'); } } } // for posts add_filter( 'manage_posts_columns', 'AddThumbColumn' ); add_action( 'manage_posts_custom_column', 'AddThumbValue', 10, 2 ); // for pages add_filter( 'manage_pages_columns', 'AddThumbColumn' ); add_action( 'manage_pages_custom_column', 'AddThumbValue', 10, 2 ); } 

Function to change the length of Exerpt

Tested on: WordPress 3.0.1

By default all excerpts are capped at 55 words. Utilizing the code below you can override this default settings:

 function new_excerpt_length($length) { return 100; } add_filter('excerpt_length', 'new_excerpt_length'); 

This example changes the excerpt length to 100 words, but you can use the same method to change it to any value.

Remove pings to your own blog

Tested on: WordPress 3.0.1

 //remove pings to self function no_self_ping( &$links ) { $home = get_option( 'home' ); foreach ( $links as $l => $link ) if ( 0 === strpos( $link, $home ) ) unset($links[$l]); } add_action( 'pre_ping', 'no_self_ping' ); 

Enable GZIP output compression

Normally the server should be set up to do this automatically, but a lot of shared hosts don t do this (probably to increase client bandwidth usage)

  if(extension_loaded("zlib") && (ini_get("output_handler") != "ob_gzhandler")) add_action('wp', create_function('', '@ob_end_clean();@ini_set("zlib.output_compression", 1);')); 

Auto Extract the First Image from the Post Content

Tested on: WordPress 3.0.1

This code will automatically extract the first image associated with a post and allow you to display/use it by calling the getImage function.

 // AUTOMATICALLY EXTRACT THE FIRST IMAGE FROM THE POST function getImage($num) { global $more; $more = 1; $link = get_permalink(); $content = get_the_content(); $count = substr_count($content, '<img'); $start = 0; for($i=1;$i<=$count;$i++) { $imgBeg = strpos($content, '<img', $start); $post = substr($content, $imgBeg); $imgEnd = strpos($post, '>'); $postOutput = substr($post, 0, $imgEnd+1); $postOutput = preg_replace('/width="([0-9]*)" height="([0-9]*)"/', '',$postOutput);; $image[$i] = $postOutput; $start=$imgEnd+1; } if(stristr($image[$num],'<img')) { echo '<a href="'.$link.'">'.$image[$num]."</a>"; } $more = 0; } 

Display DB Queries, Time Spent and Memory Consumption

Tested on: WordPress 3.0.1

 function performance( $visible = false ) { $stat = sprintf( '%d queries in %.3f seconds, using %.2fMB memory', get_num_queries(), timer_stop( 0, 3 ), memory_get_peak_usage() / 1024 / 1024 ); echo $visible ? $stat : "<!-- {$stat} -->" ; } 

Then this code below the code above which will automatically insert the code above into the footer of your public website (make sure your theme is calling wp_footer):

 add_action( 'wp_footer', 'performance', 20 ); 

Can be called multiple times.

Unregister WP Default Widgets

Tested on: WordPress 3.0.1

 // unregister all default WP Widgets function unregister_default_wp_widgets() { unregister_widget('WP_Widget_Pages'); unregister_widget('WP_Widget_Calendar'); unregister_widget('WP_Widget_Archives'); unregister_widget('WP_Widget_Links'); unregister_widget('WP_Widget_Meta'); unregister_widget('WP_Widget_Search'); unregister_widget('WP_Widget_Text'); unregister_widget('WP_Widget_Categories'); unregister_widget('WP_Widget_Recent_Posts'); unregister_widget('WP_Widget_Recent_Comments'); unregister_widget('WP_Widget_RSS'); unregister_widget('WP_Widget_Tag_Cloud'); } add_action('widgets_init', 'unregister_default_wp_widgets', 1); 

Output which theme template file a post/page is using in the header

 add_action('wp_head', 'show_template'); function show_template() { global $template; print_r($template); } 

Shorten the default DIV output if your theme is using post_class.

if your theme is using something like

 <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>> 

You can have crazy long divs in your source that might look like this or even longer:

 <div id="post-4" class="post-4 post type-post hentry category-uncategorized category-test category-test-1-billion category-test2 category-test3 category-testing"> 

This can really start to clutter your source and seem rather unnecessary in most cases, going 3-4 deep is good enough.

For the top example we can slice the output like so:

 // slice crazy long div outputs function category_id_class($classes) { global $post; foreach((get_the_category($post->ID)) as $category) $classes[] = $category->category_nicename; return array_slice($classes, 0,5); } add_filter('post_class', 'category_id_class'); 

this slices the output to only include the first 5 values, so the above example becomes:

 <div id="post-4" class="post-4 post type-post hentry category-uncategorized"> 

Make category archives display all posts, regardless of post type: good for custom post types

 function any_ptype_on_cat($request) { if ( isset($request['category_name']) ) $request['post_type'] = 'any'; return $request; } add_filter('request', 'any_ptype_on_cat'); 

Remove unwanted dashboard items

This was already posted but it did not have the full list of items. Especially those annoying "incoming links!"

 add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets'); function my_custom_dashboard_widgets() { global $wp_meta_boxes; //Right Now - Comments, Posts, Pages at a glance unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']); //Recent Comments unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']); //Incoming Links unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']); //Plugins - Popular, New and Recently updated WordPress Plugins unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']); //Wordpress Development Blog Feed unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']); //Other WordPress News Feed unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']); //Quick Press Form unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']); //Recent Drafts List unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']); } 

Remove "Read More" page jumps**

instead return to the top of the page. You know how when you click "read more" it will jump to the spot in the page which can be annoying, this makes it just load the page normally, no jumping!

 function remove_more_jump_link($link) { $offset = strpos($link, '#more-'); if ($offset) { $end = strpos($link, '"',$offset); } if ($end) { $link = substr_replace($link, '', $offset, $end-$offset); } return $link; } add_filter('the_content_more_link', 'remove_more_jump_link'); 

Restrict ADMIN menu items based on username , replace username with an actual user's name.

 function remove_menus() { global $menu; global $current_user; get_currentuserinfo(); if($current_user->user_login == 'username') { $restricted = array(__('Posts'), __('Media'), __('Links'), __('Pages'), __('Comments'), __('Appearance'), __('Plugins'), __('Users'), __('Tools'), __('Settings') ); end ($menu); while (prev($menu)){ $value = explode(' ',$menu[key($menu)][0]); if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);} }// end while }// end if } add_action('admin_menu', 'remove_menus'); 

//alternatively you can use if($current_user->user_login != 'admin') instead, probably more useful

Style the tag cloud

 //tag cloud custom add_filter('widget_tag_cloud_args','style_tags'); function style_tags($args) { $args = array( 'largest' => '10', 'smallest' => '10', 'format' => 'list', ); return $args; } 

Full reference of options here ( there are a lot!) http://codex.wordpress.org/Function_Reference/wp_tag_cloud

Change Default RSS Widget update timer

( default is 6 or 12 hours I forget (1800 =30min).

 add_filter( 'wp_feed_cache_transient_lifetime', create_function('$fixrss', 'return 1800;') ); 

Remove Plugin Update Notice ONLY for INACTIVE plugins

 function update_active_plugins($value = '') { /* The $value array passed in contains the list of plugins with time marks when the last time the groups was checked for version match The $value->reponse node contains an array of the items that are out of date. This response node is use by the 'Plugins' menu for example to indicate there are updates. Also on the actual plugins listing to provide the yellow box below a given plugin to indicate action is needed by the user. */ if ((isset($value->response)) && (count($value->response))) { // Get the list cut current active plugins $active_plugins = get_option('active_plugins'); if ($active_plugins) { // Here we start to compare the $value->response // items checking each against the active plugins list. foreach($value->response as $plugin_idx => $plugin_item) { // If the response item is not an active plugin then remove it. // This will prevent WordPress from indicating the plugin needs update actions. if (!in_array($plugin_idx, $active_plugins)) unset($value->response[$plugin_idx]); } } else { // If no active plugins then ignore the inactive out of date ones. foreach($value->response as $plugin_idx => $plugin_item) { unset($value->response); } } } return $value; } add_filter('transient_update_plugins', 'update_active_plugins'); // Hook for 2.8.+ //add_filter( 'option_update_plugins', 'update_active_plugins'); // Hook for 2.7.x 

Remove superfluous info and HTML within the <head> tag

 // remove unnecessary header info add_action( 'init', 'remove_header_info' ); function remove_header_info() { remove_action( 'wp_head', 'rsd_link' ); remove_action( 'wp_head', 'wlwmanifest_link' ); remove_action( 'wp_head', 'wp_generator' ); remove_action( 'wp_head', 'start_post_rel_link' ); remove_action( 'wp_head', 'index_rel_link' ); remove_action( 'wp_head', 'adjacent_posts_rel_link' ); // for WordPress < 3.0 remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' ); // for WordPress >= 3.0 } // remove extra CSS that 'Recent Comments' widget injects add_action( 'widgets_init', 'remove_recent_comments_style' ); function remove_recent_comments_style() { global $wp_widget_factory; remove_action( 'wp_head', array( $wp_widget_factory->widgets['WP_Widget_Recent_Comments'], 'recent_comments_style' ) ); } 

Enable Error Debugging And Logging To Use On Live Sites

This is a piece of code I wrote to make use of the WP_DEBUG constants that are normally disabled by default. Well I created a way to not only enable WP_DEBUG so you can use it on a live site with no negative side-effects, but I also made use of the other debugging constants for forcing errors to be displayed, and for creating a log file of the errors and Notices in the /wp-content directory.

Drop this code in your wp-config.php file ( AFTER YOU SAVE A BACKUP JUST IN CASE ) and then you can pass the ?debug=1, 2, or 3 parameters at the end of any url on your site.

?debug=1 = shows all errors/notices ?debug=2 = forces them to be displayed ?debug=3 = creates a debug.log file of all errors in /wp-content dir.

 /** * Written by Jared Williams - http://new2wp.com * @wp-config.php replace WP_DEBUG constant with this code * Enable WP debugging for usage on a live site * http://core.trac.wordpress.org/browser/trunk/wp-includes/load.php#L230 * Pass the '?debug=#' parameter at the end of any url on site * * http://example.com/?debug=1, /?debug=2, /?debug=3 */ if ( isset($_GET['debug']) && $_GET['debug'] == '1' ) { // enable the reporting of notices during development - E_ALL define('WP_DEBUG', true); } elseif ( isset($_GET['debug']) && $_GET['debug'] == '2' ) { // must be true for WP_DEBUG_DISPLAY to work define('WP_DEBUG', true); // force the display of errors define('WP_DEBUG_DISPLAY', true); } elseif ( isset($_GET['debug']) && $_GET['debug'] == '3' ) { // must be true for WP_DEBUG_LOG to work define('WP_DEBUG', true); // log errors to debug.log in the wp-content directory define('WP_DEBUG_LOG', true); } 

I go into more detail on the guest post I wrote for Comluv if you're interested, here: http://comluv.com/dev/enable-debugging-and-logging-for-live-site-usage/

I'm still working on a way to make this either password protected, or preferrably somehow make it work on if (current_user_can('manage_themes') and is_logged_in().

But that's where it gets alot more tricky.

New Roles and Capabilities – Only run once!

I keep these handy, this is the right way to do them without a plugin. They set a single field (prefix_user_roles) in the options database, and you don't need a plugin to set them. Refer to the Codex page for a list of what capabilities are available and descriptions for what they do. You only need to uncomment one of these blocks, load any page and then comment them again! Here I'm creating a role that's got the capabilities I need:

 /* Capabilities */ // To add the new role, using 'international' as the short name and // 'International Blogger' as the displayed name in the User list and edit page: /* add_role('international', 'International Blogger', array( 'read' => true, // True allows that capability, False specifically removes it. 'edit_posts' => true, 'delete_posts' => true, 'edit_published_posts' => true, 'publish_posts' => true, 'edit_files' => true, 'import' => true, 'upload_files' => true //last in array needs no comma! )); */ // To remove one outright or remove one of the defaults: /* remove_role('international'); */ 

It's sometimes handy to add/remove from an existing role rather than removing and re-adding one. Again, you only need to uncomment it, reload a page and then comment it again. This will store the role/capability properly in the options table. (This allows you, the developer to control them and removes the overhead of the bulky plugins that do the same thing.) Here I'm changing the author role to delete their published posts (the default), but allowing them the capability to edit their published posts (which isn't possible for this role by default)– using *add_cap* or *remove_cap*.

 /* $edit_role = get_role('author'); $edit_role->add_cap('edit_published_posts'); $edit_role->remove_cap('delete_published_posts'); */ 

I keep a spreadsheet with the grid from the Codex page for sites that modify this way, so I can remember how things are set, though leaving the commented out code in your functions.php file will work to. Don't leave these examples uncommented, or it will write to the database with each page load!

Automatically Add Dynamic Titles to Public Pages

Tested on: WordPress 3.0.1

Utilizing the code below will automatically create dynamic page titles based upon the pages/posts being viewed publicly.

 /* Dynamic Titles **/ // This sets your <title> depending on what page you're on, for better formatting and for SEO // You need to set the variable $longd to some custom text at the beginning of the function function dynamictitles() { $longd = __('Enter your longdescription here.', 'texdomainstring'); if ( is_single() ) { wp_title(''); echo ' | '.get_bloginfo('name'); } else if ( is_page() || is_paged() ) { bloginfo('name'); wp_title('|'); } else if ( is_author() ) { bloginfo('name'); wp_title(' | '.__('Author', 'texdomainstring')); } else if ( is_category() ) { bloginfo('name'); wp_title(' | '.__('Archive for', 'texdomainstring')); } else if ( is_tag() ) { echo get_bloginfo('name').' | '.__('Tag archive for', 'texdomainstring'); wp_title(''); } else if ( is_archive() ) { echo get_bloginfo('name').' | '.__('Archive for', 'texdomainstring'); wp_title(''); } else if ( is_search() ) { echo get_bloginfo('name').' | '.__('Search Results', 'texdomainstring'); } else if ( is_404() ) { echo get_bloginfo('name').' | '.__('404 Error (Page Not Found)', 'texdomainstring'); } else if ( is_home() ) { echo get_bloginfo('name').' | '.get_bloginfo('description'); } else { echo get_bloginfo('name').' | '.($blog_longd); } } 

WordPress Custom Admin Footer

// customize admin footer text
function custom_admin_footer() {
        echo 'add your custom footer text and html here';
 } 
add_filter('admin_footer_text', 'custom_admin_footer');

I use this for client sites as a simple point of reference to contact me as the dev.

Enable shortcodes in widgets

 // shortcode in widgets if ( !is_admin() ){ add_filter('widget_text', 'do_shortcode', 11); } 

Function to Disable RSS Feeds

Tested on: WordPress 3.0.1

You can disable RSS feeds If you want to maintain your WordPress based website as static.

You can Use this function :

 function fb_disable_feed() { wp_die( __('No feed available,please visit our <a href="'. get_bloginfo('url') .'">homepage</a>!') ); } add_action('do_feed', 'fb_disable_feed', 1); add_action('do_feed_rdf', 'fb_disable_feed', 1); add_action('do_feed_rss', 'fb_disable_feed', 1); add_action('do_feed_rss2', 'fb_disable_feed', 1); add_action('do_feed_atom', 'fb_disable_feed', 1); 

Change the "Howdy" message to "Welcome"

With this function you can customize the "Howdy" message in top right of your admin area.
This function make use of JQuery to change the "Howdy" message to "Welcome".

 /****** Customize admin message "Howdy" to "Welcome" ******/ $nohowdy = "Welcome"; if (is_admin()) { add_action('init', 'artdev_nohowdy_h'); add_action('admin_footer', 'artdev_nohowdy_f'); } // Load jQuery function artdev_nohowdy_h() { wp_enqueue_script('jquery'); } // Modify function artdev_nohowdy_f() { global $nohowdy; echo <<<JS <script type="text/javascript"> //<![CDATA[ var nohowdy = "$nohowdy"; jQuery('#user_info p') .html( jQuery('#user_info p') .html() .replace(/Howdy/,nohowdy) ); //]]> JS; } 

PHP version, using gettext filter:

 add_filter('gettext', 'change_howdy', 10, 3); function change_howdy($translated, $text, $domain) { if (!is_admin() || 'default' != $domain) return $translated; if (false !== strpos($translated, 'Howdy')) return str_replace('Howdy', 'Welcome', $translated); return $translated; }