La migliore raccolta di codice per il tuo file 'functions.php'
Come molti altri che stanno leggendo questo post, ho trascorso del tempo a leggere vari blog, forum e gruppi di discussione per imparare e migliorare le mie competenze WordPress. Negli ultimi 12 mesi mi sono impegnato nella missione di sostituire l'uso dei plugin aggiungendo invece il codice al mio file functions.php
.
Sebbene sia completamente d'accordo che i plugin siano molto utili in molte situazioni, la mia esperienza ha dimostrato che nel 90% dei casi, anche se un plugin potrebbe esistere, il suo utilizzo effettivo potrebbe creare complicazioni non necessarie e problemi di compatibilità. Inoltre, in molti casi questi plugin aggiungevano menu e altri elementi amministrativi che non desidero o di cui non ho bisogno.
Molto spesso ho scoperto che analizzando il codice dei plugin sono stato in grado di estrarre la parte di codice che volevo e inserirla direttamente nel mio functions.php
. Questo mi ha fornito esattamente la funzionalità di cui avevo bisogno senza dover includere elementi non necessari.
Quindi, lo scopo di questo post è il mio tentativo di coinvolgere voi, lettori/amministratori/sviluppatori, per condividere con me e con altri qui qualsiasi frammento di codice che trovate utile e che avete aggiunto al file functions.php
del vostro tema per estendere o migliorare WordPress senza utilizzare un plugin.
Quando inviate una risposta qui, vi prego gentilmente di dare un titolo a ogni frammento di codice, farci sapere con quale versione di WordPress sapete che è compatibile, includere qualsiasi descrizione che ritenete descriva al meglio la sua funzione e (se applicabile) includere un link al plugin originale o alla fonte dove avete trovato l'informazione.
Non vedo l'ora di leggere tutte le vostre risposte e naturalmente continuerò ad aggiungere le mie nuove scoperte ogni volta che le troverò.
Vi preghiamo di votare la domanda e qualsiasi risposta che trovate utile cliccando sulla freccia su sul lato sinistro della domanda o risposta.

Aggiunta automatica di immagini di intestazione dalla directory
All'interno del tema predefinito che viene fornito con WordPress noterai un menu del tema aggiuntivo che si attiva e ti permette di selezionare un'immagine di intestazione da utilizzare. Nel codice del tema predefinito queste immagini sono hardcoded nel file functions.php. Il codice seguente permette a WordPress di rilevare automaticamente nuove immagini basandosi su una specifica directory per le immagini di intestazione che puoi creare sul tuo server (o all'interno della cartella del tuo tema).
Includerà automaticamente qualsiasi file .jpg o .jpeg. Ogni immagine deve avere un file thumbnail associato, ma questo può essere semplicemente una copia dell'originale con un nome diverso che deve terminare con "-thumbnail". Il nome associato viene utilizzato come descrizione nelle impostazioni di aspetto delle intestazioni e gli underscore vengono automaticamente sostituiti con spazi. (es. My_Header_Image_A.jpg, My_Header_Image_A-thumbnail.jpg avrà una descrizione presentata automaticamente come "My Header Image A")
if ($handle = opendir( TEMPLATEPATH . '/images/headers/') ) {
$headers = array();
while (false !== ($file = readdir($handle))) {
$pos = strrpos( $file, '.' );
if( $pos !== false && $pos > 0 ) {
$file_name = substr( $file, 0, $pos );
if( strpos( $file_name, "-thumbnail" ) === false ) {
$file_ext = substr( $file, $pos+1 );
$file_ext_low = strtolower( $file_ext );
if( $file_ext_low == "jpg" || $file_ext_low == "jpeg" ) {
$headers[$file_name] = array (
'url' => '%s/images/headers/' . $file,
'thumbnail_url' => '%s/images/headers/' . $file_name ."-thumbnail." . $file_ext,
'description' => __( str_replace( "_", " ", $file_name ), 'twentyten' )
);
}
}
}
}
closedir($handle);
register_default_headers( $headers );
}

Visualizzare informazioni per gli utenti loggati
if ( is_user_logged_in() ) {
}
non funziona nel file functions.php. Puoi usare questo codice:
if ( !function_exists('is_user_logged_in') ) :
function is_user_logged_in() {
$user = wp_get_current_user();
if ( $user->id == 0 ){
// Questa sezione se l'utente non è loggato
} else {
// Questa sezione se l'utente è loggato
}
}
endif;

Logo personalizzati per la pagina di Login e Admin
/*-----------------------------------------------------------------------------------*/
/* Logo personalizzati
/*-----------------------------------------------------------------------------------*/
function custom_admin_logo() {
echo '
<style type="text/css">
#header-logo { background-image: url('.get_bloginfo('template_directory').'/percorso/alle/immagini/admin-logo.png) !important; }
</style>
';
}
add_action('admin_head', 'custom_admin_logo');
function custom_login_logo() {
echo '<style type="text/css">
h1 a { background-image:url('.get_bloginfo('template_directory').'/percorso/alle/immagini/login-logo.png) !important; }
</style>';
}
add_action('login_head', 'custom_login_logo');

Per favore dai un'occhiata a questo gist. Ci sono opzioni ancora migliori rispetto a quelle mostrate nel gist. Potresti anche provare a partecipare al ticket trac (link nell'intestazione del plugin gist).

