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.

Abilita la Funzione Nascosta di Amministrazione che mostra Tutte le Impostazioni del Sito
Testato su: WordPress 3.1 RC3
Questo piccolo codice fa qualcosa di piuttosto interessante. Aggiungerà un'opzione aggiuntiva al tuo menu delle impostazioni con un link a "tutte le impostazioni" che mostrerà una lista completa di tutte le impostazioni presenti nel tuo database relative al tuo sito WordPress. Il codice qui sotto renderà questo link visibile solo agli utenti amministratori e lo nasconderà per tutti gli altri utenti.
// LINK PERSONALIZZATO DEL MENU AMMINISTRATIVO PER TUTTE LE IMPOSTAZIONI
function all_settings_link() {
add_options_page(__('Tutte le Impostazioni'), __('Tutte le Impostazioni'), 'administrator', 'options.php');
}
add_action('admin_menu', 'all_settings_link');

Fantastico per lo sviluppo! Utilizzo spesso la tabella delle opzioni per memorizzare le versioni del database per i miei plug-in... usare phpMyAdmin per ripristinare una vecchia versione del database per testare uno script di aggiornamento è una scocciatura... questo lo renderà molto più semplice!!!

Modificare il Logo di Login e il Link dell'URL dell'Immagine
Testato su: WordPress 3.0.1
Questo codice ti permetterà di modificare facilmente il Logo della pagina di Login di WordPress, così come il link href e il testo del titolo di questo logo.
add_filter( 'login_headerurl', 'namespace_login_headerurl' );
/**
* Sostituisce l'URL del logo nell'header di login
*
* @param $url
*/
function namespace_login_headerurl( $url ) {
$url = home_url( '/' );
return $url;
}
add_filter( 'login_headertitle', 'namespace_login_headertitle' );
/**
* Sostituisce il titolo del logo nell'header di login
*
* @param $title
*/
function namespace_login_headertitle( $title ) {
$title = get_bloginfo( 'name' );
return $title;
}
add_action( 'login_head', 'namespace_login_style' );
/**
* Sostituisce il logo nell'header di login
*/
function namespace_login_style() {
echo '<style>.login h1 a { background-image: url( ' . get_template_directory_uri() . '/images/logo.png ) !important; }</style>';
}
MODIFICA: Se vuoi utilizzare il logo del sito per sostituire il logo di login, puoi usare il seguente codice per recuperare dinamicamente queste informazioni (testato su 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;
}

Includi i custom post type nei risultati di ricerca
// RENDI I CUSTOM POST TYPE RICERCABILI
function searchAll( $query ) {
if ( $query->is_search ) { $query->set( 'post_type', array( 'site', 'plugin', 'theme', 'person' )); }
return $query;
}
add_filter( 'the_search_query', 'searchAll' );
Aggiungi i tuoi custom post type al feed RSS principale del sito di default
// AGGIUNGI CUSTOM POST TYPE AL FEED RSS DEFAULT
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' );
Includi i custom post type nel widget "Right Now" della dashboard di amministrazione
Questo includerà i tuoi custom post type e il conteggio dei post per ogni tipo nel widget "Right Now" della dashboard.
// AGGIUNGI CUSTOM POST TYPE AL WIDGET 'RIGHT NOW' DELLA DASHBOARD
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' );

Riguardo all'ultimo snippet di questa risposta. È un'ottima aggiunta dato che li stavo aggiungendo manualmente per ogni tipo di post. L'unico problema che ho con questo è che aggiunge i dati dopo le voci predefinite "category" e "tag". Potresti aggiornare la tua risposta per spostare quelle predefinite "category" o "tag" più in basso o rimuoverle in modo che possano essere aggiunte manualmente?

@NetConstructor.com Non credo di aver capito la tua richiesta. Se l'ho capita, penso che sarebbe una cosa un po' più complicata da fare, e al momento non ho davvero il tempo di capire come farlo.

Rimuovi la notifica di aggiornamento per tutti gli utenti tranne l'utente ADMIN
Testato su: WordPress 3.0.1
Questo codice assicura che nessun utente diverso da "admin" riceva notifiche da WordPress quando sono disponibili aggiornamenti.
// RIMUOVE LA NOTIFICA DI AGGIORNAMENTO DI WORDPRESS PER TUTTI GLI UTENTI TRANNE L'AMMINISTRATORE
global $user_login;
get_currentuserinfo();
if ($user_login !== "admin") { // Cambia admin con il nome utente che deve ricevere gli aggiornamenti
add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );
}
Versione modificata per mostrare le notifiche di aggiornamento solo agli utenti admin (anziché solo all'utente 'admin'):
// RIMUOVE LA NOTIFICA DI AGGIORNAMENTO DI WORDPRESS PER TUTTI GLI UTENTI TRANNE L'AMMINISTRATORE
global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) { // Verifica se l'utente corrente può aggiornare i plugin
add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );
}

Questa soluzione è ben lontana dall'essere ideale. Funzionerà solo se il login dell'amministratore è ancora quello predefinito 'admin', che per motivi di sicurezza non dovrebbe esserlo. Invece dovresti verificare una specifica capability che vuoi che le persone abbiano per vedere i messaggi.

Ad esempio: if (!current_user_can('manage_options')) {...add_filter...} -- Scusa per il doppio commento, ho dimenticato che premere invio invia i commenti)

Ecco perché ho aggiunto il commento al codice dove puoi cambiare il nome utente dell'amministratore. Come lo miglioreresti/riscriveresti?

