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.

Includi tipi di post personalizzati nel widget amministrativo "Right Now"
Questo codice includerà i tuoi tipi di post personalizzati e i conteggi dei post per ogni tipo nel widget della dashboard "Right Now".
// AGGIUNGI TIPI DI POST PERSONALIZZATI AL WIDGET 'RIGHT NOW' DELLA DASHBOARD
function wph_right_now_content_table_end() {
$args = array(
'public' => true ,
'show_ui' => 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 b b-' . $post_type->name . '">' . $num . '</td>';
echo '<td class="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' );

Improvvisamente, è apparso un tipo di post "WooFramework Internal Container" nel widget RightNow! . . . è necessario un argomento aggiuntivo 'show_ui' => true
e ora è tutto a posto

Aggiungi un modulo di ricerca del Codex nell'intestazione della dashboard
Questo è un modo semplice per aggiungere un modulo di ricerca del Codex nell'intestazione della dashboard, in alto a destra accanto al menu a discesa dei collegamenti rapidi.
/**
* AGGIUNGI UN MODULO DI RICERCA DEL CODEX WP NELL'INTESTAZIONE DELLA DASHBOARD
*/
function wp_codex_search_form() {
echo '<form target="_blank" method="get" action="http://wordpress.org/search/do-search.php" class="alignright" style="margin: 11px 5px 0;">
<input type="text" onblur="this.value=(this.value==\'\') ? \'Cerca nel Codex\' : this.value;" onfocus="this.value=(this.value==\'Cerca nel Codex\') ? \'\' : this.value;" maxlength="150" value="Cerca nel Codex" name="search" class="text"> <input type="submit" value="Vai" class="button" />
</form>';
}
if( current_user_can( 'manage_plugins' )) {
// Il numero 11 deve essere 10 per far funzionare questo codice!
add_filter( 'in_admin_header', 'wp_codex_search_form', 11 );
}

puoi aggiornare questo codice per mostrarlo solo agli utenti con un ruolo specifico (in particolare agli amministratori)?

@NetConstructor.com L'ho modificato per mostrare se current_user_can gestisce i plugin, quindi aggiungi il filtro. È così semplice.

Funziona ancora nella versione attuale di WP... non sono riuscito a farlo funzionare

Nuova Colonna nella Libreria Media per Ricollegare le Immagini
Questo codice aggiunge una nuova colonna alla pagina della Libreria Media che permette di ricollegare le immagini
add_filter("manage_upload_columns", 'upload_columns');
add_action("manage_media_custom_column", 'media_custom_columns', 0, 2);
function upload_columns($columns) {
unset($columns['parent']);
$columns['better_parent'] = "Genitore";
return $columns;
}
function media_custom_columns($column_name, $id) {
$post = get_post($id);
if($column_name != 'better_parent')
return;
if ( $post->post_parent > 0 ) {
if ( get_post($post->post_parent) ) {
$title =_draft_or_post_title($post->post_parent);
}
?>
<strong><a href="<?php echo get_edit_post_link( $post->post_parent ); ?>"><?php echo $title ?></a></strong>, <?php echo get_the_time(__('Y/m/d')); ?>
<br />
<a class="hide-if-no-js" onclick="findPosts.open('media[]','<?php echo $post->ID ?>');return false;" href="#the-list"><?php _e('Ricollega'); ?></a>
<?php
} else {
?>
<?php _e('(Scollegato)'); ?><br />
<a class="hide-if-no-js" onclick="findPosts.open('media[]','<?php echo $post->ID ?>');return false;" href="#the-list"><?php _e('Collega'); ?></a>
<?php
}
}

Loop personalizzato a tema utilizzando shortcode
Gli argomenti sono gli stessi di quelli di query_posts. Il contenuto racchiuso tra i tag query è il template.
add_shortcode('query', 'shortcode_query');
function shortcode_query($atts, $content){
extract(shortcode_atts(array( // alcuni valori predefiniti
'posts_per_page' => '10',
'caller_get_posts' => 1,
'post__not_in' => get_option('sticky_posts'),
), $atts));
global $post;
$posts = new WP_Query($atts);
$output = '';
if ($posts->have_posts())
while ($posts->have_posts()):
$posts->the_post();
// questi argomenti saranno disponibili all'interno di $content
$parameters = array(
'PERMALINK' => get_permalink(),
'TITLE' => get_the_title(),
'CONTENT' => get_the_content(),
'COMMENT_COUNT' => $post->comment_count,
'CATEGORIES' => get_the_category_list(', '),
// aggiungi qui altri...
);
$finds = $replaces = array();
foreach($parameters as $find => $replace):
$finds[] = '{'.$find.'}';
$replaces[] = $replace;
endforeach;
$output .= str_replace($finds, $replaces, $content);
endwhile;
else
return; // nessun post trovato
wp_reset_query();
return html_entity_decode($output);
}
Utilizzo:
[query post_type=page posts_per_page=5]
Elenco di alcune pagine:
<h5>{TITLE}</h5>
<div>{CONTENT}</div>
<p><a href="{PERMALINK}">{COMMENT_COUNT} commenti</a></p>
[/query]
(eseguirà una query per 5 pagine)
Inserire widget preconfigurati ovunque utilizzando shortcode
(alcune idee da http://webdesign.anmari.com/shortcode-any-widget)
add_action('widgets_init', 'create_arbitrary_sidebar');
function create_arbitrary_sidebar(){
register_sidebar(array(
'name' => __('Widget Arbitrari'),
'id' => 'arbitrary',
'description' => sprintf(__('I widget di questa area possono essere aggiunti a post/pagine utilizzando gli shortcode %1$s o %2$s.'), '[widget ID]', '[widget Name]'),
'before_widget' => '<div class="block"><div class="block-content block-%2$s clear-block" id="instance-%1$s">',
'after_widget' => '</div></div>',
'before_title' => '<h3 class="title">',
'after_title' => '</h3>'
));
}
add_action('in_widget_form', 'widget_shortcodes_info', 10, 3);
function widget_shortcodes_info($widget, $return, $instance){
if(!is_numeric($widget->number)) return; // bug di wp-save :( il widget deve essere salvato prima...
global $wp_registered_widgets;
// ottieni i widget attivi da tutte le sidebar
$sidebars_widgets = wp_get_sidebars_widgets();
// prepara i match
$matches = array();
foreach($wp_registered_widgets as $i => $w)
if($w['name'] == $widget->name) $matches[] = $w['id'];
// scopri la posizione del widget (numero)
$number = 0;
$is_arbitrary = false;
if(!empty($sidebars_widgets['arbitrary']))
foreach($sidebars_widgets['arbitrary'] as $i => $value):
if(in_array($value, $matches) && !$is_arbitrary) $number = $number +1;
if($value == $widget->id) $is_arbitrary = true;
endforeach;
echo '<div style="background:#eee; padding: 5px;">Per includere questo widget nei tuoi post o pagine usa uno dei seguenti shortcode: <br />';
echo '<code>[widget '.substr(md5($widget->id), 0, 8).']</code> <br /> <code>[widget "'.$widget->name.'"'.(($number > 1) ? ' number='.$number : null).']</code></div>';
}
add_shortcode('widget', 'shortcode_widget');
function shortcode_widget($atts){
global $wp_registered_widgets, $wp_registered_sidebars;
extract(shortcode_atts(array(
'number' => false, // considerato solo se il 1° argomento è il "Nome del Widget" (non l'ID hash)
'title' => true, // mostra i titoli?
'area' => 'arbitrary' // sidebar da cercare
), $atts));
// ottieni il 1° parametro (presumendo che sia l'ID o il nome del widget target)
if (!empty($atts[0])) $widget = esc_attr($atts[0]); else return;
$sidebar = esc_attr($area);
$number = intval($number);
$callback = false;
$possible_matches = array();
$sidebars_widgets = wp_get_sidebars_widgets();
if((empty($sidebars_widgets[$sidebar]) || empty($wp_registered_widgets)) && (current_user_can('edit_themes')))
return "nessun widget attivo valido in {$sidebar}";
// presumendo che otteniamo l'ID hash md5
foreach ($wp_registered_widgets as $i => $w)
if ($widget == substr(md5($w['id']), 0, 8)):
$callback = ($w['callback']);
$widget = $w['id']; // ID reale del widget
// confronta anche i nomi dei widget e costruisce un array con i possibili match
// (usato successivamente se il match dell'ID fallisce)
elseif($widget == $w['name']):
$possible_matches[] = $w['id'];
endif;
// nulla trovato, presumi che sia il "Nome del Widget".
if(!$callback):
$valid_matches = array();
foreach($sidebars_widgets[$sidebar] as $i => $w)
foreach($possible_matches as $id) if($id == $w) $valid_matches[] = $w;
if(!empty($valid_matches)) $widget = $number ? $valid_matches[$number-1] : $widget = $valid_matches[0];
if($widget && isset($wp_registered_widgets[$widget]['callback'])) $callback = $wp_registered_widgets[$widget]['callback'];
endif;
// evviva. l'abbiamo trovato
if($callback):
ob_start();
$params = array_merge(array(array_merge($wp_registered_sidebars[$sidebar], array('widget_id' => $widget, 'widget_name' => $wp_registered_widgets[$widget]['name']))), (array)$wp_registered_widgets[$widget]['params']);
$classname_ = '';
foreach ((array)$wp_registered_widgets[$widget]['classname'] as $cn)
if (is_string($cn)) $classname_ .= '_'.$cn; elseif (is_object($cn)) $classname_ .= '_'.get_class($cn);
$classname_ = ltrim($classname_, '_');
$params[0]['before_widget'] = sprintf($params[0]['before_widget'], $widget, $classname_);
$params = apply_filters('dynamic_sidebar_params', $params);
if (is_callable($callback)) call_user_func_array($callback, $params);
$output = ob_get_clean();
// rimuovi h3 se title = false
if(!$title) $output = preg_replace('#<h3 class="title">(.*?)</h3>#', '', $output);
return $output;
else:
return "istanza widget non trovata: ".esc_attr($atts[0]);
endif;
}
Utilizzo:
Aggiungi un widget nella sidebar "widget arbitrari", salvalo e otterrai gli shortcode :)
Ottenere il valore di un campo personalizzato tramite shortcode
add_shortcode('field', 'shortcode_field');
function shortcode_field($atts){
extract(shortcode_atts(array(
'post_id' => NULL,
), $atts));
if(!isset($atts[0])) return;
$field = esc_attr($atts[0]);
global $post;
$post_id = (NULL === $post_id) ? $post->ID : $post_id;
return get_post_meta($post_id, $field, true);
}
Utilizzo:
[field "my_key"]
[field "my_key" post_id=1]
Ottenere il TinyURL di un link tramite shortcode
add_shortcode('tinyurl', 'shortcode_tinyurl');
function shortcode_tinyurl($atts){
extract(shortcode_atts(array(
'url' => get_permalink(),
'title' => '',
'rel' => 'nofollow'
), $atts));
if(!$title) $title = $url;
if (FALSE === ($cache = get_transient('tinyurl_'+md5($url)))):
$cache = wp_remote_retrieve_body(wp_remote_get('http://tinyurl.com/api-create.php?url='.$url));
set_transient('tinyurl_'+md5($url), $cache, 60*60*24); // cache di 1 giorno, potrebbe essere aumentata
endif;
return '<a href="'.esc_url($cache).'" rel="'.esc_attr($rel).'">'.esc_attr($title).'</a>';
}
Utilizzo:
[tinyurl]
[tinyurl url="http://google.com" title="google"]

Imposta l'Editor Predefinito su WYSIWYG o HTML
function my_default_editor() {
$r = 'tinymce'; // html o tinymce
return $r;
}
add_filter( 'wp_default_editor', 'my_default_editor' );
Ecco come rimuovere l'Editor HTML
jQuery(document).ready(function($) {
$("#edButtonHTML").remove();
});
AGGIORNATO ecco un altro modo per impostare l'editor predefinito su HTML
add_filter('wp_default_editor', create_function('', 'return "html";'));

vedi maggiori informazioni sull'origine: http://wpengineer.com/1946/disable-html-editor-wordpress/

Rimuovi il Metabox/Autore Opzioni e Spostalo nel Metabox Pubblica
Testato su: Wordpress 3.0.1
Una delle cose che mi danno fastidio è un'area di amministrazione di Wordpress disordinata. Uno degli elementi che ora configuro sempre fin dall'inizio nel mio file functions.php è la rimozione del MetaBox Autore e delle Opzioni Schermo, per poi aggiungere l'opzione nel metabox Pubblica. Secondo me questo ha senso e mantiene tutto più pulito. Inoltre, rispetta i permessi applicabili.
Per raggiungere questo obiettivo, copia e incolla il seguente codice nel tuo file functions.php.
Se pensi che ci sia un modo migliore per farlo, suggeriscilo.
NOTA: CODICE AGGIORNATO PER RISOLVERE UN PROBLEMA DI CODICE
// SPOSTA IL METABOX AUTORE NEL METABOX PUBBLICA
add_action( 'admin_menu', 'remove_author_metabox' );
add_action( 'post_submitbox_misc_actions', 'move_author_to_publish_metabox' );
function remove_author_metabox() {
remove_meta_box( 'authordiv', 'post', 'normal' );
}
function move_author_to_publish_metabox() {
global $post_ID;
$post = get_post( $post_ID );
echo '<div id="author" class="misc-pub-section" style="border-top-style:solid; border-top-width:1px; border-top-color:#EEEEEE; border-bottom-width:0px;">Autore: ';
post_author_meta_box( $post );
echo '</div>';
}

Non aggiunge il Metabox dell'Autore al mio Publish Box. Ho pensato che fosse perché non c'era un add_action
per la funzione move_author_to_publish_box
quindi ho aggiunto add_action('admin_menu', 'move_author_to_publish_box');
ma questo mi ha dato un "Fatal error: Call to undefined function post_author_meta_box()"

E come aggiungeresti l'autore a publish? Su admin_init o su admin_menu non funzionerebbe.

@kaiser -- Non sono sicuro di aver capito la tua domanda. Questo codice semplicemente rimuove il metabox "autore" e sposta l'opzione per selezionare l'autore nel metabox "pubblica".

@NetConstructor: Ho appena fatto un test ieri (versione 3.0.4) e sì, il box autore è sparito, ma non è stato spostato nel box pubblica. Guardando il codice non vedo come possa funzionare, perché la funzione non viene mai attivata... hai solo aggiunto la funzione remove_author_box() all'hook admin_menu, ma non la move_author_to_publish_box().

@kaiser -- hai ragione, dopo aver rivisto il codice ho notato il problema. Ho aggiornato il codice nella mia risposta quindi cancella tutto quello che hai incluso prima e incolla il codice completo sopra. Fammi sapere se risolve il problema. Vota positivamente la domanda e la risposta se risolve il problema - CH :)