Rimuovi l'Amministratore (Utente #1) dalla lista degli utenti
function your_pre_user_query($user_search) {
$user = wp_get_current_user();
if ($user->ID!=1) { // Se l'utente corrente non è l'amministratore principale (ID 1)
global $wpdb;
$user_search->query_where = str_replace('WHERE 1=1',
"WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where); // Esclude l'utente con ID 1 dai risultati
}
}
add_action('pre_user_query','your_pre_user_query'); // Aggiunge l'azione al hook pre_user_query

Ancora: l'utente 1 potrebbe non essere un amministratore. Vedi Ruoli e Capacità.

È un esempio. Inoltre, nelle installazioni predefinite l'utente 1 è Amministratore - il primo utente creato. Questo è il motivo per cui ho evidenziato (Utente #1)

È un esempio che mostra come non verificare le capacità amministrative. Non dovresti usare questo codice in un sito web reale.

Esatto. Questo codice non verifica le capacità, toscho, ma un utente specifico. Questo codice non ha nulla a che fare con le capacità e non ho menzionato le capacità da nessuna parte. Non vedo perché questo non possa essere utilizzato su siti in produzione.

@Daniel Sachs Se stai cercando il primo amministratore mai aggiunto, per favore controlla prima i ruoli di tutti gli utenti, poi ordinali per ID e prendi il primo. Come ha detto @toscho: Attualmente è "un esempio di come non dovresti farlo". Motivi: a) l'amministratore effettivo potrebbe non essere quello con l'ID più basso b) Se qualcun altro lavorasse su questo, lei/lui non cercherebbe questa funzionalità in un tema.

Ottieni gli Attributi di una Miniatura Specifica
Utilizza questa funzione all'interno del loop per determinare larghezza, altezza e URL di un'immagine miniatura. Molto utile per assegnare un'immagine miniatura come elemento di sfondo tramite CSS inline.
/**
* OTTIENI GLI ATTRIBUTI DELLA MINIATURA
*
* Recupera larghezza, altezza e URI di una miniatura.
*
* @author Philip Downer <philip@manifestbozeman.com>
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version v1.0
*
* @param string $return Accetta 'path', 'width', o 'height'.
* @param string $size La dimensione della miniatura corrispondente alla {@link add_image_size() funzione core di WP}.
* @return mixed Restituisce le informazioni richieste, o se non è assegnata nessuna 'Immagine in Evidenza', restituisce 'false'.
*/
function get_thumb_attr($return,$size='thumbnail') {
global $post;
if (has_post_thumbnail($post->ID)) {
$thumb = wp_get_attachment_image_src(get_post_thumbnail_id(), 'intro');
if ( $return == 'path' ) { return $thumb[0]; }
if ( $return == 'width' ) { return $thumb[1]; }
if ( $return == 'height' ) { return $thumb[2]; }
} else {
return false;
}
}//end function

