La migliore raccolta di codice per il tuo file 'functions.php'

9 set 2010, 11:29:00
Visualizzazioni: 169K
Voti: 346

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.

25
Commenti

Per favore aggiungi anche i tuoi vecchi risultati esistenti.

hakre hakre
9 set 2010 11:38:16

Ciao @NetConstructor: Sono preoccupato per questa domanda perché è una domanda del tipo "Lista di X" che ci è stato detto di tenere d'occhio dalla comunità di StackExchange: http://meta.stackexchange.com/questions/57226/should-we-have-a-list-of-x-close-reason La mia principale preoccupazione è che quando penso alla tua domanda, riesco a immaginare un numero quasi infinito di risposte e, di conseguenza, temo che questa domanda si traduca in una raccolta di risposte casuali ma nulla di definitivo. Vorrei avere il parere di altri su questo prima di (votare per) chiuderla, però, perché non voglio essere troppo severo, ho solo dei dubbi.

MikeSchinkel MikeSchinkel
9 set 2010 14:00:40

Il mio voto è per chiudere o renderla una wiki della comunità

Chris_O Chris_O
9 set 2010 15:37:41

Considerando che le prime 5 risposte sono state fornite dall'OP e la domanda sembra più orientata a raccogliere una serie di risposte piuttosto che una singola risposta definitiva, questa dovrebbe essere una wiki della community.

EAMann EAMann
9 set 2010 17:43:16

Sembra che non si possa semplicemente modificare una domanda per convertirla in una wiki. È corretto?

NetConstructor.com NetConstructor.com
9 set 2010 18:31:53

Nonostante ciò, questo è utile (ho trovato 2 snippet che utilizzerò molto) se deve diventare una wiki della community e deve essere ricominciato da zero per farlo, forse possiamo semplicemente spostare il materiale qui?

Lemon Bacon Lemon Bacon
10 set 2010 02:58:46

@NetConstructor.com ... Ho convertito la domanda in una wiki quando ho scritto il mio ultimo commento. Scusa se ha causato confusione. Normalmente, tu (come autore originale) puoi trasformare una domanda in wiki in qualsiasi momento.

EAMann EAMann
10 set 2010 03:56:15

@EAMann grazie... stavo cercando quell'opzione ma non ero sicuro di dove fosse posizionata. Forse dopo che l'hai convertita non ho più visto l'opzione?

NetConstructor.com NetConstructor.com
10 set 2010 08:37:41

@NetConstructor.com - Esatto. Una volta convertita, è convertita... l'opzione viene impostata e sparisce dalla pagina.

EAMann EAMann
10 set 2010 17:23:26

Considererei questo uno stile poco elegante e preferirei i plugin. a) Sono sviluppati da sviluppatori dedicati b) sono mantenuti e facilmente aggiornabili. Per piccoli snippet personalizzati consiglio il plugin Shortcode Exec PHP che offre un modo molto pulito - e portabile - per personalizzare il tuo Wordpress.

Raphael Raphael
10 nov 2010 11:43:21

sebbene interessante credo che la maggior parte delle persone concorderebbe sul fatto che quando si sviluppano temi si preferisce avere le cose localizzate all'interno di un file functions.php

NetConstructor.com NetConstructor.com
24 nov 2010 19:01:50