@CH/NC: Certo che funziona, non c'è nemmeno bisogno di testarlo. Voto positivo: n/p. Potrebbe/Dovrebbe essere esteso per includere anche altre cose superflue/disordinate... (discussioni, anteprima del post). Non modificherò la tua risposta, ma se hai un po' di tempo, varrebbe la pena farne anche un post sul blog. :)

@kaiser -- non sono esattamente sicuro di dove vedi il valore in questo? Il mio obiettivo era solo rimuovere alcuni metabox che erano extra e non necessari come slug e autori.

@tu: No, io vedo assolutamente il beneficio. Non solo mi hai frainteso, ma mi hai capito completamente al contrario. Ho detto che è così buono che a) dovrebbe essere esteso a discussioni & anteprime e b) meriterebbe un post sul blog tipo "ripulire le pagine di modifica dei contenuti" o simili. Edit: Con "nessun bisogno di testare" intendo che so già che funziona.

@kaiser -- apprezzo il complimento, ma quello che ancora non capisco è come vedi che possa essere utile agli utenti avere discussioni o miniature integrate nel metabox di pubblicazione. Ho visto solo il vantaggio di rimuovere i metabox per lo slug e l'autore, visto che logicamente dovrebbero essere all'interno del metabox di pubblicazione. Sto ancora fraintendendo il tuo punto?