Il modo migliore è rimuovere il global $user_login e get_currentuserinfo() e invece usare current_user_can nella tua clausola if. È solo 1 riga invece di 3 ed è il modo standard. Puoi verificare la specifica capability necessaria per AGIRE sui messaggi, in questo caso ci sono 'update_core' e 'update_plugins'.

quindi: if (!current_user_can('update_plugins')) {/RIMUOVI MESSAGGI/}

@Jeremy Clarke quindi questo codice sarebbe il modo corretto di fare le cose? Ma, se volessi permettere solo a un username specifico di ricevere gli avvisi, il codice sopra sarebbe il modo migliore?
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;" )); }

Se volessi verificare un nome utente specifico, suppongo che il codice nella tua risposta originale sia accettabile, anche se potrebbe esserci un modo leggermente più efficace. Il codice completo usando la mia soluzione sarebbe come quello nel tuo ultimo commento. È lo stesso della tua risposta ma con il controllo current_user_can() invece di $user_login !== 'admin'.

Ho modificato la risposta e aggiunto la versione che usa current_user_can('update_plugins')

Ho appena provato i codici. Ma ottengo una pagina di errore se uso i codici. Lo stesso problema con entrambi i codici

Caricare jQuery dal CDN di Google
Testato su: WordPress 3.0.1
// Un modo ancora più intelligente per includere jQuery :)
add_action( 'init', 'jquery_register' );
// Registra da Google e per il 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' );
}
}
Rimuovere le informazioni sulla versione di WordPress per sicurezza
Testato su: WordPress 3.0.1
// Rimuove le informazioni sulla versione dall'head e dai feed
function complete_version_removal() {
return '';
}
add_filter('the_generator', 'complete_version_removal');
Aggiungere link Spam & Elimina ai commenti nel front end
Testato su: WordPress 3.0.1
Questo rende molto più semplice gestire i commenti dal front end aggiungendo link per segnalare come spam e eliminare.**
// Link Spam & elimina per tutte le versioni di 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.'">elimina</a> ';
echo '| <a href="'.get_bloginfo('wpurl').'/wp-admin/comment.php?action=cdc&dt=spam&c='.$id.'">spam</a>';
}
}
Ritardare la pubblicazione nei Feed RSS
Testato su: WordPress 3.0.1
Infine, mi piace ritardare la pubblicazione nei miei feed RSS di 10-15 minuti perché trovo sempre almeno un paio di errori nel mio testo. Altri utilizzi possono essere nel caso in cui si voglia che i contenuti siano esclusivi per il proprio sito per un giorno o una settimana prima di pubblicarli per i lettori RSS.
// Ritarda l'aggiornamento del feed
function publish_later_on_feed($where) {
global $wpdb;
if (is_feed()) {
// Timestamp nel formato WordPress
$now = gmdate('Y-m-d H:i:s');
// Valore di attesa; + unità
$wait = '10'; // intero
// http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_timestampdiff
$device = 'MINUTE'; // MINUTE, HOUR, DAY, WEEK, MONTH, YEAR
// Aggiunge la sintassi SQL al default $where
$where .= " AND TIMESTAMPDIFF($device, $wpdb->posts.post_date_gmt, '$now') > $wait ";
}
return $where;
}
add_filter('posts_where', 'publish_later_on_feed');

fonte sul mio post: http://wpengineer.com/320/publish-the-feed-later/ con ulteriori informazioni

Puoi anche semplicemente rimuovere il filtro del generatore: remove_action('wp_head', 'wp_generator');

Perché non usiamo il CDN di Google anche per l'admin? Non ho capito

@Derek Perkins - Puoi trasformare ciascuno di questi frammenti di codice in una risposta separata in modo che possano essere votati individualmente?

http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js scade dopo solo un'ora. Utilizza sempre la versione completa come http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js – che scade dopo un anno.

Puoi per favore suddividere ciascuna di queste voci wiki in voci separate nelle prossime settimane? Volevo farlo io, ma non volevo che sembrasse che sto cercando di prendere punti per informazioni che hai condiviso tu.

Il codice "Rimuovi le informazioni sulla versione di WordPress per la sicurezza" in realtà non fa nulla per aumentare la sicurezza del tuo sito. Non impedisce nemmeno l'esposizione della versione di WP utilizzata sul tuo sito.

Non è vero Joseph, se la tua versione di WordPress è esposta, le persone possono vedere se stai utilizzando una versione più vecchia, esponendo così le tue vulnerabilità. È sempre una buona decisione rimuoverlo da tutte le installazioni di WordPress. Personalmente, non capisco nemmeno perché l'abbiano inserito fin dall'inizio, dato che È un problema di sicurezza.

Imposta un numero massimo di revisioni dei post per evitare il gonfiamento del database.
Testato su: WordPress 3.0.1
Il valore predefinito è infinito, e questo codice lo imposterà per ricordare solo le ultime cinque modifiche:
/**
* Imposta le revisioni dei post a meno che la costante non sia già definita in wp-config.php
*/
if (!defined('WP_POST_REVISIONS')) define('WP_POST_REVISIONS', 5);
Per quel che vale, ci sono tantissime ottime idee per le COSTANTI che possono essere impostate nella pagina del Codex Modificare wp-config.php.

Esaminando il suo utilizzo in wp_save_post_revision() non sembra esserci un modo per distinguere in base ai tipi di post. Non c'è alcun filtro o altro sul valore, anche se probabilmente dovrebbe esserci.

grazie Jeremy - A chiunque altro, se sapete come fare questo per favore postatelo qui.