@NetConstructor - Se intendi modificare i post degli altri, per favore fallo con attenzione, hai rovinato l'indentazione nel mio messaggio, mi impegno sempre a mantenere l'indentazione per una migliore leggibilità. Apprezzerei anche se potessi prenderti il tempo per spiegare le modifiche che apporti (non ho visto alcun motivo per modificare il mio post - e non c'era alcun riepilogo delle modifiche).

t31os t31os
28 gen 2011 18:53:26

@t31os -- L'ho modificato per mantenerlo coerente con tutte le altre voci

NetConstructor.com NetConstructor.com
7 feb 2011 15:53:20

Tutte le risposte non correlate a un tema dovrebbero essere rimosse. Questo thread è un buon esempio di cattive pratiche di programmazione.

fuxia fuxia
13 giu 2011 15:09:56

Dovrei dissentire. La domanda non era correlata al tema. Tutte le modifiche al functions.PHP pertinenti sono benvenute e gli utenti dovrebbero votare positivamente/negativamente di conseguenza.

NetConstructor.com NetConstructor.com
14 giu 2011 07:56:23

È interessante notare che non viene menzionato da nessuna parte che il file functions.php è quello nella directory del tuo tema, causando confusione, come in questo caso: http://wordpress.stackexchange.com/questions/25341/error-after-editing-functions-php

scribu scribu
9 ago 2011 03:07:10

Penso che sarebbe meglio incoraggiare le persone a creare un plugin di funzionalità personalizzato invece di usare il functions.php del loro tema

Ian Dunn Ian Dunn
16 gen 2012 20:49:10

@rarst - Riguardo al tuo commento sulla chiusura di questa discussione, non è proprio questo il motivo per cui è elencata nel wiki della community?

User User
19 feb 2012 15:35:19

@Cor van Noorloos l'utilizzo dello status di wiki community è stato notevolmente ridotto e scoraggiato dalla rete. In poche parole, la scusa "non è proprio adatto per Q&A, ma è una wiki community!" non è più accettabile. Le risposte qui sono diventate un insieme disordinato e mal mantenuto, visitato solo per il fattore wow/divertimento. C'è stato molto movimento in tutta la rete per eliminare domande come questa.

Rarst Rarst
19 feb 2012 15:43:03

@rarst - Comprensibile. Punto preso.

User User
19 feb 2012 15:55:04

Per quanto riguarda la chiusura di questa specifica "wiki", voto per la sua riapertura. Ovviamente questo post wiki è molto popolare, come dimostrato dal fatto che ha 30.000 visualizzazioni, tre volte il numero di QUALSIASI altra domanda o wiki su questo sito, e l'argomento stesso è stato votato positivamente 119 volte, il doppio rispetto a qualsiasi altra domanda o argomento. Se sei d'accordo sul suo valore, vota per la riapertura cliccando sul link "riapri".

NetConstructor.com NetConstructor.com
20 feb 2012 13:12:40

@NetConstructor.com Il puro numero di visualizzazioni di pagina non è un indicatore di qualità. Dovremmo incoraggiare domande specifiche con risposte specifiche e buone pratiche di programmazione. Questa discussione è l'opposto.

fuxia fuxia
22 feb 2012 04:44:30

@toscho - questo è esattamente il motivo per cui è stato impostato come wiki e quindi questo post è perfettamente valido. Il punto che ho sollevato riguardo alle visualizzazioni di pagina è stato menzionato perché questo argomento è ovviamente 3 volte più popolare di qualsiasi altro su questo sito. Questo sito è popolare proprio grazie a domande come queste e quindi non ha senso chiuderlo. Non credo si possa discutere su questo a meno che l'interesse della comunità per argomenti come questi non abbia valore per gli amministratori.

NetConstructor.com NetConstructor.com
24 feb 2012 18:38:34

Aggiungerò un altro commento qui basandomi su alcuni calcoli che ho appena fatto. Ci sono meno di 790 utenti registrati su questo sito con un rating di "1" o superiore. Assumendo che questo gruppo di individui rappresenti coloro che effettivamente votano e/o contribuiscono al sito (e 790 è una stima incredibilmente equa), allora 117 persone che hanno votato positivamente questa domanda rappresentano oltre il 14% di tutti gli utenti attivi che hanno trovato utile questo argomento. Per favore, votate per riaprire la discussione.

NetConstructor.com NetConstructor.com
24 feb 2012 18:47:01

@NetConstructor.com Discutine su Meta dove le persone possono comprendere meglio i tuoi argomenti. :)