@NC: No, mi hai capito bene. Per me non è "il box di pubblicazione", ma semplicemente un box sul lato destro in alto per cose piccole. Non vedo la necessità di avere un box separato per la singola riga di testo "aggiungi miniatura" o per le due checkbox delle discussioni. Nient'altro.

Determina rapidamente i dettagli del server e dell'ambiente
Se disponi di più server e più ambienti come sviluppo, QA e ambienti di produzione, questa soluzione può essere molto utile.
Per i miei sistemi, l'ambiente è determinato dalle prime 3 lettere del nome host, ma questo può essere facilmente modificato in base alle tue esigenze.
add_action( 'admin_notices', 'report_environment_status', 3 );
// Riporta i dettagli del server e dell'ambiente
function report_environment_status() {
$server = php_uname('n');
switch (strtolower(substr($server,0,3))) {
case 'pXX':
$msg = "PRODUZIONE";
break;
case 'qXX':
$msg = "QA";
break;
case 'dXX':
$msg = "SVILUPPO";
break;
default :
$msg = 'SCONOSCIUTO';
}
echo "<div id='update-nag'>";
echo "<b>Ti trovi nell'ambiente $msg. (Server: $server)</b>";
echo "</div>";
}
Questa soluzione mi ha salvato molte volte dall'apportare modifiche all'ambiente sbagliato.
Puoi anche trasformare questo codice in un plugin e attivarlo in rete in modo che tutti i siti ricevano la notifica.

grazie per questo articolo. Potresti per favore approfondire un po' di più su questo argomento e su diversi casi d'uso? Penso che sarebbe MOLTO utile per me e per altri se potessi includere anche altro codice che utilizzi quando esegui diverse versioni di sviluppo del codice. Inoltre, se utilizzi un modo efficiente per spostare un sito dall'ambiente di sviluppo a quello di produzione o migrare da un dominio a un altro. Tutte queste cose sono molto utili. Infine, utilizzi qualche tipo di client di subversion quando aggiorni i tuoi file? Se sì, c'è qualcosa di specifico che fai per questo?

Per favore non segnare questo come la risposta. Altrimenti questo elenco non funzionerà.

Penso che sarebbe meglio usare diverse classi CSS per il messaggio, in modo che i messaggi possano avere colori di sfondo diversi negli ambienti oltre ad avere solo un testo leggermente diverso. Altrimenti penso che smetteresti di notare rapidamente le differenze nel testo.