Strumenti di profiling per WordPress
Mi piace aggiungere strumenti di profiling in un file separato, che poi includo da functions.php quando necessario:
<?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 query - {$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('Y-m-d 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/Riga: ' . $trace['file'] . ', ' . $trace['line'],
'Funzione / Classe: ' . $trace['function'] . ', ' . $trace['class']
);
} # dump_trace()
if ( $_GET['debug'] == 'http' )
add_filter('http_request_args', 'dump_http', 0, 2);
?>

esiste un modo rapido per modificare questo in modo che lo script venga chiamato solo quando sei un amministratore E aggiungere qualcosa all'URL per mostrare le informazioni di debug?

Ecco come è fatto nel mio tema: http://www.semiologic.com/software/sem-reloaded/ -- il file /inc/debug.php è incluso da /functions.php o /inc/init.php (non ricordo esattamente al momento).

Nitidezza per Immagini Ridimensionate (solo JPEG)
Questa funzione aumenta la nitidezza delle immagini JPEG ridimensionate. Ecco un esempio della differenza:
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', __('Impossibile leggere le dimensioni dell\'immagine'), $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);

se volete questo come plugin: http://wordpress.org/extend/plugins/sharpen-resized-images/

Rimuovi i Meta Box Predefiniti di WordPress
Testato su: WordPress 3.0.1
Questo codice ti permetterà di rimuovere specifici Meta Box che WordPress aggiunge di default nelle schermate di Aggiungi/Modifica Articolo e Aggiungi/Modifica Pagina.
// RIMUOVI META BOX DALLA SCHERMATA PREdefinita DEGLI ARTICOLI
function remove_default_post_screen_metaboxes() {
remove_meta_box( 'postcustom','post','normal' ); // Meta Box Campi Personalizzati
remove_meta_box( 'postexcerpt','post','normal' ); // Meta Box Estratto
remove_meta_box( 'commentstatusdiv','post','normal' ); // Meta Box Commenti
remove_meta_box( 'trackbacksdiv','post','normal' ); // Meta Box Talkback
remove_meta_box( 'slugdiv','post','normal' ); // Meta Box Slug
remove_meta_box( 'authordiv','post','normal' ); // Meta Box Autore
}
add_action('admin_menu', 'remove_default_post_screen_metaboxes');
// RIMUOVI META BOX DALLA SCHERMATA PREdefinita DELLE PAGINE
function remove_default_page_screen_metaboxes() {
remove_meta_box( 'postcustom','page','normal' ); // Meta Box Campi Personalizzati
remove_meta_box( 'postexcerpt','page','normal' ); // Meta Box Estratto
remove_meta_box( 'commentstatusdiv','page','normal' ); // Meta Box Commenti
remove_meta_box( 'trackbacksdiv','page','normal' ); // Meta Box Talkback
remove_meta_box( 'slugdiv','page','normal' ); // Meta Box Slug
remove_meta_box( 'authordiv','page','normal' ); // Meta Box Autore
}
add_action('admin_menu', 'remove_default_page_screen_metaboxes');

Secondo questo http://wordpress.stackexchange.com/questions/34030/cant-change-permalink-url-after-hitting-ok-and-update/37779#37779 non nasconderei lo slugdiv in questo modo, ma userei invece questo https://gist.github.com/1863830

Filtro per rimuovere la correzione automatica da "Wordpress" a "WordPress"
Testato su: WordPress 3.0.1
A partire dalla versione 3.0 di WordPress è stato aggiunto un filtro che converte automaticamente tutte le occorrenze di "Wordpress" (senza la P maiuscola) in "WordPress" (con la P maiuscola) nei contenuti degli articoli, nei titoli e nei testi dei commenti. Alcuni trovano questo comportamento intrusivo, mentre personalmente a volte ho la necessità di scrivere "Wordpress" con la P minuscola e trovavo questo filtro piuttosto fastidioso.
// Rimuove il fastidioso filtro della P
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 );
}

ottima piccola scoperta. Una di quelle cose che semplicemente rimuove un altro pezzo di codice non necessario

In WordPress 3.0.1, questo filtro viene aggiunto con priorità 11, quindi devi aggiungere 11
come terzo parametro per rimuoverlo.

Personalizzare la Dashboard
add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');
function my_custom_dashboard_widgets() {
global $wp_meta_boxes;
Rimuovi questi widget dalla dashboard...
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']);
Aggiungi un widget personalizzato chiamato 'Aiuto e Supporto'
wp_add_dashboard_widget('custom_help_widget', 'Aiuto e Supporto', 'custom_dashboard_help');
}
Questo è il contenuto per il tuo widget personalizzato
function custom_dashboard_help() {
echo '<p>Lorum ipsum delor sit amet et nunc</p>';
}

