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.

Precompilazione dei tipi di post
Ecco un esempio per questa raccolta.
////////////////////////////////////////////////////////////////////////////////////
// Questo codice precompila automaticamente i tipi di post e i post.
///////////////////////////////////////////////////////////////////////////////////
add_filter( 'default_content', 'my_editor_content' );
function my_editor_content( $content ) {
global $post_type;
switch( $post_type ) {
case 'your_post_type_here': // precompilazione automatica
$content = 'Il contenuto con cui vuoi precompilare il tipo di post.';
break;
}
return $content;
}
Può essere utile quando devi pubblicare le stesse informazioni più volte con piccole differenze.

Ottimo lavoro! Mi piace questa opzione semplice. Puoi espanderla mostrando possibili modi per popolare automaticamente i campi personalizzati o altri criteri/opzioni o magari anche i mezzi per inserire automaticamente i media?

Posso sicuramente valutare di espanderla. Non ho ancora provato ad andare oltre per ora.

Includi Automaticamente il Codice Google Analytics
Testato su: WordPress 3.1 RC3
Utilizzo questo script su tutti i miei siti da WordPress 2.3.0... aggiunge semplicemente i codici standard di tracciamento di Google nel footer.
// Aggiungi il Codice di Tracciamento Google Analytics
function add_google_analytics() {
?>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-XXXXXXX-X");
pageTracker._trackPageview();
} catch(err) {}</script>
<?php
}
add_action('wp_footer', 'add_google_analytics');
Assicurati di sostituire UA-XXXXXXX-X
con il tuo codice di tracciamento Google...

grazie per la condivisione. Anche io ho utilizzato questo metodo, ma sarei curioso di sapere se sei a conoscenza di come possa essere modificato per far sì che specifici tag, pagine di tipi di post o persino i post stessi possano ricevere automaticamente valori aggiuntivi sfruttando le funzionalità delle variabili di tracciamento campagne che Google offre. Inoltre, cosa bisognerebbe aggiungere se volessimo includerlo nel footer di tutte le pagine di amministrazione per tracciare l'attività degli admin?

Non sono sicuro riguardo all'aggiunta di variabili di tracciamento campagne solo perché non ne ho avuto bisogno finora. Ma per aggiungere gli stessi script alle pagine di amministrazione, basterebbe usare add_action('admin_footer', 'add_google_analytics');
per agganciarsi al footer delle pagine di amministrazione.

Elenca tutte le costanti per informazioni e debug
Testato su: Wordpress 3.0.1
Mostrerà le informazioni solo se sei un utente loggato
if ( is_user_logged_in() ) {
print('<pre>');
print_r( @get_defined_constants() );
print('</pre>');
}
Ecco la versione con filtro opzionale che corrisponderà parzialmente ai nomi e valori delle costanti:
function constants($filter = false) {
$constants = get_defined_constants();
if( $filter ) {
$temp = array();
foreach ( $constants as $key => $constant )
if( false !== stripos( $key, $filter ) || false !== stripos( $constant, $filter ) )
$temp[$key] = $constant;
$constants = $temp;
}
ksort( $constants );
var_dump( $constants );
}

Modifica lo Slug Predefinito dell'Autore
Aggiungi questo nel tuo file functions.php per cambiare lo slug predefinito dell'autore con quello che preferisci.
Basta sostituire "sellers" con lo slug che desideri utilizzare.
// Cambia lo Slug dell'URL da Author a Sellers
function new_author_base() {
global $wp_rewrite;
$author_slug = 'sellers';
$wp_rewrite->author_base = $author_slug;
}
add_action('init', 'new_author_base');

Già, svuotare i ruoli ad ogni caricamento ti fa risparmiare un sacco di venditori. :) Meglio usare il plugin Edit Author Slug.

Aggiungi il pulsante "Pagina successiva" nell'editor WYSIWYG
add_filter('mce_buttons','wysiwyg_editor');
function wysiwyg_editor($mce_buttons) {
$pos = array_search('wp_more',$mce_buttons,true);
if ($pos !== false) {
$tmp_buttons = array_slice($mce_buttons, 0, $pos+1);
$tmp_buttons[] = 'wp_page';
$mce_buttons = array_merge($tmp_buttons, array_slice($mce_buttons, $pos+1));
}
return $mce_buttons;
}

Aggiungi stili personalizzati all'editor TinyMCE
A volte gli utenti e i clienti si confondono su come il loro contenuto viene visualizzato nell'editor rispetto a come viene mostrato sul front-end. Copiare solo poche righe rilevanti dal tuo foglio di stile principale nel nuovo tinymce.css può aiutare molto:
function custom_mce_css($wp) {
return $wp .= ',' . get_bloginfo('stylesheet_directory') . '/css/tinymce.css';
}
add_filter( 'mce_css', 'custom_mce_css' );

Bello. Ho appena scoperto che esiste una soluzione di Seamus Leahy che estende tutto questo ulteriormente aggiungendo una classe body a tinymce. http://www.digwp.com/2010/11/actual-wysiwyg

Preferisco creare un foglio di stile sia per il front-end che per TinyMCE in un colpo solo. Poi uso la funzionalità core della funzione add_editor_style() per includere il foglio di stile e assicurarmi che venga caricato quando si carica TinyMCE. Articolo del Codex su http://codex.wordpress.org/Function_Reference/add_editor_style