Corretto: Rimuovere i Meta Box Predefiniti di WordPress
Questo era molto utile ma conteneva alcuni errori
// RIMUOVI I META BOX DALLO SCHERMO PREdefinitO DEGLI ARTICOLI
function remove_default_post_screen_metaboxes() {
remove_meta_box( 'postcustom','post','normal' ); // Meta Box dei Campi Personalizzati
remove_meta_box( 'postexcerpt','post','normal' ); // Meta Box dell'Estratto
remove_meta_box( 'commentstatusdiv','post','normal' ); // Meta Box dei Commenti
remove_meta_box( 'trackbacksdiv','post','normal' ); // Meta Box dei Trackback
remove_meta_box( 'slugdiv','post','normal' ); // Meta Box dello Slug
remove_meta_box( 'authordiv','post','normal' ); // Meta Box dell'Autore
}
add_action('admin_menu','remove_default_post_screen_metaboxes');
// RIMUOVI I META BOX DALLO SCHERMO PREdefinitO DELLE PAGINE
function remove_default_page_screen_metaboxes() {
global $post_type;
remove_meta_box( 'postcustom','page','normal' ); // Meta Box dei Campi Personalizzati
remove_meta_box( 'postexcerpt','page','normal' ); // Meta Box dell'Estratto
remove_meta_box( 'commentstatusdiv','page','normal' ); // Meta Box dei Commenti
remove_meta_box('commentsdiv','page','normal'); // Commenti
remove_meta_box( 'trackbacksdiv','page','normal' ); // Meta Box dei Trackback
remove_meta_box( 'slugdiv','page','normal' ); // Meta Box dello Slug
remove_meta_box( 'authordiv','page','normal' ); // Meta Box dell'Autore
}
add_action('admin_menu','remove_default_page_screen_metaboxes');

Estensione del Periodo di Auto Disconnessione
Testato su: Wordpress 3.0.1
Utilizzando il codice qui sotto puoi aumentare il tempo di conservazione dei cookie e quindi gli utenti connessi rimarranno loggati più a lungo:
function keep_me_logged_in_for_1_year( $expirein ) {
return 31556926; // 1 anno in secondi
}
add_filter( 'auth_cookie_expiration', 'keep_me_logged_in_for_1_year' );

c'è un altro trucco che può essere usato e che ho trovato qui: http://wpengineer.com/2064/stop-wordpress-from-ever-logging-out/

Aggiungi un link "Impostazioni" per i plugin nella pagina dell'elenco plugin
Imposta il link "Impostazioni" per i plugin nella pagina dei plugin nel backend di WordPress, facile da usare per saltare alle impostazioni per gli utenti (il codice include anche una soluzione per versioni di WordPress inferiori alla 2.9)
// definizioni del plugin
define( 'FB_BASENAME', plugin_basename( __FILE__ ) );
define( 'FB_BASEFOLDER', plugin_basename( dirname( __FILE__ ) ) );
define( 'FB_FILENAME', str_replace( FB_BASEFOLDER.'/', '', plugin_basename(__FILE__) ) );
function filter_plugin_meta($links, $file) {
/* crea il link */
if ( $file == FB_BASENAME ) {
array_unshift(
$links,
sprintf( '<a href="options-general.php?page=%s">%s</a>', FB_FILENAME, __('Impostazioni') )
);
}
return $links;
}
global $wp_version;
if ( version_compare( $wp_version, '2.7alpha', '>' ) ) {
add_filter( 'plugin_action_links_' . FB_WM_BASENAME, 'filter_plugin_meta', 10, 2);
} else {
add_filter( 'plugin_action_links', 'filter_plugin_meta', 10, 2 );
}

Ho provato a utilizzare questo codice ma sembra che non funzioni su WordPress 3.1. Puoi confermare e aggiornarlo?

@NetConstructor.com Ho aggiornato un po' da uno dei miei plugin gratuiti, su tutti i miei plugin funziona bene questo

Ottimo! Stavo cercando proprio la funzione make_clickable()
per applicarla a the_content
! Perché non l'hanno fatto fin dall'inizio? È semplice come aggiungere add_filter( 'the_content', 'make_clickable');
In alternativa si potrebbe fare quando il post viene salvato utilizzando un hook diverso

Aggiungi filtro per i template di pagina alla lista delle pagine
Testato su: WP 3.1
Aggiunge un filtro per i template di pagina alla lista delle pagine, permettendo di visualizzare un elenco di pagine che utilizzano un determinato template.
class Page_Template_Filter {
private $templates = array();
public function __construct() {
// Se non siamo nell'area di amministrazione o l'utente non può modificare le pagine, usciamo
if( !is_admin() || !current_user_can('edit_pages') )
return;
add_action( 'parse_query', array( $this, 'pt_parse_query' ) );
add_action( 'restrict_manage_posts', array( $this, 'pt_restrict_manage_posts' ) );
}
public function pt_parse_query( $query ) {
global $pagenow, $post_type;
if( 'edit.php' != $pagenow )
return;
switch( $post_type ) {
case 'post':
break;
case 'page':
$this->templates = get_page_templates();
if( empty( $this->templates ) )
return;
if( !$this->is_set_template() )
return;
$meta_group = array( 'key' => '_wp_page_template', 'value' => $this->get_template() );
set_query_var( 'meta_query', array( $meta_group ) );
break;
}
}
public function pt_restrict_manage_posts() {
if( empty( $this->templates ) )
return;
$this->template_dropdown();
}
private function get_template() {
if( $this->is_set_template() )
foreach( $this->templates as $template ) {
if( $template != $_GET['page_template'] )
continue;
return $template;
}
return '';
}
private function is_set_template() {
return (bool) ( isset( $_GET['page_template'] ) && ( in_array( $_GET['page_template'], $this->templates ) ) );
}
private function template_dropdown() {
?>
<select name="page_template" id="page_template">
<option value=""> - nessun template - </option>
<?php foreach( $this->templates as $name => $file ): ?>
<option value="<?php echo $file; ?>"<?php selected( $this->get_template() == $file ); ?>><?php _e( $name ); ?></option>
<?php endforeach;?>
</select>
<?php
}
}
add_action('admin_init', 'load_ptf');
function load_ptf() {
$Page_Template_Filter = new Page_Template_Filter;
}
Richiede almeno la versione 3.1 per funzionare, anche se meta_query
potrebbe essere sostituito con i vecchi meta_key
e meta_value
per la versione 3.0.