fuxia fuxia
24 feb 2012 19:10:14
Mostra i restanti 20 commenti
Tutte le risposte alla domanda 30
2
15

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' );
26 gen 2011 16:19:21
Commenti

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

brasofilo brasofilo
4 apr 2012 03:37:39

Questa è esattamente la stessa cosa che avevo postato sopra.

jaredwilli jaredwilli
9 dic 2012 19:52:30
4
14

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 );
}
9 nov 2010 05:22:03
Commenti

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

NetConstructor.com NetConstructor.com
22 feb 2011 22:19:14

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

jaredwilli jaredwilli
23 feb 2011 02:56:13

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

Zach Lysobey Zach Lysobey
15 feb 2012 19:06:32

Ho incapsulato l'add_filter in questa chiamata d'azione: add_action('plugins_loaded', 'pluginInit');, e poi function pluginInit(){if...add_filter(...)} - sto eseguendo questo in WP 3.4-alpha, e ho dovuto usare in_admin_footer

brasofilo brasofilo
2 apr 2012 14:28:28
0
14

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
        }
}
14 nov 2010 17:57:56
1
13

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"]
21 dic 2010 22:03:19
Commenti

È meglio utilizzare Javascript: <a href="javascript:window.open('http://tinyurl.com/api-create.php?url='+location.href"> Ottieni Link Breve </a> (per evitare CENTINAIA di richieste di apertura di pagina NON NECESSARIE (da parte di bot o altro) a TinyUrl ...

T.Todua T.Todua
23 gen 2015 12:22:10
1
12

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";'));
16 nov 2010 06:56:16
Commenti

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

bueltge bueltge
17 nov 2010 14:44:36
11
11

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>';
}
30 set 2010 06:06:41
Commenti

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()"

matt matt
5 dic 2010 07:02:43

che versione di WordPress stai usando?

NetConstructor.com NetConstructor.com
6 dic 2010 19:21:32

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

kaiser kaiser
1 feb 2011 09:42:15

@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.com NetConstructor.com
1 feb 2011 17:07:08

@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 kaiser
1 feb 2011 20:55:29

@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 :)

NetConstructor.com NetConstructor.com
2 feb 2011 00:29:12

@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 kaiser
2 feb 2011 01:50:33

@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.

NetConstructor.com NetConstructor.com
2 feb 2011 07:11:09

@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 kaiser
2 feb 2011 08:53:13

@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?

NetConstructor.com NetConstructor.com
3 feb 2011 18:05:34

@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.

kaiser kaiser
3 feb 2011 19:09:35
Mostra i restanti 6 commenti
3
11

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.

5 nov 2010 22:03:12
Commenti

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?

NetConstructor.com NetConstructor.com
5 nov 2010 23:28:48

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

hakre hakre
6 nov 2010 19:41:34

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.

Ian Dunn Ian Dunn
16 gen 2012 21:01:09
0
10

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');
9 nov 2010 00:45:36
2
10

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' );
11 nov 2010 14:57:07
Commenti

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

NetConstructor.com NetConstructor.com
11 nov 2010 14:58:14

va notato che il timeout della sessione è presente come precauzione di sicurezza, quindi estenderlo/rimuoverlo rende il tuo sito più vulnerabile.

Ian Dunn Ian Dunn
16 gen 2012 20:58:22
3
10

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 );
}
15 nov 2010 01:07:46
Commenti

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

NetConstructor.com NetConstructor.com
22 feb 2011 22:37:19

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

bueltge bueltge
28 feb 2011 19:23:56

Vorrei che tutti gli autori di plugin facessero così (per i plugin che hanno pagine di impostazioni, ovviamente) così questo tipo di codice non sarebbe necessario.

JimmyPena JimmyPena
6 dic 2011 21:00:37
1
10

Rimuovi il collegamento automatico degli URL nei commenti di WordPress