Visualizza il contenuto di un widget al di fuori del contesto di una sidebar utilizzando il suo ID. Il codice HTML di wrapping prima/dopo non è incluso. Devi conoscere l'ID specifico del widget che stai cercando (es. 'text-5').
function widget_contents($id) {
list($type,$number) = explode('-',$id);
global $wp_registered_widgets;
$wp_registered_widgets[$id]['callback'][0]->display_callback(array('widget_id'=>$id),$number);
}
Puoi controllare l'output di wp_get_sidebars_widgets() se non sei sicuro dell'ID preciso di cui hai bisogno.
Un esempio più completo tratto da /wp-includes/widgets.php sotto la funzione dynamic_sidebar():
function render_widget($id) {
global $wp_registered_widgets;
$params = array_merge(
array( array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ),
(array) $wp_registered_widgets[$id]['params']
);
$classname_ = '';
foreach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) {
if ( is_string($cn) )
$classname_ .= '_' . $cn;
elseif ( is_object($cn) )
$classname_ .= '_' . get_class($cn);
}
$classname_ = ltrim($classname_, '_');
$params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_);
if ( is_callable($wp_registered_widgets[$id]['callback']) )
call_user_func_array($wp_registered_widgets[$id]['callback'], $params);
}

Ops. Il metodo molto più semplice sarebbe usare the_widget()
http://codex.wordpress.org/Function_Reference/the_widget

Smiley personalizzati (plugin)
/**
* Smiley.
*/
function filter_smilies_src($img_src, $img, $siteurl) {
return plugins_url('', __FILE__) . '/img/smilies/' . $img;
}
add_filter('smilies_src', 'filter_smilies_src', 1, 10);
Smiley personalizzati (tema)
/**
* Smiley.
*/
function filter_smilies_src($img_src, $img, $siteurl) {
return get_bloginfo('stylesheet_directory') . '/images/smilies/' . $img;
}
add_filter('smilies_src', 'filter_smilies_src', 1, 10);

Riposizionare l'Editor WYSIWYG tramite JQUERY
Testato su: Wordpress 3.0.1
Questo codice ti permetterà di rimuovere specifici meta box che WordPress aggiunge di default nelle schermate di POST e PAGINE.
// RIPOSIZIONA L'EDITOR WYSIWYG TRAMITE JQUERY
add_action('admin_head','admin_head_hook');
function admin_head_hook() {
?><style type="text/css">
#postdiv.postarea, #postdivrich.postarea { margin:0; }
#post-status-info { line-height:1.4em; font-size:13px; }
.custom-wysiwyg-editor-container { margin:2px 6px 6px 6px; }
#ed_toolbar { display:none; }
#postdiv #ed_toolbar, #postdivrich #ed_toolbar { display:block; }
</style><?php
}
add_action('admin_footer','admin_footer_hook');
function admin_footer_hook() {
?><script type="text/javascript">
jQuery('#postdiv, #postdivrich').prependTo('.custom-wysiwyg-editor-container');
</script><?php
}

Chiudi automaticamente i tag mancanti dall'editor WYSIWYG
Testato su: WordPress 3.0.1
Questo codice chiuderà automaticamente eventuali tag mancanti quando si utilizza l'editor WYSIWYG.
// PULISCE AUTOMATICAMENTE L'HTML DELL'EDITOR WYSIWYG CHIUDENDO I TAG MANCANTI
function clean_bad_content($bPrint = false) {
global $post;
$szPostContent = $post->post_content;
$szRemoveFilter = array("~<p[^>]*>\s?</p>~", "~<a[^>]*>\s?</a>~", "~<font[^>]*>~", "~<\/font>~", "~style\=\"[^\"]*\"~", "~<span[^>]*>\s?</span>~");
$szPostContent = preg_replace($szRemoveFilter, '', $szPostContent);
$szPostContent = apply_filters('the_content', $szPostContent);
if ($bPrint == false) return $szPostContent;
else echo $szPostContent;
}