Mostra solo i post e i media dell'Autore loggato & correggi i conteggi dei post/media nelle barre di filtro.
Testato su: Wordpress 3.4.1
Di default, WordPress permette agli Autori di vedere i titoli dei post di altri utenti, bozze non pubblicate e tutti i media, anche se non possono modificarli.
Usa questo codice per mostrare solo i post e i media dell'Autore attualmente loggato.
A differenza di altre soluzioni, questo sistema corregge anche i conteggi dei post/media nelle barre di filtro (Tutti|Pubblicati|Bozze|In attesa|Cestino; Tutte|Immagini|Video|Non allegati).
// Mostra solo post e media relativi all'autore loggato
add_action('pre_get_posts', 'query_set_only_author' );
function query_set_only_author( $wp_query ) {
global $current_user;
if( is_admin() && !current_user_can('edit_others_posts') ) {
$wp_query->set( 'author', $current_user->ID );
add_filter('views_edit-post', 'fix_post_counts');
add_filter('views_upload', 'fix_media_counts');
}
}
// Corregge i conteggi dei post
function fix_post_counts($views) {
global $current_user, $wp_query;
unset($views['mine']);
$types = array(
array( 'status' => NULL ),
array( 'status' => 'publish' ),
array( 'status' => 'draft' ),
array( 'status' => 'pending' ),
array( 'status' => 'trash' )
);
foreach( $types as $type ) {
$query = array(
'author' => $current_user->ID,
'post_type' => 'post',
'post_status' => $type['status']
);
$result = new WP_Query($query);
if( $type['status'] == NULL ):
$class = ($wp_query->query_vars['post_status'] == NULL) ? ' class="current"' : '';
$views['all'] = sprintf(__('<a href="%s"'. $class .'>Tutti <span class="count">(%d)</span></a>', 'all'),
admin_url('edit.php?post_type=post'),
$result->found_posts);
elseif( $type['status'] == 'publish' ):
$class = ($wp_query->query_vars['post_status'] == 'publish') ? ' class="current"' : '';
$views['publish'] = sprintf(__('<a href="%s"'. $class .'>Pubblicati <span class="count">(%d)</span></a>', 'publish'),
admin_url('edit.php?post_status=publish&post_type=post'),
$result->found_posts);
elseif( $type['status'] == 'draft' ):
$class = ($wp_query->query_vars['post_status'] == 'draft') ? ' class="current"' : '';
$views['draft'] = sprintf(__('<a href="%s"'. $class .'>Bozza'. ((sizeof($result->posts) > 1) ? "e" : "") .' <span class="count">(%d)</span></a>', 'draft'),
admin_url('edit.php?post_status=draft&post_type=post'),
$result->found_posts);
elseif( $type['status'] == 'pending' ):
$class = ($wp_query->query_vars['post_status'] == 'pending') ? ' class="current"' : '';
$views['pending'] = sprintf(__('<a href="%s"'. $class .'>In attesa <span class="count">(%d)</span></a>', 'pending'),
admin_url('edit.php?post_status=pending&post_type=post'),
$result->found_posts);
elseif( $type['status'] == 'trash' ):
$class = ($wp_query->query_vars['post_status'] == 'trash') ? ' class="current"' : '';
$views['trash'] = sprintf(__('<a href="%s"'. $class .'>Cestino <span class="count">(%d)</span></a>', 'trash'),
admin_url('edit.php?post_status=trash&post_type=post'),
$result->found_posts);
endif;
}
return $views;
}
// Corregge i conteggi dei media
function fix_media_counts($views) {
global $wpdb, $current_user, $post_mime_types, $avail_post_mime_types;
$views = array();
$_num_posts = array();
$count = $wpdb->get_results( "
SELECT post_mime_type, COUNT( * ) AS num_posts
FROM $wpdb->posts
WHERE post_type = 'attachment'
AND post_author = $current_user->ID
AND post_status != 'trash'
GROUP BY post_mime_type
", ARRAY_A );
foreach( $count as $row )
$_num_posts[$row['post_mime_type']] = $row['num_posts'];
$_total_posts = array_sum($_num_posts);
$detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );
if ( !isset( $total_orphans ) )
$total_orphans = $wpdb->get_var("
SELECT COUNT( * )
FROM $wpdb->posts
WHERE post_type = 'attachment'
AND post_author = $current_user->ID
AND post_status != 'trash'
AND post_parent < 1
");
$matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));
foreach ( $matches as $type => $reals )
foreach ( $reals as $real )
$num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];
$class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';
$views['all'] = "<a href='upload.php'$class>" . sprintf( __('Tutti <span class="count">(%s)</span>', 'file caricati' ), number_format_i18n( $_total_posts )) . '</a>';
foreach ( $post_mime_types as $mime_type => $label ) {
$class = '';
if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )
continue;
if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )
$class = ' class="current"';
if ( !empty( $num_posts[$mime_type] ) )
$views[$mime_type] = "<a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), $num_posts[$mime_type] ) . '</a>';
}
$views['detached'] = '<a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( __( 'Non allegati <span class="count">(%s)</span>', 'file non allegati' ), $total_orphans ) . '</a>';
return $views;
}

buono snippet, un solo inconveniente: se non ci sono elementi multimediali nella libreria genera errori perché il risultato non è un array.

Ho definito $_num_posts come un array. Questo dovrebbe risolvere gli errori che ottieni quando non ci sono elementi multimediali nella libreria.

So che è passato molto tempo per chiedere, ma ho provato con il mio cpt e il conteggio dei post sembra non funzionare anche se ho cambiato tutti i tour type con il mio cpt.
Inoltre, c'è qualche modo per applicare il filtro anche ai termini nel mio cpt?
Comunque, grazie mille per il tuo codice.

Rimuovi XML-RPC quando non in uso per migliorare le prestazioni
Testato su: WordPress 3.0.1
WordPress utilizza un'operazione CURL per verificare la capacità SSL per XML-RPC. Se stai utilizzando XML-RPC ma non ne hai bisogno, puoi rimuovere il filtro. Si tratta di un piccolo miglioramento delle prestazioni (dato che fondamentalmente WordPress esegue una GET cURL sull'URL https e ottiene 1) un messaggio di negato, oppure 2) si verifica un timeout, che può richiedere fino a 5 secondi), ma nel nostro caso ha effettivamente prevenuto un timeout del gateway dove un proxy stava scadendo prima che il GET cURL terminasse, rendendo XML-RPC inutilizzabile.
// Impedisce a WordPress di testare la capacità ssl su domain.com/xmlrpc.php?rsd
remove_filter('atom_service_url','atom_service_url_filter');