Ridimensiona immagini grandi durante il caricamento
L'immagine verrà ridimensionata in base alla dimensione grande nelle impostazioni dei media.
/** Ridimensiona al caricamento secondo la dimensione più grande nelle impostazioni media */
function replace_uploaded_image($image_data) {
// se non esiste un'immagine grande: restituisci
if (!isset($image_data['sizes']['large'])) return $image_data;
// percorso dell'immagine caricata e dell'immagine grande
$upload_dir = wp_upload_dir();
$uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];
// elimina l'immagine caricata
unlink($uploaded_image_location);
// rinomina l'immagine grande
rename($large_image_location,$uploaded_image_location);
// aggiorna i metadati dell'immagine e restituiscili
$image_data['width'] = $image_data['sizes']['large']['width'];
$image_data['height'] = $image_data['sizes']['large']['height'];
unset($image_data['sizes']['large']);
return $image_data;
}
add_filter('wp_generate_attachment_metadata','replace_uploaded_image');

Significa che il file originale di grandi dimensioni caricato viene effettivamente sostituito? Il mio PHP non è eccezionale, ma la risposta sembrerebbe essere sì?

@davemac Mi rendo conto che è molto vecchio ormai, ma da quello che ho capito del codice, il file immagine originale viene ridimensionato alle stesse dimensioni dell'immagine 'grande' impostata nella schermata delle impostazioni di WordPress. Il che è ottimo, ma poi ti ritrovi semplicemente con 2 immagini della stessa dimensione. Suggerirei di impostare manualmente i valori per rendere l'immagine originale grande solo quanto il file più grande che utilizzerai realisticamente sul tuo sito. In questo modo avrai un'immagine quasi originale con cui lavorare in futuro.