Aggiungi Campi Personalizzati al Profilo Utente
Inserisci il codice seguente nel tuo file functions.php per aggiungere campi personalizzati al profilo utente. Modifica o aggiungi righe come preferisci.
Ricorda di non rimuovere la riga: return $contactmethods; altrimenti non funzionerà.
// CAMPI PERSONALIZZATI PROFILO UTENTE
function my_custom_userfields( $contactmethods ) {
// AGGIUNGI CAMPI CONTATTO PERSONALIZZATI
$contactmethods['contact_phone_office'] = 'Telefono Ufficio';
$contactmethods['contact_phone_mobile'] = 'Telefono Cellulare';
$contactmethods['contact_office_fax'] = 'Fax Ufficio';
// AGGIUNGI CAMPI INDIRIZZO PERSONALIZZATI
$contactmethods['address_line_1'] = 'Indirizzo Linea 1';
$contactmethods['address_line_2'] = 'Indirizzo Linea 2 (opzionale)';
$contactmethods['address_city'] = 'Città';
$contactmethods['address_state'] = 'Stato/Provincia';
$contactmethods['address_zipcode'] = 'CAP';
return $contactmethods;
}
add_filter('user_contactmethods','my_custom_userfields',10,1);
Per visualizzare i campi personalizzati puoi utilizzare uno dei due metodi elencati di seguito.
Opzione 1:
the_author_meta('facebook', $current_author->ID)
Opzione 2:
<?php $current_author = get_userdata(get_query_var('author')); ?>
<p><a href="<?php echo esc_url($current_author->contact_phone_office);?>" title="telefono_ufficio"> Telefono Ufficio</a></p>

Personalizzare l'ordine del menu di amministrazione
Testato su: WordPress 3.0.1
Questo codice ti permetterà di riorganizzare l'ordine degli elementi nel menu di amministrazione. Tutto quello che devi fare è cliccare su un link esistente nel menu di amministrazione e copiare tutto ciò che precede l'URL /wp-admin/. L'ordine qui sotto rappresenta l'ordine che avrà il nuovo menu di amministrazione.
// PERSONALIZZA L'ORDINE DEL MENU DI AMMINISTRAZIONE
function custom_menu_order($menu_ord) {
if (!$menu_ord)
return true;
return array(
'index.php', // Questo rappresenta il link della dashboard
'edit.php?post_type=events', // Questo è un menu di un custom post type
'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', // Questo è il menu predefinito delle pagine
'edit.php', // Questo è il menu predefinito degli articoli
);
}
add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

Esiste davvero un filtro core chiamato custom_menu_order
? Non sono riuscito a trovarne uno...

@kaiser documentato qui http://codex.wordpress.org/Plugin_API/Filter_Reference/custom_menu_order

Funzione per modificare la lunghezza dell'Excerpt
Testato su: Wordpress 3.0.1
Per impostazione predefinita, tutti gli excerpt sono limitati a 55 parole. Utilizzando il codice seguente puoi sovrascrivere questa impostazione predefinita:
function new_excerpt_length($length) {
return 100;
}
add_filter('excerpt_length', 'new_excerpt_length');
Questo esempio cambia la lunghezza dell'excerpt a 100 parole, ma puoi utilizzare lo stesso metodo per modificarla a qualsiasi valore desiderato.

@user402... questo limite è basato su parole o caratteri? Potresti mostrare come fare entrambi?

@NetConstructor.com Questa funzione (e l'hook excerpt_length
) limita per parole.

Aggiungi Anteprime nella Lista di Gestione Articoli/Pagine
Puoi aggiungere questo codice alle tue funzioni per visualizzare nella lista di gestione/modifica articoli e pagine una nuova colonna con l'anteprima della miniatura.
/****** Aggiungi Miniature nella Lista di Gestione Articoli/Pagine ******/
if ( !function_exists('AddThumbColumn') && function_exists('add_theme_support') ) {
// per articoli e pagine
add_theme_support('post-thumbnails', array( 'post', 'page' ) );
function AddThumbColumn($cols) {
$cols['thumbnail'] = __('Thumbnail', 'testo-del-dominio');
return $cols;
}
function AddThumbValue($column_name, $post_id) {
$width = (int) 35;
$height = (int) 35;
if ( 'thumbnail' == $column_name ) {
// miniatura di WP 2.9
$thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true );
// immagine dalla galleria
$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 __('Nessuna', 'testo-del-dominio');
}
}
}
// per gli articoli
add_filter( 'manage_posts_columns', 'AddThumbColumn' );
add_action( 'manage_posts_custom_column', 'AddThumbValue', 10, 2 );
// per le pagine
add_filter( 'manage_pages_columns', 'AddThumbColumn' );
add_action( 'manage_pages_custom_column', 'AddThumbValue', 10, 2 );
}

Disabilita i ping al proprio blog
Testato su: WordPress 3.0.1
// Rimuovi i ping a se stessi
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' );

con quale frequenza e quando WordPress effettua il ping a se stesso?

In realtà ho questo problema abbastanza spesso. Se inserisco un link interno che rimanda a un altro articolo del mio blog WordPress, ricevo un trackback o un pingback (non ricordo quale) da me stesso. È fastidioso.

Abilita la compressione GZIP in output
Normalmente il server dovrebbe essere configurato per farlo automaticamente, ma molti host condivisi non lo fanno (probabilmente per aumentare l'utilizzo della banda da parte dei client).
if(extension_loaded("zlib") && (ini_get("output_handler") != "ob_gzhandler"))
add_action('wp', create_function('', '@ob_end_clean();@ini_set("zlib.output_compressione", 1);'));

Mostra Query al Database, Tempo Impiegato e Consumo di Memoria
Testato su: WordPress 3.0.1
function performance( $visible = false ) {
$stat = sprintf( '%d query in %.3f secondi, utilizzando %.2fMB di memoria',
get_num_queries(),
timer_stop( 0, 3 ),
memory_get_peak_usage() / 1024 / 1024
);
echo $visible ? $stat : "<!-- {$stat} -->" ;
}
Quindi aggiungi questo codice sotto quello sopra, che inserirà automaticamente il codice precedente nel footer del tuo sito pubblico (assicurati che il tuo tema stia chiamando wp_footer
):
add_action( 'wp_footer', 'performance', 20 );
Può essere chiamato più volte.

Estrae Automaticamente la Prima Immagine dal Contenuto del Post
Testato su: WordPress 3.0.1
Questo codice estrarrà automaticamente la prima immagine associata a un post e ti permetterà di visualizzarla/usarla richiamando la funzione getImage.
// ESTRAE AUTOMATICAMENTE LA PRIMA IMMAGINE DAL 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;
}