Grazie per il suggerimento del codice. Una domanda, se stai usando XML-RPC ma non utilizzi le funzionalità SSL, l'inclusione di questo codice potrebbe velocizzare comunque le cose? Se no, in quali situazioni l'inclusione di questo codice potrebbe essere benefica?

Raccolta di modifiche rapide per functions.php
Ho alcuni fantastici aggiustamenti nel file functions.php
anche io. Ho trovato la maggior parte di questi cercandoli nel corso degli anni.
Finale dell'Excerpt
function new_excerpt_more($more) {
return '...';
}
add_filter('excerpt_more', 'new_excerpt_more');
Sostituire il Logo di Amministrazione WP
function new_admin_logo() {
echo '<style type="text/css">#header-logo { background-image: url('.get_bloginfo('template_directory').'/images/admin_logo.png) !important; }</style>';
}
add_action('admin_head', 'new_admin_logo');
Favicon Personalizzata per WP-Admin
function admin_favicon() {
echo '<link rel="shortcut icon" type="image/x-icon" href="' . get_bloginfo('template_directory') . '/images/favicon.ico" />';
}
add_action( 'admin_head', 'admin_favicon' );
Footer Personalizzato per l'Amministrazione
function custom_admin_footer() {
echo 'Benvenuto nel mio blog! Niente più link alla documentazione!';
}
add_filter('admin_footer_text', 'custom_admin_footer');

Ottieni tutti i campi personalizzati globalmente
function get_custom_field($key, $echo = FALSE) {
global $post;
$custom_field = get_post_meta( $post->ID, $key, true );
if ( $echo == false )
return $custom_field;
echo $custom_field;
}
Poi richiama il campo con una singola riga
<?php get_custom_field('custom-field-name', TRUE); ?>

Restituisci il numero di commenti
Questa funzione è simile a count_user_posts()
, ma restituisce il numero di commenti invece:
function count_user_comments($id) {
global $wpdb;
$users = $wpdb->get_var("
SELECT COUNT( * ) AS total
FROM $wpdb->comments
WHERE comment_approved = 1
AND user_id = $id");
return $users;
}
Altro: Conta i post dell'utente (inclusi i custom post type) o i commenti:
function atom_count($user_id, $what_to_count = 'post') {
global $wpdb;
$where = $what_to_count == 'comment' ? "WHERE comment_approved = 1 AND user_id = {$user_id}" : get_posts_by_author_sql($what_to_count, TRUE, $user_id);
$from = "FROM ".(($what_to_count == 'comment') ? $wpdb->comments : $wpdb->posts);
$count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) {$from} {$where}"));
return $count;
}
Esempi di utilizzo:
<?php echo atom_count(1, 'movie'); // mostra il conteggio del post type 'movie' ?>
<?php echo atom_count(1, 'comment'); // mostra il conteggio dei commenti ?>

Conteggio Parole Articoli
Testato su: WordPress 3.0.1
(Originariamente estratto dal plugin Post Word Count di Nick Momrik)
Aggiunge un conteggio del totale delle parole pubblicate in fondo alla sezione "Adesso" nella dashboard di amministrazione. Utile se stai usando il tuo blog come piattaforma per qualcosa come il NaNoWriMo o se vuoi semplicemente tenere traccia di quanto prolifiche siano diventate le tue capacità di blogging.
function post_word_count() {
$count = 0;
$posts = get_posts( array(
'numberposts' => -1,
'post_type' => array( 'post', 'page' )
));
foreach( $posts as $post ) {
$count += str_word_count( strip_tags( get_post_field( 'post_content', $post->ID )));
}
$num = number_format_i18n( $count );
// Questo blocco aggiungerà il conteggio delle parole alla sezione statistiche del box "Adesso"
$text = _n( 'Parola', 'Parole', $num );
echo "<tr><td class='first b'>{$num}</td><td class='t'>{$text}</td></tr>";
// Questa riga aggiungerà il conteggio delle parole in fondo al box "Adesso"
echo '<p>Questo blog contiene un totale di <strong>' . $num . '</strong> parole pubblicate!</p>';
}
// Aggiunge alla tabella Statistiche Contenuti
add_action( 'right_now_content_table_end', 'post_word_count');
// Aggiunge in fondo al box Attività
add_action('activity_box_end', 'post_word_count');
Ringraziamenti a Rarst per la pulizia del codice senza query!

Grazie per l'aiuto, Rarst. Di solito non mi piace includere query dirette al database nel codice del plug-in function.php
, ma come ho detto era stato preso originariamente dal plug-in di qualcun altro.

Nessun problema, ho provato a farlo molto tempo fa ed è stato un disastro. :) Ora con competenze migliorate era il momento di farlo bene. Perché hai lasciato la vecchia parte di output? Penso abbia senso mostrarla con il resto delle statistiche. A proposito, questa versione dà un totale diverso (rispetto a explode
), probabilmente a causa dei filtri lungo il percorso e simili quando si recupera via API.

La differenza nel conteggio dei post è il risultato dei filtri... ma usare get_posts()
sarà probabilmente un conteggio delle parole più accurato comunque. Ho lasciato la vecchia riga di output semplicemente perché è così che l'ho sempre usata... più una differenza di opinione che altro... Aggiungerò di nuovo il tuo esempio per includerlo nelle statistiche così che le persone possano scegliere.