remove_filter('comment_text', 'make_clickable', 9);
28 dic 2010 02:14:24
Commenti

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

fregante fregante
11 gen 2014 02:57:27
1
10

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.

19 mar 2011 17:52:55
Commenti

funziona perfettamente, testato in 3.4-alpha

brasofilo brasofilo
2 apr 2012 16:01:27
3
10

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;
}
26 nov 2011 15:11:36
Commenti

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

chrismccoy chrismccoy
25 feb 2012 02:38:23

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

Paul Paul
17 ago 2012 00:02:53

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.

Loc_rabbirt Loc_rabbirt
14 feb 2020 02:06:54
2

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');
13 set 2010 22:24:19
Commenti

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?

NetConstructor.com NetConstructor.com
14 set 2010 05:37:28

Ha un effetto minimo sulle prestazioni per le chiamate XML-RPC, dato che non devono più verificare la capacità SSL tramite una richiesta HTTP.

gabrielk gabrielk
19 set 2010 20:57:49
2

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');
6 nov 2010 23:08:39
Commenti

grazie ma questi sono già stati aggiunti.

NetConstructor.com NetConstructor.com
8 nov 2010 17:12:18

potresti per favore controllarli e assicurarti che non ci siano voci duplicate e dividerle ciascuna nella sua risposta entro le prossime settimane?

NetConstructor.com NetConstructor.com
26 gen 2011 16:30:41
2

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); ?>
15 nov 2010 07:45:04
Commenti

Perché qualcuno dovrebbe usarlo? Qual è il vantaggio?

matt matt
5 dic 2010 07:10:33

per siti/temi che utilizzano molti campi personalizzati (cosa che uso spesso per i lavori dei clienti) permette di avere meno codice nel tema e anche di aggiungere condizioni per decidere se mostrare o meno il campo.

Norcross Norcross
11 dic 2010 00:44:34
0

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 ?>

17 nov 2010 04:52:13
0

Abilita oEmbed nei Widget di Testo/HTML

add_filter( 'widget_text', array( $wp_embed, 'run_shortcode' ), 8 );
add_filter( 'widget_text', array( $wp_embed, 'autoembed'), 8 );

Utilizzo questo codice per i widget di video YouTube e contenuti Flickr.

28 dic 2010 02:07:12
3

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!

15 set 2010 18:58:01
Commenti

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.

EAMann EAMann
15 set 2010 19:56:22

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.

Rarst Rarst
15 set 2010 20:05:31

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.

EAMann EAMann
15 set 2010 20:17:22
0

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') );
    }
30 set 2010 14:57:18
0

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.

10 nov 2010 20:42:26
0

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:.

3 dic 2010 20:13:33
0

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)

2 gen 2011 22:00:51
0

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.

21 feb 2011 21:03:12
1

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>&lsaquo; <?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'); ?> &rsaquo;</span></a>
<?php } ?>

 </div>
10 set 2010 03:04:37
Commenti

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

t31os t31os
11 nov 2010 19:09:23
1

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/

17 set 2010 11:34:49
Commenti

Non riesco a far visualizzare contenuti modificati per gli utenti non loggati... la prima parte funziona bene, ma se l'utente non è loggato e la pagina è marcata come privata, mi viene semplicemente mostrato il normale 404?

gillespieza gillespieza
9 feb 2011 22:58:07
2

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;
}
28 set 2010 03:53:46
Commenti

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) :)

Ingve Ingve
29 mag 2012 00:30:34

@Ingve L'ho sistemato, ora rimuoverà solo il www iniziale

fregante fregante
11 gen 2014 03:04:48
2

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.

4 nov 2010 19:11:02
Commenti

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

matt matt
5 dic 2010 07:08:44

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.

t31os t31os
5 dic 2010 11:34:42
0

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())
14 nov 2010 21:53:13
0

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"

22 dic 2010 10:46:37