Bello, ma get_the_image fa anche un ottimo lavoro con questo. http://wordpress.org/extend/plugins/get-the-image/

corretto ma questo funziona in modo diverso e risolve vari problemi che get_the_image non prende in considerazione

@matt -- In WordPress ci sono diversi modi per aggiungere immagini agli articoli e penso che lo script get_the_image controlli solo uno di questi. Questo verifica se c'è un'immagine in evidenza e la utilizza per prima se disponibile, poi penso che controlli la prima immagine aggiunta al contenuto dell'articolo e se non viene trovata, controlla nella galleria multimediale l'immagine con l'ordine di ordinamento più alto (almeno così ricordo l'ordine).

suggerisco http://wordpress.org/extend/plugins/auto-post-thumbnail/ Genera automaticamente l'immagine in evidenza (Featured Thumbnail) dalla prima immagine nell'articolo o in qualsiasi tipo di contenuto personalizzato solo se l'immagine in evidenza non è impostata

Disattivare i Widget Predefiniti di WordPress
Testato su: WordPress 3.0.1
// Disattiva tutti i widget predefiniti di WordPress
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);

Mostrare il file template del tema utilizzato da un post/pagina nell'header
add_action('wp_head', 'show_template');
function show_template() {
global $template;
print_r($template);
}
Accorciare l'output predefinito del DIV se il tuo tema utilizza post_class.
Se il tuo tema utilizza qualcosa come:
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
Potresti avere DIV nel tuo codice sorgente estremamente lunghi che potrebbero apparire così o anche più lunghi:
<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">
Questo può davvero ingombrare il tuo sorgente e sembrare piuttosto superfluo nella maggior parte dei casi, arrivare a 3-4 livelli è più che sufficiente.
Per l'esempio sopra possiamo tagliare l'output in questo modo:
// Taglia gli output DIV eccessivamente lunghi
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');
Questo taglia l'output per includere solo i primi 5 valori, quindi l'esempio sopra diventa:
<div id="post-4" class="post-4 post type-post hentry category-uncategorized">
Fare in modo che gli archivi di categoria mostrino tutti i post, indipendentemente dal tipo di post: utile per i custom post type
function any_ptype_on_cat($request) {
if ( isset($request['category_name']) )
$request['post_type'] = 'any';
return $request;
}
add_filter('request', 'any_ptype_on_cat');
Rimuovere elementi indesiderati dalla dashboard
Questo era già stato postato ma non includeva la lista completa degli elementi. Specialmente quei fastidiosi "link in entrata!"
add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');
function my_custom_dashboard_widgets() {
global $wp_meta_boxes;
// Right Now - Commenti, Post, Pagine a colpo d'occhio
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']);
// Commenti recenti
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']);
// Link in entrata
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']);
// Plugin - Popolari, nuovi e recentemente aggiornati
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']);
// Feed del blog di sviluppo WordPress
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']);
// Altre notizie WordPress
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']);
// Form Quick Press
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']);
// Elenco bozze recenti
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']);
}
Rimuovere i salti della pagina con "Leggi tutto"
Invece di saltare, torna all'inizio della pagina. Sai come quando clicchi "leggi tutto" salta al punto nella pagina che può essere fastidioso, questo fa caricare la pagina normalmente, nessun salto!
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');
Limitare gli elementi del menu ADMIN in base al nome utente, sostituisci username con il nome effettivo di un utente.
function remove_menus()
{
global $menu;
global $current_user;
get_currentuserinfo();
if($current_user->user_login == 'username')
{
$restricted = array(__('Post'),
__('Media'),
__('Link'),
__('Pagine'),
__('Commenti'),
__('Aspetto'),
__('Plugin'),
__('Utenti'),
__('Strumenti'),
__('Impostazioni')
);
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');
//in alternativa puoi usare if($current_user->user_login != 'admin') invece, probabilmente più utile
Personalizzare il tag cloud
// Personalizzazione tag cloud
add_filter('widget_tag_cloud_args', 'style_tags');
function style_tags($args) {
$args = array(
'largest' => '10',
'smallest' => '10',
'format' => 'list',
);
return $args;
}
Un riferimento completo delle opzioni è qui (ce ne sono molte!) http://codex.wordpress.org/Function_Reference/wp_tag_cloud
Modificare il timer predefinito di aggiornamento del widget RSS
(Il predefinito è 6 o 12 ore - non ricordo (1800 = 30 minuti).
add_filter( 'wp_feed_cache_transient_lifetime', create_function('$fixrss', 'return 1800;') );

potresti per favore dividere ciascuno di questi in risposte separate nelle prossime settimane. Stavo per farlo io ma non volevo che sembrasse che mi stessi prendendo il merito delle tue risposte. In ogni caso - sto cercando di mantenere questo organizzato in modo che gli utenti possano facilmente trovare le informazioni che stanno cercando. Grazie in anticipo

Stavo usando il codice "Restrict ADMIN menu items based on username, replace username with an actual user's name" che è ottimo ma potresti aggiornare il codice per mostrare anche come questo può essere fatto per un specifico "ruolo utente". Penso che sarebbe molto utile!

Scusa NetConstructor ho appena visto il tuo commento ora. Per il ruolo utente userei "current_user_can". Non ho tempo per testarlo ora ma quando lo farò, lo aggiungerò.

Rimuovi l'avviso di aggiornamento dei plugin SOLO per i plugin INATTIVI
function update_active_plugins($value = '') {
/*
L'array $value passato contiene l'elenco dei plugin con i timestamp
dell'ultima volta in cui è stato verificato se c'era corrispondenza di versione
Il nodo $value->response contiene un array degli elementi che sono
obsoleti. Questo nodo response viene utilizzato dal menu 'Plugin'
ad esempio per indicare che ci sono aggiornamenti. Anche nell'elenco
effettivo dei plugin per mostrare il riquadro giallo sotto un determinato plugin
che indica all'utente che è necessaria un'azione.
*/
if ((isset($value->response)) && (count($value->response))) {
// Ottieni l'elenco dei plugin attualmente attivi
$active_plugins = get_option('active_plugins');
if ($active_plugins) {
// Qui iniziamo a confrontare gli elementi di $value->response
// verificando ciascuno rispetto alla lista dei plugin attivi.
foreach($value->response as $plugin_idx => $plugin_item) {
// Se l'elemento di response non è un plugin attivo, rimuovilo.
// Questo impedirà a WordPress di indicare che il plugin necessita di aggiornamenti.
if (!in_array($plugin_idx, $active_plugins))
unset($value->response[$plugin_idx]);
}
}
else {
// Se non ci sono plugin attivi, ignora quelli inattivi obsoleti.
foreach($value->response as $plugin_idx => $plugin_item) {
unset($value->response);
}
}
}
return $value;
}
add_filter('transient_update_plugins', 'update_active_plugins'); // Hook per WordPress 2.8+
//add_filter( 'option_update_plugins', 'update_active_plugins'); // Hook per WordPress 2.7.x

Rimuovere informazioni superflue e HTML all'interno del tag <head>
// rimuove informazioni non necessarie dall'header
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' ); // per WordPress < 3.0
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' ); // per WordPress >= 3.0
}
// rimuove il CSS extra che il widget 'Commenti recenti' inserisce
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'
) );
}