Caricare script condizionalmente
Ecco un modo per caricare gli script solo se è presente un particolare shortcode o widget. fonte: Caricare script solo se è presente un particolare shortcode o widget
function has_my_shortcode($posts) {
if ( empty($posts) )
return $posts;
$found = false;
foreach ($posts as $post) {
if ( stripos($post->post_content, '[my_shortcode') )
$found = true;
break;
}
if ($found){
$urljs = get_bloginfo( 'template_directory' ).IMP_JS;
wp_register_script('my_script', $urljs.'myscript.js' );
wp_print_scripts('my_script');
}
return $posts;
}
add_action('the_posts', 'has_my_shortcode');
Ed ecco come caricare gli script solo se è presente un certo widget
Per caricare lo script solo nella pagina dove è presente il widget, dovrai aggiungere il codice is_active_widget() nella tua classe widget. Ad esempio, vedi il widget predefinito dei commenti recenti (wp-includes/default-widgets.php, riga 602):
class WP_Widget_Recent_Comments extends WP_Widget {
function WP_Widget_Recent_Comments() {
$widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'I commenti più recenti' ) );
$this->WP_Widget('recent-comments', __('Commenti Recenti'), $widget_ops);
$this->alt_option_name = 'widget_recent_comments';
if ( is_active_widget(false, false, $this->id_base) )
add_action( 'wp_head', array(&$this, 'recent_comments_style') );
add_action( 'comment_post', array(&$this, 'flush_widget_cache') );
add_action( 'transition_comment_status', array(&$this, 'flush_widget_cache') );
}

CSS Personalizzato per la Dashboard
/* Modifica il CSS della dashboard di WordPress */
function custom_admin_styles() {
echo '<style type="text/css">#wphead{background:#069}</style>';
}
add_action('admin_head', 'custom_admin_styles');
Puoi aggiungere qualsiasi modifica al CSS tra i tag style.

Rimuovi i Prefissi Private e Protected
Questa funzione rimuove il prefisso "Private:" da post e pagine contrassegnate come private. Utile per contenuti visibili solo agli utenti loggati o a gruppi specifici.
function the_title_trim($title) {
$title = attribute_escape($title);
$findthese = array(
'#Protected:#',
'#Private:#'
);
$replacewith = array(
'', // Cosa sostituire a "Protected:"
'' // Cosa sostituire a "Private:"
);
$title = preg_replace($findthese, $replacewith, $title);
return $title;
}
add_filter('the_title', 'the_title_trim');
MODIFICA: Aggiornato per includere anche la rimozione di Protected:.

Lunghezza personalizzata dell'estratto
function excerpt($num) {
$limit = $num+1;
$excerpt = explode(' ', get_the_excerpt(), $limit);
array_pop($excerpt);
$excerpt = implode(" ",$excerpt)."... (<a href='" .get_permalink($post->ID) ." '>Continua a leggere</a>)";
echo $excerpt;
}
Limita la lunghezza dell'estratto visualizzato scrivendo nel tema: excerpt('20');
Esempio: <?php excerpt('22'); ?>
Questo limiterà l'estratto a 22 caratteri.
L'estratto sarà interrotto con ... (Continua a leggere)

Aggiungi lo slug della pagina genitore a body_class
/***************************************************************
* Funzione body_class_section
* Aggiunge la pagina di livello superiore alla classe body per sezioni colorate
***************************************************************/
add_filter('body_class','body_class_section');
function body_class_section($classes) {
global $wpdb, $post;
if (is_page()) {
if ($post->post_parent) {
$parent = end(get_post_ancestors($current_page_id));
} else {
$parent = $post->ID;
}
$post_data = get_post($parent, ARRAY_A);
$classes[] = 'section-' . $post_data['post_name'];
}
return $classes;
}
Questo filtro aggiunge una classe unica al body in base alla pagina genitore di livello più alto della pagina corrente. Lo uso per siti che hanno colori o layout specifici per ogni sezione del sito. Funziona meglio con siti basati su pagine. Esempi CSS:
.section-about { background: red; }
.section-portfolio { background: blue; }
Il tuo tema deve anche utilizzare la funzione body_class.
Correggi gli oggetti Flash oEmbed
/***************************************************************
* Funzione my_oembed_wmode
* Corregge la modalità finestra oEmbed per oggetti Flash
***************************************************************/
add_filter('embed_oembed_html', 'my_oembed_wmode', 1);
function my_oembed_wmode( $embed ) {
if ( strpos( $embed, '<param' ) !== false ) {
$embed = str_replace( '<embed', '<embed wmode="transparent" ', $embed );
$embed = preg_replace( '/param>/', 'param><param name="wmode" value="transparent" />', $embed, 1);
}
return $embed;
}
In passato ho avuto problemi in cui gli oggetti Flash oEmbed entravano in conflitto con i menu a discesa di navigazione. Questo filtro risolve il problema aggiungendo una modalità finestra trasparente agli embed.
Rimuovi la colonna "commenti" dalla lista delle pagine in Admin
/***************************************************************
* Funzione custom_pages_columns
* Rimuove "commenti" dalla panoramica delle pagine (raramente uso commenti su pagine)
***************************************************************/
add_filter('manage_pages_columns', 'custom_pages_columns');
function custom_pages_columns($defaults) {
unset($defaults['comments']);
return $defaults;
}
Quasi mai utilizzo i commenti sulle pagine e questo aiuta a mantenere tutto ordinato nella dashboard di WordPress.