Utilizzare figure e figcaption per le didascalie
Testato su: WordPress 3.1.3
(Crediti a WP Engineer: http://wpengineer.com/917/filter-caption-shortcode-in-wordpress/)
function mytheme_caption( $attr, $content = null ) {
$output = apply_filters( 'img_caption_shortcode', '', $attr, $content );
if ( $output != '' )
return $output;
extract( shortcode_atts ( array(
'id' => '',
'align' => 'alignnone',
'width'=> '',
'caption' => ''
), $attr ) );
if ( 1 > (int) $width || empty( $caption ) )
return $content;
if ( $id ) $id = 'id="' . $id . '" ';
return '<figure ' . $id . 'class="wp-caption ' . $align . '" style="width: ' . $width . 'px">'
. do_shortcode( $content ) . '<figcaption class="wp-caption-text">' . $caption . '</figcaption></figure>';
}
add_shortcode( 'wp_caption', 'mytheme_caption' );
add_shortcode( 'caption', 'mytheme_caption' );

Ecco alcuni utili shortcode che puoi utilizzare:
1. Shortcode facile per aggiungere pulsanti di condivisione su Twitter e Facebook
function shreplz() {
return '
<div class="sharebox">
<div class="twittme"><a href="https://twitter.com/share" class="twitter-share-button" data-count="horizontal">Tweet</a><script type="text/javascript" src="//platform.twitter.com/widgets.js"></script></div>
<div class="shareface"><a name="fb_share"></a> <script src="http://static.ak.fbcdn.net/connect.php/js/FB.Share" type="text/javascript"></script></div>
<br style="clear: left;" />
</div>
';
}
add_shortcode('sharethis', 'shreplz');
// Come usare: [sharethis]
2. Shortcode semplice per catturare un'istantanea remota utilizzando l'API di WordPress
function wpr_snap($atts, $content = null) {
extract(shortcode_atts(array(
"snap" => 'http://s.wordpress.com/mshots/v1/',
"url" => 'http://www.sagive.co.il',
"alt" => 'La mia immagine',
"w" => '400', // larghezza
"h" => '300' // altezza
), $atts));
$img = '<img src="' . $snap . '' . urlencode($url) . '?w=' . $w . '&h=' . $h . '" alt="' . $alt . '"/>';
return $img;
}
add_shortcode("snap", "wpr_snap");
// Come usare: [snap url="http://www.example.com" alt="Sito Fantastico!" w="300px" h="200px"]
3. Shortcode facile per incorporare un iFrame
function GenerateIframe( $atts ) {
extract( shortcode_atts( array(
'href' => 'http://the-url',
'height' => '550px',
'width' => '600px',
), $atts ) );
return '<iframe src="'.$href.'" width="'.$width.'" height="'.$height.'"> <p>Il tuo browser non supporta gli Iframe.</p></iframe>';
}
add_shortcode('iframe', 'GenerateIframe');
// Come usare: [iframe href="http://www.exmaple.com" height="480" width="640"]
4. Shortcode per includere facilmente un file/documento remoto
function getfile_content( $atts ) {
extract( shortcode_atts( array(
'fileurl' => ''
), $atts ) );
if ($fileurl!='')
return @file_get_contents($fileurl);
}
add_shortcode( 'getfile', 'getfile_content' );
// Come usare: [getfile fileurl="http://www.exmaple.com/somepage.html"]
. Ecco alcuni snippet relativi ai commenti:
1. Disabilita globalmente la possibilità di commentare
function closeCommentsGlobaly($data) { return false; }
add_filter('comments_number', 'closeCommentsGlobaly');
add_filter('comments_open', 'closeCommentsGlobaly');
2. Assegna una classe CSS diversa ai commenti dell'amministratore
if (1 == $comment->user_id)
echo 'siteadmin'; // Scegli qui la tua classe
3. Una lista commenti ricca di dati - ottima per pagine personalizzate
$comments = get_comments( array(
'number' => 10, // Numero di commenti
'status' => 'approve' // Tipo di commenti
) );
foreach($comments as $eachComment){
// Raccoglie i dati e li assegna
$commentID = comment_ID;
$commentAuthorEmail = $eachComment->comment_author_email;
$commentPostId = $eachComment->comment_post_ID;
$commentPostTitle = get_the_title( $commentPostId );
$commentPostUrl = get_permalink( $commentPostId );
$comment_sidebarnumber = get_comments_number( $commentPostId );
global $wpdb;
$userCommentCount = $wpdb->get_var('SELECT COUNT('.$commentID.') FROM ' . $wpdb->comments. ' WHERE comment_author_email = "' . $commentAuthorEmail . '"');
echo '<div style="border: 1px solid #ccc; padding: 10px;">';
echo '<ul style="margin: 0px;">';
echo '<li>Nome: '. $eachComment->comment_author .'</li>';
echo '<li>Ha commentato su: <a href="'.$commentPostUrl.'">'. $commentPostTitle .'</a></li>';
echo '<li>Data del commento: '. $eachComment->comment_date .'</li>';
echo '<li>Sito del commentatore: '. $eachComment->comment_author_email .'</</li>';
echo '<li>Email del commentatore: '. $eachComment->comment_author_email .'</</li>';
echo '<li>Questo commentatore '. $eachComment->comment_author .' ha commentato '. $userCommentCount .' volte sul tuo sito</</li>';
echo '</ul>';
echo '<p style="padding: 10px;"><strong>'. $eachComment->comment_author .' ha scritto</strong>: '. $eachComment->comment_content .'</p>';
echo '</div>';
}

Condizionale per verificare i discendenti nella gerarchia
Una funzione condizionale per verificare se la pagina corrente è un discendente dell'ID fornito. Utile per determinare se una pagina è un nipote, pronipote o più in basso nell'albero gerarchico.
function is_tree($pid) { // $pid = L'ID della pagina che stiamo cercando nelle pagine sottostanti
global $post; // carica i dettagli su questa pagina
$anc = get_post_ancestors( $post->ID );
foreach($anc as $ancestor) {
if(is_page() && $ancestor == $pid) {
return true;
}
}
if(is_page()&&(is_page($pid)))
return true; // siamo nella pagina o in una sottopagina
else
return false; // siamo altrove
};

Stavo cercando questa soluzione da un po'. Grazie per averla messa insieme! Posso chiedere un po' di chiarimenti sul caso d'uso. Idealmente, vorrei usarla nei miei menu in modo che se ho un menu principale genitore nella parte superiore del sito che mostra solo elementi di prima generazione. Quando mi trovo su un elemento di seconda o terza generazione, l'elemento di prima generazione possa essere evidenziato tramite un attributo CSS "current-parent". È possibile fare questo?

Crea un tag condizionale per tassonomie personalizzate
In questo esempio, 'student' era un tipo di post personalizzato e 'stud_cat' era la tassonomia personalizzata. Usa has_student(null)
per la condizione
function has_student( $student, $_post = null ) {
if ( !empty( $student ) )
return false;
if ( $_post )
$_post = get_post( $_post );
else
$_post =& $GLOBALS['post'];
if ( !$_post )
return false;
$r = is_object_in_term( $_post->ID, 'studcat', $student );
if ( is_wp_error( $r ) )
return false;
return $r;
}

Penso che questo venga sostituito con has_term()
ora che la versione 3.1 è stata rilasciata?

Facili correzioni per la sicurezza di WordPress
La sicurezza attraverso l'oscurità è il nome del gioco qui. Queste funzioni fanno tre cose diverse.
- Rimuovono la stringa della versione dal codice. Non c'è motivo di dire alla gente quale versione stiamo utilizzando.
- Rimuovono i messaggi di errore (Password errata, Utente inesistente, ecc.) dalla schermata di login dell'amministratore
Quando l'amministratore pubblica un commento, viene aggiunta una classe CSS. Questo rimuove il nome dell'amministratore nei commenti.
//RIMUOVI LA STRINGA DELLA VERSIONE DALL'HEADER remove_action('wp_head', 'wp_generator'); //NASCONDI I MESSAGGI DI ERRORE DI LOGIN (Password errata, Utente inesistente ecc.) add_filter('login_errors',create_function('$a', "return null;")); // Rimuovi il nome dell'amministratore nella classe dei commenti // Fonte: http://www.wprecipes.com/wordpress-hack-remove-admin-name-in-comments-class function remove_comment_author_class( $classes ) { foreach( $classes as $key => $class ) { if(strstr($class, "comment-author-")) { unset( $classes[$key] ); } } return $classes; } add_filter( 'comment_class' , 'remove_comment_author_class' );

Rimuovere il numero di versione di WordPress è una cattiva pratica. È molto più sicuro mantenere WordPress sempre aggiornato con gli ultimi fix di sicurezza IN OGNI MOMENTO. Bonus aggiuntivo: gli aspiranti script kiddie si sposteranno su versioni più vecchie.

Sostituisci il Gravatar Predefinito con un'Immagine Personalizzata
Tutto ciò che devi personalizzare è il percorso della tua immagine predefinita.
function custom_gravatar($avatar_defaults) {
$logo = get_bloginfo('template_directory') . '/images/icons/gravatar_logo.jpg'; //Cambia con il percorso che preferisci.
$avatar_defaults[$logo] = get_bloginfo('name');
return $avatar_defaults;
}//FINE FUNZIONE
add_filter( 'avatar_defaults', 'custom_gravatar' );

Crea automaticamente una nuova pagina all'attivazione di un tema
if (isset($_GET['activated']) && is_admin()){
$new_page_title = 'Titolo della pagina'; // Titolo della nuova pagina
$new_page_content = 'Contenuto della pagina'; // Contenuto della nuova pagina
$new_page_template = ''; //es. template-personalizzato.php. Lasciare vuoto se non si desidera un template personalizzato.
// Non modificare sotto questa linea
$page_check = get_page_by_title($new_page_title);
$new_page = array(
'post_type' => 'page',
'post_title' => $new_page_title,
'post_content' => $new_page_content,
'post_status' => 'publish',
'post_author' => 1,
);
if(!isset($page_check->ID)){
$new_page_id = wp_insert_post($new_page);
if(!empty($new_page_template)){
update_post_meta($new_page_id,'_wp_page_template', $new_page_template);
}
}

Elenco di tutte le SottoCategorie
Testato su: Wordpress 3.0.1
$echo = '<ul>' . "\n";
$childcats = get_categories('child_of=' . $cat . '&hide_empty=1');
foreach ($childcats as $childcat) {
if (1 == $childcat->category_parent) {
$echo .= "\t" . '<li><a href="' . get_category_link($childcat->cat_ID).'" title="' . $childcat->category_description . '">';
$echo .= $childcat->cat_name . '</a>';
$echo .= '</li>' . "\n";
}
}
$echo .= '</ul>' . "\n";
echo $echo;
inoltre, qui trovi maggiori informazioni e funzioni nel post http://wpengineer.com/2025/list-all-subcategories/

Perché faresti questo quando esiste una funzione specifica per visualizzare un elenco di categorie... Vedi: http://codex.wordpress.org/Template_Tags/wp_list_categories#Only_Show_Children_of_a_Category

Pulizia Automatica degli Slug SEO senza rimuovere la funzionalità
Testato su: Wordpress 3.0.1
Aggiungendo questo codice al tuo file functions.php, WordPress pulirà automaticamente lo slug/URL del titolo rimuovendo tutte le parole non necessarie. Ho esteso le capacità con personalizzazioni aggiuntive che nascondono anche l'opzione dello slug nelle impostazioni dello schermo e il metabox. Includendo il codice qui sotto, ogni nuovo articolo che creerai avrà automaticamente uno slug abbreviato e manterrai comunque la possibilità di modificarlo manualmente cliccando sull'URL sotto il titolo del post e salvando l'articolo.
// PULISCI AUTOMATICAMENTE GLI SLUG SEO DI PAGINE/ARTICOLI RIMUOVENDO LE PAROLE BREVI
add_filter('name_save_pre', 'seo_slugs', 0);
function seo_slugs($slug) {
// Non vogliamo modificare uno slug esistente
if ($slug) return $slug;
global $wpdb;
$seo_slug = strtolower(stripslashes($_POST['post_title']));
$seo_slug = preg_replace('/&.+?;/', '', $seo_slug); // rimuove entità HTML
// rimuove tutto ciò che non è una lettera, numero, spazio o apostrofo
$seo_slug = preg_replace ("/[^a-zA-Z0-9 \']/", "", $seo_slug);
// Converti in array e rimuovi parole comuni confrontandole con l'array c.w.
$seo_slug_array = array_diff (split(" ", $seo_slug), seo_slugs_stop_words());
// Converti l'array sanificato in una stringa
$seo_slug = join("-", $seo_slug_array);
return $seo_slug;
}
function seo_slugs_stop_words () {
return array ("a", "able", "about", "above", "abroad", "according", "accordingly", "across", "actually", "adj", "after", "afterwards", "again", "against", "ago", "ahead", "ain't", "all", "allow", "allows", "almost", "alone", "along", "alongside", "already", "also", "although", "always", "am", "amid", "amidst", "among", "amongst", "an", "and", "another", "any", "anybody", "anyhow", "anyone", "anything", "anyway", "anyways", "anywhere", "apart", "appear", "appreciate", "appropriate", "are", "aren't", "around", "as", "a's", "aside", "ask", "asking", "associated", "at", "available", "away", "awfully", "b", "back", "backward", "backwards", "be", "became", "because", "become", "becomes", "becoming", "been", "before", "beforehand", "begin", "behind", "being", "believe", "below", "beside", "besides", "best", "better", "between", "beyond", "both", "brief", "but", "by", "c", "came", "can", "cannot", "cant", "can't", "caption", "cause", "causes", "certain", "certainly", "changes", "clearly", "c'mon", "co", "co.", "com", "come", "comes", "concerning", "consequently", "consider", "considering", "contain", "containing", "contains", "corresponding", "could", "couldn't", "course", "c's", "currently", "d", "dare", "daren't", "definitely", "described", "despite", "did", "didn't", "different", "directly", "do", "does", "doesn't", "doing", "done", "don't", "down", "downwards", "during", "e", "each", "edu", "eg", "eight", "eighty", "either", "else", "elsewhere", "end", "ending", "enough", "entirely", "especially", "et", "etc", "even", "ever", "evermore", "every", "everybody", "everyone", "everything", "everywhere", "ex", "exactly", "example", "except", "f", "fairly", "far", "farther", "few", "fewer", "fifth", "first", "five", "followed", "following", "follows", "for", "forever", "former", "formerly", "forth", "forward", "found", "four", "from", "further", "furthermore", "g", "get", "gets", "getting", "given", "gives", "go", "goes", "going", "gone", "got", "gotten", "greetings", "h", "had", "hadn't", "half", "happens", "hardly", "has", "hasn't", "have", "haven't", "having", "he", "he'd", "he'll", "hello", "help", "hence", "her", "here", "hereafter", "hereby", "herein", "here's", "hereupon", "hers", "herself", "he's", "hi", "him", "himself", "his", "hither", "hopefully", "how", "howbeit", "however", "hundred", "i", "i'd", "ie", "if", "ignored", "i'll", "i'm", "immediate", "in", "inasmuch", "inc", "inc.", "indeed", "indicate", "indicated", "indicates", "inner", "inside", "insofar", "instead", "into", "inward", "is", "isn't", "it", "it'd", "it'll", "its", "it's", "itself", "i've", "j", "just", "k", "keep", "keeps", "kept", "know", "known", "knows", "l", "last", "lately", "later", "latter", "latterly", "least", "less", "lest", "let", "let's", "like", "liked", "likely", "likewise", "little", "look", "looking", "looks", "low", "lower", "ltd", "m", "made", "mainly", "make", "makes", "many", "may", "maybe", "mayn't", "me", "mean", "meantime", "meanwhile", "merely", "might", "mightn't", "mine", "minus", "miss", "more", "moreover", "most", "mostly", "mr", "mrs", "much", "must", "mustn't", "my", "myself", "n", "name", "namely", "nd", "near", "nearly", "necessary", "need", "needn't", "needs", "neither", "never", "neverf", "neverless", "nevertheless", "new", "next", "nine", "ninety", "no", "nobody", "non", "none", "nonetheless", "noone", "no-one", "nor", "normally", "not", "nothing", "notwithstanding", "novel", "now", "nowhere", "o", "obviously", "of", "off", "often", "oh", "ok", "okay", "old", "on", "once", "one", "ones", "one's", "only", "onto", "opposite", "or", "other", "others", "otherwise", "ought", "oughtn't", "our", "ours", "ourselves", "out", "outside", "over", "overall", "own", "p", "particular", "particularly", "past", "per", "perhaps", "placed", "please", "plus", "possible", "presumably", "probably", "provided", "provides", "q", "que", "quite", "qv", "r", "rather", "rd", "re", "really", "reasonably", "recent", "recently", "regarding", "regardless", "regards", "relatively", "respectively", "right", "round", "s", "said", "same", "saw", "say", "saying", "says", "second", "secondly", "see", "seeing", "seem", "seemed", "seeming", "seems", "seen", "self", "selves", "sensible", "sent", "serious", "seriously", "seven", "several", "shall", "shan't", "she", "she'd", "she'll", "she's", "should", "shouldn't", "since", "six", "so", "some", "somebody", "someday", "somehow", "someone", "something", "sometime", "sometimes", "somewhat", "somewhere", "soon", "sorry", "specified", "specify", "specifying", "still", "sub", "such", "sup", "sure", "t", "take", "taken", "taking", "tell", "tends", "th", "than", "thank", "thanks", "thanx", "that", "that'll", "thats", "that's", "that've", "the", "their", "theirs", "them", "themselves", "then", "thence", "there", "thereafter", "thereby", "there'd", "therefore", "therein", "there'll", "there're", "theres", "there's", "thereupon", "there've", "these", "they", "they'd", "they'll", "they're", "they've", "thing", "things", "think", "third", "thirty", "this", "thorough", "thoroughly", "those", "though", "three", "through", "throughout", "thru", "thus", "till", "to", "together", "too", "took", "toward", "towards", "tried", "tries", "truly", "try", "trying", "t's", "twice", "two", "u", "un", "under", "underneath", "undoing", "unfortunately", "unless", "unlike", "unlikely", "until", "unto", "up", "upon", "upwards", "us", "use", "used", "useful", "uses", "using", "usually", "v", "value", "various", "versus", "very", "via", "viz", "vs", "w", "want", "wants", "was", "wasn't", "way", "we", "we'd", "welcome", "well", "we'll", "went", "were", "we're", "weren't", "we've", "what", "whatever", "what'll", "what's", "what've", "when", "whence", "whenever", "where", "whereafter", "whereas", "whereby", "wherein", "where's", "whereupon", "wherever", "whether", "which", "whichever", "while", "whilst", "whither", "who", "who'd", "whoever", "whole", "who'll", "whom", "whomever", "who's", "whose", "why", "will", "willing", "wish", "with", "within", "without", "wonder", "won't", "would", "wouldn't", "x", "y", "yes", "yet", "you", "you'd", "you'll", "your", "you're", "yours", "yourself", "yourselves", "you've", "z", "zero");
}
Aggiungendo il codice aggiuntivo qui sotto al tuo file functions.php, rimuoverà/nasconderà l'opzione dello slug nel menu a discesa delle impostazioni dello schermo e anche il metabox.
// NASCONDI IL METABOX DELLO SLUG E LE OPZIONI SCHERMO SLUG
function hide_slug_options() {
global $post;
global $pagenow;
$hide_slugs = "<style type=\"text/css\">#slugdiv, #edit-slug-box, [for=\"slugdiv-hide\"] { display: none; }</style>\n";
if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php') print($hide_slugs);
}
add_action( 'admin_head', 'hide_slug_options' );

Escludere le categorie figlie di una categoria specifica
Abbastanza semplice, ma non ho trovato nessuno che facesse esattamente ciò di cui avevo bisogno. Inoltre, mostrerà il post se viene selezionata la categoria genitore, a meno che quel post non abbia selezionata una categoria figlia di quel genitore.
/* questo codice esclude tutti i post delle categorie figlie (ID categoria = 20)
nella pagina HOME, ma permette di mostrare la categoria genitore (ID categoria = 20). */
function exclude_category_children($query) {
$child_cats = (array) get_term_children('20', 'category');
if ( $query->is_home ) {
$query->set('category__not_in', $child_cats);
return $query;
}
}
add_filter('pre_get_posts', 'exclude_category_children');

Consenti iFrame nell'Editor di WordPress
// permette a TinyMCE di accettare iframe add_filter('tiny_mce_before_init', create_function( '$a', '$a["extended_valid_elements"] = "iframe[id|class|title|style|align|frameborder|height|longdesc|marginheight|marginwidth|name|scrolling|src|width]"; return $a;') );

Rimuovi i menu del backend di amministrazione per tutti gli utenti, tranne l'Utente #1 (solitamente il primo amministratore)
/*-----------------------------------------------------------------------------------*/
/* Restringe l'accesso
/*-----------------------------------------------------------------------------------*/
function remove_menus () {
global $menu;
$user = wp_get_current_user();
if ($user->ID!=1) { // Non è l'amministratore,
$restricted = array(__('Pannello'), __('Articoli'), __('Media'), __('Link'), __('Pagine'), __('Aspetto'), __('Strumenti'), __('Utenti'), __('Impostazioni'), __('Commenti'), __('Plugin'));
end ($menu);
while (prev($menu)){
$value = explode(' ',$menu[key($menu)][0]);
if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
}
}
}
add_action('admin_menu', 'remove_menus');

L'utente 1 potrebbe essere il primo amministratore. Ma dopo aver aggiunto nuovi amministratori, il primo potrebbe diventare un semplice utente normale. Chiedi le capacità, non i numeri. Inoltre, questo codice dovrebbe stare in un plugin, non nel functions.php. Non c'è alcuna relazione con il tema.

In questo modo puoi permettere a tutti gli amministratori di agire normalmente ma allo stesso tempo nascondere il primo amministratore e riservarlo all'amministratore di sistema / team di supporto. Non sono d'accordo che questo codice debba stare in un plugin. Il functions.php è già un plugin. Questo file fondamentalmente si comporta come un plugin
Sviluppo_Temi#File_Funzioni

Ma il functions.php contiene logica legata al tema, perché se cambi tema tutto il codice scompare. Quindi, a meno che il codice non dipenda dal tema e viceversa - non usare il functions.php come un mu-plugin.

Sì. Ma consideriamo questo: stai sviluppando un sito web per un cliente. Questo sito utilizzerà sempre un solo tema, quello progettato dal designer. Il tema è il sito. Aggiungi tipi di post personalizzati, metabox, carichi funzioni aggiuntive, ecc. Ora vuoi dare ad alcuni utenti le capacità di amministrazione, ma vuoi nascondere alcune sezioni del sito che il tuo cliente non utilizzerà mai o che potrebbero confonderlo (Link, Strumenti, Commenti, sono i migliori esempi) e dare al team di supporto una sorta di "SuperAdmin" in modo che possano vedere l'intera area di amministrazione.

Vedo che non sei d'accordo con l'utilizzo, ma la funzione funziona ed è utile, quindi non capisco perché votare -1.

Non dovrebbe trovarsi in un functions.php – come molte risposte qui, purtroppo – e si romperà prima o poi. Inoltre, viola gli standard di codifica di WordPress. Per favore, non prenderla come una questione personale. Il mio voto è un consiglio per il lettore.

Ovviamente, nulla di personale, tosco. Tutti cerchiamo di aiutare e imparare. Non siamo d'accordo, succede :)

@Daniel Sachs Dai un'occhiata a questo gist e sostituisci user_login
con role
(?).

@kaiser Questo è ottimo, se volessi usarlo come plugin o rimuovere i menu per tutti gli amministratori. Come ho detto, questo permette di rimuovere solo per un utente specifico con ID1

Disabilitare l'avviso di aggiornamento del browser in WordPress 3.2
// Disabilita l'avviso di aggiornamento del browser in WordPress 3.2
function disable_browser_upgrade_warning() {
remove_meta_box( 'dashboard_browser_nag', 'dashboard', 'normal' );
}
add_action( 'wp_dashboard_setup', 'disable_browser_upgrade_warning' );

Mostra i file template inclusi
Visualizza un commento inline con il File Template e i file get_template_part inclusi durante il rendering delle pagine. Utile per il troubleshooting di template multiparte.
add_action('all','template_snoop');
function template_snoop(){
$args = func_get_args();
if( !is_admin() and $args[0] ){
if( $args[0] == 'template_include' ) {
echo "<!-- Template Base: {$args[1]} -->\n";
} elseif( strpos($args[0],'get_template_part_') === 0 ) {
global $last_template_snoop;
if( $last_template_snoop )
echo "\n\n<!-- Fine Template Part: {$last_template_snoop} -->";
$tpl = rtrim(join('-', array_slice($args,1)),'-').'.php';
echo "\n<!-- Template Part: {$tpl} -->\n\n";
$last_template_snoop = $tpl;
}
}
}

Funzione Condizionale is_tree()
/* Adattato da csstricks con l'aggiunta degli
antenati .... uso = if(is_tree($id)) { // fai qualcosa } ... Restituisce true se la
pagina è = $id OPPURE qualsiasi sua pagina figlia OPPURE discendenti */
function is_tree($pid) { // $pid = L'ID della pagina sotto cui cerchiamo le pagine
global $post; // carica i dettagli su questa pagina
$ancestors = get_post_ancestors($post);
if(is_page()&&($post->post_parent==$pid||is_page($pid)||(in_array($pid,$ancestors))))
return true; // siamo nella pagina o in una sottopagina
else
return false; // siamo altrove
};

Mostra gli utenti che hanno inviato il maggior numero di commenti senza un plugin
function top_comment_authors($amount = 5) {
global $wpdb;
$results = $wpdb->get_results('
SELECT
COUNT(comment_author_email) AS comments_count, comment_author_email, comment_author, comment_author_url
FROM '.$wpdb->comments.'
WHERE comment_author_email != "" AND comment_type = "" AND comment_approved = 1
GROUP BY comment_author_email
ORDER BY comments_count DESC, comment_author ASC
LIMIT '.$amount
);
$output = "<ul>";
foreach($results as $result) {
$output .= "<li>".$result->comment_author."</li>";
}
$output .= "</ul>";
echo $output;
}
Altre opzioni che puoi utilizzare: $result->comment_author_email $result->comments_count $result->comment_author_url

Ottieni il vero indirizzo IP dell'utente quando possibile
Testato su: Wordpress 3.0.1
Se stai utilizzando un proxy o un load balancer, aggiungi questo codice al tuo file wp-config.php o functions.php
// Ottiene il vero indirizzo IP dell'utente
$_SERVER['REMOTE_ADDR'] = getRealIpAddress();
function getRealIpAddress( $validate = true ) {
if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($ips[count($ips) - 1]);
} elseif ( isset($_SERVER['HTTP_X_REAL_IP']) && !empty($_SERVER['HTTP_X_REAL_IP']) ) {
$ip = $_SERVER['HTTP_X_REAL_IP'];
} elseif ( isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP']) ) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
if ( $validate && function_exists('filter_var') && filter_var($ip, FILTER_VALIDATE_IP, array('flags' => FILTER_FLAG_IPV4, FILTER_FLAG_NO_PRIV_RANGE, FILTER_FLAG_NO_RES_RANGE)) )
return $ip;
elseif ( $validate )
return long2ip(ip2long($ip));
return $ip;
}

Quando un utente è dietro un proxy o un load balancer, qualsiasi cosa che ottenga l'indirizzo IP dell'utente utilizzando il superglobale $_SERVER['REMOTE_ADDR'] vedrà l'indirizzo IP del proxy o del load balancer. Il proxy/lb a sua volta inserisce l'indirizzo IP originale dell'utente negli header X-Forwarded-For, X-Real-Ip o Client-Ip (a seconda della configurazione del proxy/lb). Pertanto, quando si commenta (o si pubblica, ma è meno rilevante) WP vedrà molti utenti provenienti dallo stesso indirizzo IP. Questo lo risolve sostituendo $_SERVER['REMOTE_ADDR'] con l'IP originale.

Escludi la categoria predefinita dalle pagine pubbliche
Esclude la categoria predefinita dalla parte pubblica del sito web.
Il codice esclude l'area di amministrazione, altrimenti non avresti modo di gestire gli articoli assegnati alla categoria predefinita.
add_filter( 'list_terms_exclusions', 'exclude_default_cat' );
function exclude_default_cat( $exclusioni ) {
if( !is_admin() )
$exclusioni .= "AND t.term_id != " . get_option( 'default_category' ) . " ";
return $exclusioni;
}

Rimuovi il link "Commenti" dalla barra di amministrazione se lo stato dei commenti è chiuso
Puoi impostare lo stato predefinito dei commenti su 'closed', ma il link ai commenti rimarrà visibile. Basta inserire il seguente codice nel tuo file functions.php
per rimuoverlo in base alla condizione. Offre 2 approcci diversi.
/**
* Disabilita il link 'Commenti' se lo stato predefinito è _closed_
*/
function remove_comments()
{
$default_comment_status = get_option( 'default_comment_status' );
if ( $default_comment_status == 'closed' )
{
remove_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 50 );
// soluzione opzionale utilizzando la classe WP_Admin_Bar da /wp-includes/class-wp-admin-bar.php
# global $wp_admin_bar;
# $wp_admin_bar->remove_menu( 'comments' );
}
else
{
return;
}
}

Aggiunge un menu a discesa personalizzato a WP_NAV_MENUS dove l'utente può selezionare una classe CSS predefinita per ogni voce del menu
<?php function menu_item_class_select(){
global $pagenow;
if ($pagenow == "nav-menus.php"){
?>
<script>
jQuery(document).ready(function(){
function create_dd(v){
//crea il menu a discesa
var dd = jQuery('<select class="my_class"></select>');
//crea le opzioni del menu
//array con le opzioni desiderate
var classes = ["","class1","class2","class3"];
jQuery.each(classes, function(i,val) {
if (v == val){
dd.append('<option value="'+val+'" selected="selected">'+val+'</option>');
}else{
dd.append('<option value="'+val+'">'+val+'</option>');
}
});
return dd;
}
jQuery(".edit-menu-item-classes").each(function() {
//aggiunge il menu a discesa
var t = create_dd(jQuery(this).val());
jQuery(this).before(t);
//nasconde tutti gli input
jQuery(this).css("display","none");
});
//aggiorna l'input alla selezione
jQuery(".my_class").bind("change", function() {
var v = jQuery(this).val();
var inp = jQuery(this).next();
inp.attr("value",v);
});
});
</script>
<?php } }
add_action('admin_footer','menu_item_class_select');
?>

Rimuovi le voci del menu della Barra di Amministrazione di WordPress 3.3
function dashboard_tweaks() {
global $wp_admin_bar;
$wp_admin_bar->remove_menu('wp-logo');
$wp_admin_bar->remove_menu('about');
$wp_admin_bar->remove_menu('wporg');
$wp_admin_bar->remove_menu('documentation');
$wp_admin_bar->remove_menu('support-forums');
$wp_admin_bar->remove_menu('feedback');
$wp_admin_bar->remove_menu('view-site');
}
add_action( 'wp_before_admin_bar_render', 'dashboard_tweaks' );
Riferimento: http://pastebin.com/Wrk0JPxw

Query per Tag tra Tassonomie Incrociate
Una query memorizzata nella cache che restituisce una stringa HTML simile a get_tags()
con tutti i tag per un determinato parametro di Tassonomia, predefinito come Categoria. Puoi utilizzare $where_slug
e $where_tax
per ottenere i tag degli articoli filtrati da qualsiasi altra tassonomia. SQL testato da WP 3.1 a WP 3.3.1.
function tags_by_other_taxonomy($where_slug,$where_tax = 'category',$bust_cache = false) {
$cache_key = "{$where_slug}:{$where_tax}";
$cache = get_transient('tags_by_other_taxonomy');
$html = '';
if( true !== $bust_cache and false !== $cache and isset($cache[$cache_key]) and !empty($cache[$cache_key]) ) {
$html = $cache[$cache_key];
} else {
global $wpdb;
$cat_id = $wpdb->get_var("SELECT tt.term_taxonomy_id FROM $wpdb->terms t INNER JOIN $wpdb->term_taxonomy tt ON t.term_id = tt.term_id WHERE t.slug = '{$where_slug}' AND tt.taxonomy = '{$where_tax}' LIMIT 1");
if( !empty($cat_id) ) {
$cat_posts = $wpdb->get_col("SELECT tr.object_id FROM $wpdb->term_relationships tr inner join $wpdb->posts p ON p.ID = tr.object_id WHERE term_taxonomy_id = {$cat_id} AND p.post_status = 'publish' AND p.post_type = 'post'");
if( count($cat_posts) ) {
$tags = $wpdb->get_results("SELECT DISTINCT t.name,t.slug FROM $wpdb->term_taxonomy tt
INNER JOIN $wpdb->term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
INNER JOIN $wpdb->terms t ON t.term_id = tt.term_id
WHERE tt.taxonomy = 'post_tag' and tr.object_id IN (".implode(',',$cat_posts) .')');
$html = '<ul class="post-tags-'.$where_slug.'">';
if( count($tags) ) {
foreach($tags as $tag)
$html .= '<li><a href="/tag/'.$tag->slug.'/" title="Articoli con tag '.$tag->name.'">'.$tag->name.'</a></li>';
}
$html .= '</ul>';
if( !is_array($cache) )
$cache = array();
$cache[$cache_key] = $html;
set_transient('sc_cross_tax', $cache, 86400);
}
}
}
echo $html;
}
Ad esempio, per ottenere tutti i tag per gli Articoli Pubblicati nello slug della Categoria news:
<?php echo tags_by_other_taxonomy('news'); ?>