Abilita il Debug degli Errori e la Registrazione per l'Utilizzo su Siti Live
Questo è un pezzo di codice che ho scritto per utilizzare le costanti WP_DEBUG che normalmente sono disabilitate di default. Ho creato un modo non solo per abilitare WP_DEBUG così da poterlo usare su un sito live senza effetti collaterali negativi, ma ho anche sfruttato le altre costanti di debug per forzare la visualizzazione degli errori e per creare un file di log degli errori e dei Notices nella directory /wp-content.
Inserisci questo codice nel tuo file wp-config.php (DOPO AVER SALVATO UN BACKUP PER PRECAUZIONE) e poi puoi passare i parametri ?debug=1, 2 o 3 alla fine di qualsiasi URL del tuo sito.
?debug=1 = mostra tutti gli errori/notices ?debug=2 = forza la loro visualizzazione ?debug=3 = crea un file debug.log di tutti gli errori nella directory /wp-content.
/**
* Scritto da Jared Williams - http://new2wp.com
* @wp-config.php sostituisci la costante WP_DEBUG con questo codice
* Abilita il debug di WP per l'utilizzo su un sito live
* http://core.trac.wordpress.org/browser/trunk/wp-includes/load.php#L230
* Passa il parametro '?debug=#' alla fine di qualsiasi URL del sito
*
* http://example.com/?debug=1, /?debug=2, /?debug=3
*/
if ( isset($_GET['debug']) && $_GET['debug'] == '1' ) {
// Abilita la segnalazione dei notices durante lo sviluppo - E_ALL
define('WP_DEBUG', true);
} elseif ( isset($_GET['debug']) && $_GET['debug'] == '2' ) {
// Deve essere true per far funzionare WP_DEBUG_DISPLAY
define('WP_DEBUG', true);
// Forza la visualizzazione degli errori
define('WP_DEBUG_DISPLAY', true);
} elseif ( isset($_GET['debug']) && $_GET['debug'] == '3' ) {
// Deve essere true per far funzionare WP_DEBUG_LOG
define('WP_DEBUG', true);
// Registra gli errori in debug.log nella directory wp-content
define('WP_DEBUG_LOG', true);
}
Se sei interessato, entro più nel dettaglio nel guest post che ho scritto per Comluv, qui: http://comluv.com/dev/enable-debugging-and-logging-for-live-site-usage/
Sto ancora lavorando a un modo per proteggere questo sistema con una password o, preferibilmente, farlo funzionare solo se if (current_user_can('manage_themes') e is_logged_in().
Ma è qui che le cose si fanno più complicate.

Aggiungere Automaticamente Titoli Dinamici alle Pagine Pubbliche
Testato su: WordPress 3.0.1
Utilizzando il codice qui sotto verranno creati automaticamente titoli dinamici in base alle pagine/post visualizzati pubblicamente.
/* Titoli Dinamici **/
// Questo imposta il tuo <title> in base alla pagina che stai visualizzando, per una migliore formattazione e per la SEO
// Devi impostare la variabile $longd con un testo personalizzato all'inizio della funzione
function dynamictitles() {
$longd = __('Inserisci qui la tua descrizione lunga.', '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(' | '.__('Autore', 'texdomainstring'));
} else if ( is_category() ) {
bloginfo('name');
wp_title(' | '.__('Archivio per', 'texdomainstring'));
} else if ( is_tag() ) {
echo get_bloginfo('name').' | '.__('Archivio tag per', 'texdomainstring');
wp_title('');
} else if ( is_archive() ) {
echo get_bloginfo('name').' | '.__('Archivio per', 'texdomainstring');
wp_title('');
} else if ( is_search() ) {
echo get_bloginfo('name').' | '.__('Risultati di ricerca', 'texdomainstring');
} else if ( is_404() ) {
echo get_bloginfo('name').' | '.__('Errore 404 (Pagina non trovata)', 'texdomainstring');
} else if ( is_home() ) {
echo get_bloginfo('name').' | '.get_bloginfo('description');
} else {
echo get_bloginfo('name').' | '.($blog_longd);
}
}

Nuovi Ruoli e Capacità - Esegui solo una volta!
Questi snippet mi sono molto utili, è il modo corretto per gestirli senza un plugin. Impostano un singolo campo (prefix_user_roles) nel database delle opzioni, e non hai bisogno di un plugin per configurarli. Consulta la pagina del Codex per una lista delle capacità disponibili e le descrizioni della loro funzione. Devi solo decommentare uno di questi blocchi, caricare una pagina qualsiasi e poi ricommentarli! Qui sto creando un ruolo con le capacità di cui ho bisogno:
/* Capacità */
// Per aggiungere un nuovo ruolo, usando 'international' come nome breve e
// 'International Blogger' come nome visualizzato nella lista Utenti e pagina di modifica:
/*
add_role('international', 'International Blogger', array(
'read' => true, // True abilita quella capacità, False la rimuove specificamente.
'edit_posts' => true,
'delete_posts' => true,
'edit_published_posts' => true,
'publish_posts' => true,
'edit_files' => true,
'import' => true,
'upload_files' => true //l'ultimo nell'array non vuole la virgola!
));
*/
// Per rimuovere completamente un ruolo o uno di quelli predefiniti:
/*
remove_role('international');
*/
A volte è utile aggiungere/rimuovere capacità da un ruolo esistente piuttosto che eliminarlo e ricrearlo. Anche qui, devi solo decommentare, ricaricare una pagina e poi ricommentare. Questo salverà correttamente il ruolo/capacità nella tabella delle opzioni. (Permette a te, lo sviluppatore, di controllarli e rimuove l'overhead dei pesanti plugin che fanno la stessa cosa.) Qui sto modificando il ruolo 'author' per negare la cancellazione dei post pubblicati (il default), ma permettendo la capacità di modificare i post pubblicati (che non è consentita di default per questo ruolo)-- usando *add_cap* o *remove_cap*.
/*
$edit_role = get_role('author');
$edit_role->add_cap('edit_published_posts');
$edit_role->remove_cap('delete_published_posts');
*/
Conservo un foglio di calcolo con la griglia della pagina del Codex per i siti che modifico in questo modo, così posso ricordare come sono impostate le cose, anche se lasciare il codice commentato nel file functions.php funziona ugualmente. Non lasciare questi esempi decommentati, altrimenti scriverà nel database ad ogni caricamento di pagina!

Le funzioni che ho menzionato sopra scrivono in un campo del database delle opzioni. Commentarle e decommentarle è la strada da seguire. Esistono plugin per i ruoli utente, ma se usi le funzioni menzionate sopra, non puoi lasciare queste funzioni in esecuzione, e NON hai bisogno di impostarle più di una volta, o impostarle in base al fatto che un utente specifico stia accedendo a qualcosa. Se vuoi fare ciò, assegna a quell'utente un ruolo specifico e unico. E consulta il codex, tutto ciò che scrivo sopra è corretto al 100% se lo fai senza un plugin.
In quasi tutti i casi, devi impostare i ruoli utente solo una volta.

@tomcat23: Per illustrare, ho racchiuso il tutto in una funzione per aggiungere il ruolo solo quando non esiste già. Un'altra nota: credo che sarebbe più semplice posizionare il ruolo da qualche parte nella gerarchia dei ruoli, recuperando le capacità da un ruolo predefinito e poi aggiungere/rimuovere le capacità dal ruolo predefinito. Renderebbe più chiaro e facile da ricordare se le sue capacità sono posizionate da qualche parte tra, ad esempio, admin e editor. - Spero non ti dispiaccia che abbia modificato la tua risposta. Se ti dà fastidio, per favore ripristinala. :)

Confermo la mia risposta così come l'ho lasciata. La tua funzione manca il punto e non fornisce la stessa risposta del mio testo. Trovo anche piuttosto scortese da parte tua modificare il mio codice e la mia risposta.

Non solo, ma la tua funzione non fa la stessa cosa del mio codice. La tua funzione lascia solo un ulteriore controllo in atto, get_role('international', che non è necessario! Ho usato questo codice per spostare un client che aveva un server che utilizzava php4 e quindi non poteva usare il plugin role scoper che stavano utilizzando, che era solo per php5. (Ed era l'unico plugin che richiedeva php5 per la loro installazione.) Come sviluppatore, ho visto che l'unico motivo per cui ne avevano bisogno era per impostare un paio di ruoli e modificare alcune capacità. E questo codice, la mia risposta originale qui, è come farlo!

Non hai bisogno, né dovresti, racchiudere questo in una funzione. Hai solo bisogno che imposti correttamente i ruoli e le capacità. Se vuoi sperimentarci, ci sono alcuni ottimi (anche se gonfiati) plugin per quello.
Se comprendi i ruoli e le capacità in WordPress e non stai solo armeggiando, e non stai scrivendo il tuo plugin, allora questo è il modo giusto per farlo. Per favore non modificare il mio codice. L'ho ripristinato. La tua funzione è comunque nella cronologia per chiunque voglia vederla, anche se non sono d'accordo con quello che hai fatto.

Per chiarire ulteriormente, non hai bisogno di racchiudere questo in una funzione o fare controlli di amministrazione. add_role(), remove_role(), add_cap() e remove_cap(), come mostro nella mia risposta originale non hanno bisogno di essere eseguiti più e più volte -- impostano semplicemente un campo nella tabella delle opzioni che non ha bisogno di essere scritto ripetutamente -- ecco perché il tuo wrapper di funzione è sbagliato. Lo so, stai aggiungendo un'azione a after_setup_theme, ma impostare un ruolo con quell'hook non era lo scopo della mia risposta. (E in generale i ruoli non hanno bisogno di essere inclusi nei temi.)

Puh... Come ho scritto: "Spero non ti dispiaccia che ho modificato la tua risposta. Se è così, per favore ripristinala. :)". L'hai ripristinata, hai spiegato le tue ragioni e indovina un po': va bene. Quindi calma. Ma per offrirti la stessa quantità di spiegazioni: io incapsulo sempre il codice in funzioni e lo aggiungo alla cartella dei file di test del mio tema. In questo modo posso facilmente testare cose, ad esempio risposte WA, e aggiungerle velocemente se mi servono, quindi incapsularlo in una funzione va bene. Inoltre è più semplice disabilitare (solo la chiamata add_action) e permettere commenti doc con /**/ invece di commenti multilinea //. Questo riguardo il mio "perché".

@tomcat23 - Nota che siamo una community che si supporta a vicenda, non una che si sfida se non in modo accademico. Come vedi dalla risposta di @kaiser, stava solo cercando di aiutare.

@MikeSchinkel Ricordo che ci fossero due commenti di @kaiser il 1° febbraio, motivo per cui ho risposto come ho fatto. (Tu sei moderatore, puoi verificare se ne ha lasciati due? Perché non credo di sbagliarmi nel pensare che avesse 2 commenti sul mio utilizzo che non gli sembravano appropriati.) Non ho sentito che il mio codice o la mia spiegazione avessero bisogno di aiuto e gliel'ho detto il 1° febbraio. Torno qualche tempo dopo e trovo che ha modificato il mio codice - la mia prima esposizione all'aspetto "wiki" di questo sito - ed ero, a mio avviso, giustamente infastidito che mentre il mio testo e i commenti discutevano una cosa, il codice stesso era diverso.

La mia risposta è nello spirito della domanda originale. Questo è il mio codice utile, è ciò che funziona bene per me e non lo utilizzo racchiuso in una funzione. Se @kaiser avesse voluto rispondere a questa domanda con il codice racchiuso in una funzione e collegato a un hook, è ancora libero di farlo.
Ancora una volta, @kaiser quello che hai fatto modificando il mio codice ma non il mio testo è stato dannoso per altre persone che sarebbero venute qui, lo avrebbero visto e avrebbero scoperto che la mia discussione sul codice non aveva senso. Ecco perché ritengo sia stato scortese da parte tua fare ciò che hai fatto e perché ieri ho reagito in modo così duro.

@tomcat23 - Acqua passata a questo punto. Tutto quello che sto dicendo è che non sono interessato ad attribuire colpe, solo a garantire pace per tutti andando avanti. :)

@MikeSchinkel Sì, hai ragione.
@kaiser Mi scuso se ti ho causato offesa.

Footer Personalizzato per l'Area di Amministrazione di WordPress
// personalizza il testo nel footer dell'amministrazione function custom_admin_footer() { echo 'inserisci qui il tuo testo HTML personalizzato per il footer'; } add_filter('admin_footer_text', 'custom_admin_footer');
Utilizzo questo codice per i siti dei clienti come semplice riferimento per contattarmi in qualità di sviluppatore.

Funzione per Disabilitare i Feed RSS
Testato su: Wordpress 3.0.1
Puoi disabilitare i feed RSS se desideri mantenere il tuo sito basato su Wordpress come statico.
Puoi utilizzare questa funzione:
function fb_disable_feed() {
wp_die( __('Nessun feed disponibile, visita la nostra <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);

Fonte: http://bueltge.de/wordpress-feeds-deaktivieren/794/ (Frank Bueltge)

Grazie Toscho! la fonte è disponibile anche in inglese http://wpengineer.com/287/disable-wordpress-feed/

Cambia il messaggio "Howdy" in "Benvenuto"
Con questa funzione puoi personalizzare il messaggio "Howdy" nell'angolo in alto a destra dell'area di amministrazione.
Questa funzione utilizza JQuery per cambiare il messaggio "Howdy" in "Benvenuto".
/****** Personalizza il messaggio admin "Howdy" in "Benvenuto" ******/
$nohowdy = "Benvenuto";
if (is_admin()) {
add_action('init', 'artdev_nohowdy_h');
add_action('admin_footer', 'artdev_nohowdy_f');
}
// Carica jQuery
function artdev_nohowdy_h() {
wp_enqueue_script('jquery');
}
// Modifica
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;
}
Versione PHP, utilizzando il filtro gettext
:
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', 'Benvenuto', $translated);
return $translated;
}

Non è già possibile modificarlo lato PHP in modo che non venga proprio generato in output?