Abilita la Paginazione Numerica
Testato su: Wordpress 3.0.1
/* Paginazione Numerica ********************************************/
function numeric_pagination ($pageCount = 9, $query = null) {
if ($query == null) {
global $wp_query;
$query = $wp_query;
}
if ($query->max_num_pages <= 1) {
return;
}
$pageStart = 1;
$paged = $query->query_vars['paged'];
// imposta la pagina corrente se siamo nella prima pagina
if ($paged == null) {
$paged = 1;
}
// calcola se l'inizio della pagina è a metà delle pagine visibili e in tal caso lo sposta di conseguenza
if ($paged > floor($pageCount / 2)) {
$pageStart = $paged - floor($pageCount / 2);
}
if ($pageStart < 1) {
$pageStart = 1;
}
// assicurati che l'inizio della pagina sia
if ($pageStart + $pageCount > $query->max_num_pages) {
$pageCount = $query->max_num_pages - $pageStart;
}
?>
<div id="archive_pagination">
<?php
if ($paged != 1) {
?>
<a href="<?php echo get_pagenum_link(1); ?>" class="numbered page-number-first"><span>‹ <?php _e('<< Prima', 'global'); ?></span></a>
<?php
}
// la prima pagina non è visibile...
if ($pageStart > 1) {
//echo 'precedente';
}
for ($p = $pageStart; $p <= $pageStart + $pageCount; $p ++) {
if ($p == $paged) {
?>
<span class="numbered page-number-<?php echo $p; ?> current-numeric-page"><?php echo $p; ?></span>
<?php } else { ?>
<a href="<?php echo get_pagenum_link($p); ?>" class="numbered page-number-<?php echo $p; ?>"><span><?php echo $p; ?></span></a>
<?php
}
}
// l'ultima pagina non è visibile
if ($pageStart + $pageCount < $query->max_num_pages) {
//echo "ultima";
}
if ($paged != $query->max_num_pages) {
?>
<a href="<?php echo get_pagenum_link($query->max_num_pages); ?>" class="numbered page-number-last"><span><?php _e('>> Ultima', 'global'); ?> ›</span></a>
<?php } ?>
</div>

Esiste già una funzione in WordPress per la paginazione numerica, vedi http://codex.wordpress.org/Function_Reference/paginate_links

Mostra contenuto specifico solo per utenti loggati
Testato su: Wordpress 3.0.1
function content_only4logged_in($content) {
// SOLO UTENTI LOGGATI
if ( is_user_logged_in() &&
!is_null($content) &&
!is_feed()
) {
return $content;
} else {
$content = wp_html_excerpt( $content, 80 );
$content .= ' …';
$content .= __( 'Spiacente, il resto di questo contenuto è disponibile solo per gli utenti registrati.', FB_TEXTDOMAIN );
return $content;
}
}
add_action( 'the_content', 'content_only4logged_in' );
maggiori possibilità e informazioni sul post http://wpengineer.com/2046/control-the-wordpress-content-via-userrights-or-time/

Rendi i tuoi Shortlink più Brevi Rimuovendo il WWW
Testato su: Wordpress 3.0.1
Rendi i tuoi shortlink più brevi se includi www.
nel tuo dominio. Tramite scratch99.com:
add_filter('get_shortlink','sjc_alter_shortlink');
function sjc_alter_shortlink($shortlink) {
$shortlink = preg_replace('/^(https?:\/\/)?(www\.)/','$1',$shortlink);
return $shortlink;
}

Dovrebbe essere aggiunto un controllo per assicurarsi che la stringa "www." venga rimossa solo se si trova all'inizio della parte del dominio dell'URL originale. Sostituirla ingenuamente in qualsiasi punto dell'URL causerà bug se utilizzata su un dominio come owww.com (che in realtà sembra eseguire WordPress) :)

Verificare se un post ha contenuti incorporati
Verifica se un post ha contenuti incorporati, funziona all'interno del loop utilizzando l'ID del post corrente, oppure può essere passato un ID specifico per determinare quale post verificare.
function has_embed( $post_id = false ) {
if( !$post_id ) $post_id = get_the_ID();
else $post_id = absint( $post_id );
if( !$post_id ) return false;
$post_meta = get_post_custom_keys( $post_id );
$post_meta = array_map( 'trim' , $post_meta );
foreach( $post_meta as $meta ) {
if( '_oembed' != substr( $meta , 0 , 7 ) )
continue;
return true;
}
return false;
}
Puoi utilizzare questa funzione nello stesso modo in cui verifichi se un post ha un tag..
if( has_embed() ) {
// fai qualcosa
}
La funzione restituisce true se viene trovato un embed, false in caso contrario.

Interessante, ma mi chiedo, perché lo useresti? Che tipo di applicazioni ha?

Verificare se un post ha un embed in una pagina che mostra estratti sarebbe un utilizzo (ed è il caso d'uso originale per cui l'ho scritto). Altri possibili casi d'uso potrebbero essere con utenti che scrivono i propri template di tema e vogliono fornire funzionalità dipendenti dal fatto che un post (o tipo) abbia contenuto incorporato, senza la necessità di un filtro su the_content
o numerose chiamate a get_post_custom_keys
.

Mostrare Articoli da Diversi Tipi di Post Personalizzati nella Homepage
Inserendo il seguente codice alla fine di questo articolo nel tuo file functions.php, puoi far sì che WordPress mostri automaticamente articoli provenienti da diversi tipi di post personalizzati che hai creato. Di default, WordPress mostra solo gli articoli che appartengono al tipo di post predefinito "post".
Nell'esempio fornito di seguito, dovrai modificare la sezione che chiama:
$query->set( 'post_type', array('post', 'page', 'services', 'attachment'));
Con i tuoi tipi di post personalizzati che desideri includere nei risultati della lista degli articoli nella homepage. In questo caso, stiamo chiedendo a WordPress di restituirci tutti gli articoli appartenenti ai tipi di post predefiniti "post" e "page", poi chiediamo a WordPress di includere anche il tipo di post personalizzato che abbiamo creato per "services" e infine il tipo di post predefinito di WordPress "attachment", che significa che ogni volta che qualcosa viene aggiunto alla libreria multimediale, verrà automaticamente visualizzato nella homepage come una voce separata.
// LISTA PERSONALIZZATA DEGLI ARTICOLI IN HOMEPAGE CHE INCLUDE DIVERSI TIPI DI POST
// assicurati di modificare i tipi di post che vuoi includere nella lista qui sotto
add_filter( 'pre_get_posts', 'my_homepage_post_list' );
function my_homepage_post_list ( $query ) {
if ( is_home() && false == $query->query_vars['suppress_filters'] )
$query->set( 'post_type', array('post', 'page', 'services', 'attachment'));
return $query;
}
Puoi anche utilizzare questa query personalizzata in diverse posizioni, come in un feed personalizzato attraverso qualcosa come questo:
if (( is_home() && false == $query->query_vars['suppress_filters'] ) || is_feed())

Rimuovi i campi predefiniti delle informazioni di contatto nel profilo utente e sostituiscili con qualcosa di più utile
La seconda parte di questa funzione è già stata menzionata sopra, ma la rimozione dei campi predefiniti - AIM, Yahoo IM e Jabber/Google Talk - non ancora:
function update_contact_methods( $contactmethods ) {
// Rimuovi i campi predefiniti fastidiosi e inutili
unset($contactmethods['aim']);
unset($contactmethods['jabber']);
unset($contactmethods['yim']);
// Aggiungi nuovi campi
$contactmethods['phone'] = 'Telefono';
$contactmethods['mobile'] = 'Cellulare';
$contactmethods['address'] = 'Indirizzo';
return $contactmethods;
}
add_filter('user_contactmethods', 'update_contact_methods');
Ovviamente puoi aggiungere tutti i campi che desideri (vedi esempi precedenti in questo thread) sotto "Aggiungi nuovi campi"