Rimuovi gli attributi role="search"
per get_search_form()
function remove_role_search($role)
{
$result = array();
preg_match_all('|role="[^"]*"|U', $role, $result);
foreach ($result[0] as $role_tag) {
$role = str_replace($role_tag, '', $role);
}
return $role;
}
add_filter('get_search_form', 'remove_role_search');

Aggiungi un Link di Login a wp_nav_menu
//AGGIUNGI LINK DI LOGIN/LOGOUT AL MENU
add_filter('wp_nav_menu_items', 'add_login_logout_link', 10, 2);
function add_login_logout_link($items, $args) {
$loginoutlink = wp_loginout('index.php', false);
$items .= '<li>'. $loginoutlink .'</li>';
return $items;
}

Modificare il nome del menu "Articoli" nell'area di amministrazione con quello che preferisci (es. "Articoli")
// aggancia i filtri di traduzione
add_filter('gettext','cambia_post_in_articolo');
add_filter('ngettext','cambia_post_in_articolo');
function cambia_post_in_articolo( $translated ) {
$translated = str_ireplace('Post','Articolo',$translated );// ireplace è disponibile solo da PHP5
return $translated;
}
Credits a smashingmagazine.com

Rimuovi la Voce di Menu Collegamenti
Molte delle mie installazioni WordPress non richiedono che gli utenti abbiano accesso alla voce di menu 'Collegamenti'. Questa funzione la rimuove dalla vista.
add_action( 'admin_menu', 'custom_admin_menu' );
function custom_admin_menu()
{
global $menu;
// var_dump($menu); // utilizza questo per identificare la chiave della voce di menu che vuoi rimuovere
unset( $menu[15] ); //la chiave 15 è collegamenti
if ( !current_user_can('manage_options') ) { unset( $menu[75] ); } //la chiave 75 è strumenti ... ma solo per i non super amministratori
}

A partire da WP 3.1, puoi anche usare remove_submenu_page
http://codex.wordpress.org/Function_Reference/remove_submenu_page

Disabilita il messaggio "Aggiorna ora" per gli utenti non amministratori
In realtà non sono un grande sostenitore di questo codice. Preferisco invece permettere ai clienti di aggiornare autonomamente le loro installazioni di WordPress. Questo aiuta a mantenere il sito aggiornato e mi obbliga a scrivere codice migliore.
if ( !current_user_can( 'manage_options' ) {
// Rimuove il controllo della versione WordPress per gli utenti non amministratori
add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
// Disabilita gli aggiornamenti core per gli utenti non amministratori
add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );
}

Aggiungi automaticamente un campo personalizzato nascosto e un valore associato a un articolo quando viene pubblicato
add_action('publish_page', 'add_custom_field_automatically');
add_action('publish_post', 'add_custom_field_automatically');
function add_custom_field_automatically($post_ID) {
global $wpdb;
if(!wp_is_post_revision($post_ID)) {
add_post_meta($post_ID, 'field-name', 'custom value', true);
}
}

Aggiungi una classe personalizzata ai link successivo e precedente
// Aggiunge un filtro per gli attributi dei link di navigazione "next" e "previous"
add_filter('next_posts_link_attributes', 'posts_link_attributes');
add_filter('previous_posts_link_attributes', 'posts_link_attributes');
// Funzione che restituisce la classe CSS personalizzata
function posts_link_attributes(){
return 'class="styled-button"';
}

Aggiungere tipi di post personalizzati alla pagina degli archivi
function namespace_add_custom_types( $query ) {
if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) ) {
$query->set( 'post_type', array(
'post', 'your-custom-post-type-here'
));
return $query;
}
}
add_filter( 'pre_get_posts', 'namespace_add_custom_types' );
