Cea mai bună colecție de cod pentru fișierul tău 'functions.php'

9 sept. 2010, 11:29:00
Vizualizări: 169K
Voturi: 346

La fel ca mulți alții care citesc acum această postare, am parcurs diverse bloguri, forumuri și grupuri de discuții pentru a-mi îmbunătăți cunoștințele despre WordPress. În ultimele 12 luni am avut misiunea de a înlocui utilizarea plugin-urilor prin adăugarea de cod în fișierul functions.php.

Deși sunt complet de acord că plugin-urile sunt foarte utile în multe situații, experiența mea a demonstrat că în 90% din cazuri, deși ar putea exista un plugin, utilizarea acestuia ar putea crea complicații inutile și probleme de compatibilitate. În plus, în multe cazuri, astfel de plugin-uri au adăugat meniuri și alte elemente administrative pe care nu le doresc sau nu am nevoie de ele.

De cele mai multe ori am descoperit că analizând codul plugin-urilor am putut extrage bucata de cod dorită și o pot implementa direct în functions.php. Acest lucru mi-a oferit exact funcționalitatea de care aveam nevoie fără a include elemente inutile.

Așadar, scopul acestei postări este încercarea mea de a vă implica pe voi, cititori/administratori/dezvoltatori, să împărtășiți cu mine și cu ceilalți de aici orice fragmente de cod pe care le considerați utile și le-ați adăugat în fișierul functions.php al temei voastre pentru a extinde sau îmbunătăți WordPress fără a utiliza un plugin.

Când trimiteți un răspuns aici, vă rog să dați fiecărui fragment de cod un titlu, să ne spuneți cu ce versiune de WordPress știți că este compatibil, să includeți orice descriere care credeți că descrie cel mai bine funcția sa și (dacă este cazul) să includeți un link către plugin-ul original sau sursa unde ați găsit informația.

Aștept cu nerăbdare toate răspunsurile voastre și, bineînțeles, voi adăuga continuu propriile mele descoperiri ori de câte ori le găsesc.

Vă rugăm să votați întrebarea și orice răspunsuri pe care le considerați utile făcând clic pe săgeata sus din partea stângă a întrebării sau răspunsului.

25
Comentarii

Te rog să adaugi și vechile tale constatări existente.

hakre hakre
9 sept. 2010 11:38:16

Salut @NetConstructor: Sunt îngrijorat de această întrebare pentru că este o întrebare de tip "Listă de X" despre care oamenii de la StackExchange ne-au spus să fim atenți: http://meta.stackexchange.com/questions/57226/should-we-have-a-list-of-x-close-reason Principala mea preocupare este că atunci când mă gândesc la întrebarea ta, îmi pot imagina un număr aproape infinit de răspunsuri și, ca urmare, mă îngrijorează că această întrebare va duce la o colecție de răspunsuri aleatorii, dar nimic definitiv. Vreau să aflu și alte opinii înainte de a (vota să) o închid, deoarece nu vreau să fiu prea dur, dar am rezerve.

MikeSchinkel MikeSchinkel
9 sept. 2010 14:00:40

Votul meu este fie pentru închidere, fie pentru transformarea în wiki comunitar.

Chris_O Chris_O
9 sept. 2010 15:37:41

Având în vedere că primele 5 răspunsuri au fost date de OP și întrebarea pare să fie mai degrabă orientată către colectarea unui șir de răspunsuri decât către un singur răspuns definitiv, acesta ar trebui să fie un wiki al comunității.

EAMann EAMann
9 sept. 2010 17:43:16

se pare că nu se poate modifica pur și simplu o întrebare într-un wiki. Este corect?

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

Cu toate acestea, acest lucru este util (am găsit 2 fragmente pe care le voi folosi intens) dacă va fi un wiki al comunității și trebuie creat de la zero pentru a face asta, poate putem muta pur și simplu conținutul de aici acolo?

Lemon Bacon Lemon Bacon
10 sept. 2010 02:58:46

@NetConstructor.com ... Am convertit întrebarea în wiki când am scris ultimul meu comentariu. Îmi pare rău dacă a creat vreo confuzie. În mod normal, tu (ca autorul original) poți transforma o întrebare în wiki în orice moment.

EAMann EAMann
10 sept. 2010 03:56:15

@EAMann mulțumesc... Căutam această opțiune dar nu eram sigur unde se afla. Poate după ce ai convertit-o eu pur și simplu nu am mai văzut opțiunea?

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

@NetConstructor.com - Exact. Odată ce este convertită, este convertită... opțiunea este setată și dispare din pagină.

EAMann EAMann
10 sept. 2010 17:23:26

Aș considera acest lucru un stil nepotrivit și aș prefera plugin-uri. a) Sunt construite de dezvoltatori dedicați b) sunt întreținute și ușor de actualizat. Pentru fragmente mici personalizate, recomand plugin-ul Shortcode Exec PHP care oferă o modalitate foarte curată - și portabilă - de a personaliza WordPress-ul tău.

Raphael Raphael
10 nov. 2010 11:43:21

deși interesant, cred că majoritatea oamenilor ar fi de acord că atunci când dezvolți teme, dorești ca lucrurile să fie localizate în fișierul functions.php

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

@NetConstructor - Dacă ai de gând să editezi intrările altora, te rog să ai grijă când o faci, ai stricat indentarea în postarea mea, eu întotdeauna mă străduiesc să mențin indentarea pentru lizibilitate. Aș aprecia, de asemenea, dacă ai putea să-ți faci timp să explici modificările pe care le faci (nu am văzut niciun motiv pentru care să editezi intrarea mea - și nu a existat niciun rezumat al modificărilor).

t31os t31os
28 ian. 2011 18:53:26

@t31os -- Am editat pentru a păstra consistența cu toate înregistrările

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

Toate răspunsurile care nu sunt legate de o temă ar trebui eliminate. Acest thread este un exemplu bun de practici de codare necorespunzătoare.

fuxia fuxia
13 iun. 2011 15:09:56

Aș fi trebuit să nu fiu de acord. Întrebarea nu era legată de temă. Toate modificările aplicabile functions.PHP sunt binevenite și utilizatorii ar trebui să voteze în sus/jos în consecință.

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

Este interesant că nu se menționează nicăieri că fișierul functions.php este cel din directorul temei tale, ceea ce duce la confuzii, cum ar fi aceasta: http://wordpress.stackexchange.com/questions/25341/error-after-editing-functions-php

scribu scribu
9 aug. 2011 03:07:10

Cred că ar fi mai bine să încurajăm oamenii să creeze un plugin personalizat pentru funcționalități în loc să folosească functions.php din tema lor.

Ian Dunn Ian Dunn
16 ian. 2012 20:49:10

@rarst - Referitor la comentariul tău despre închiderea acestui thread, nu acesta este motivul pentru care este listat în wiki-ul comunității?

User User
19 feb. 2012 15:35:19

@Cor van Noorloos utilizarea statutului de wiki comunitate a fost mult redusă și descurajată de rețea. Mai simplu spus, scuza "nu se potrivește cu întrebările și răspunsurile, dar e wiki comunitate!" nu mai funcționează. Răspunsurile de aici au devenit un haos dezordonat și prost întreținut, vizitat doar pentru factorul de distracție. A existat o mișcare intensă în întreaga rețea pentru a elimina astfel de întrebări.

Rarst Rarst
19 feb. 2012 15:43:03

@rarst - De înțeles. Punctul a fost recepționat.

User User
19 feb. 2012 15:55:04

În legătură cu închiderea acestui "wiki" specific, votez pentru redeschiderea lui. Evident, această postare wiki este foarte populară, demonstrată de faptul că are 30.000 de vizualizări, adică de trei ori mai mult decât ORICE altă întrebare sau wiki de pe acest site, iar subiectul în sine a fost votat pozitiv de 119 ori, adică dublu față de orice altă întrebare sau subiect. Dacă considerați că are valoare, vă rugăm să votați pentru redeschiderea lui făcând clic pe linkul "redeschide".

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

@NetConstructor.com Numărul pur de vizualizări ale paginii nu este un indicator al calității. Ar trebui să încurajăm întrebări specifice cu răspunsuri specifice și practici de codare bune. Acest thread este exact opusul.

fuxia fuxia
22 feb. 2012 04:44:30

@toscho - tocmai de aceea acest subiect a fost configurat ca wiki și, prin urmare, acest post este perfect valid. Punctul menționat în legătură cu numărul de vizualizări a fost adus pentru că acest subiect este evident de 3 ori mai popular decât orice alt subiect de pe acest site. Acest website este popular tocmai datorită întrebărilor de acest gen și, prin urmare, nu are sens să îl închidem. Nu cred că se poate dezbate acest lucru decât dacă interesul comunității pentru astfel de subiecte nu are valoare pentru administratori.

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

Voi adăuga încă un comentariu aici bazat pe niște calcule pe care tocmai le-am făcut. Există mai puțin de 790 de utilizatori înregistrați pe acest website cu un rating de "1" sau mai mult. Presupunând că acest grup de persoane reprezintă cei care votează și/sau contribuie efectiv pe acest site (iar 790 fiind un număr extrem de corect), atunci cei 117 oameni care au votat pozitiv această întrebare reprezintă peste 14% din toți utilizatorii activi care au considerat acest subiect util. Votați pentru redeschiderea subiectului, vă rog.

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

@NetConstructor.com Discută pe Meta unde oamenii îți pot vedea mai bine argumentele. :)

fuxia fuxia
24 feb. 2012 19:10:14
Arată celelalte 20 comentarii
Toate răspunsurile la întrebare 30
2
15

Includere tipuri personalizate de postări în panoul de administrare "Right Now"

Acest cod va include tipurile tale personalizate de postări și numărul de postări pentru fiecare tip în widget-ul "Right Now" din panoul de control.

// ADAUGĂ TIPURI PERSONALIZATE DE POSTĂRI ÎN WIDGET-UL 'RIGHT NOW' DIN PANOU
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 ian. 2011 16:19:21
Comentarii

Brusc, a apărut un tip de postare "WooFramework Internal Container" în widget-ul RightNow! . . . este nevoie de un argument suplimentar 'show_ui' => true și acum totul este în regulă

brasofilo brasofilo
4 apr. 2012 03:37:39

Acesta este exact același lucru pe care l-am postat mai sus.

jaredwilli jaredwilli
9 dec. 2012 19:52:30
4
14

Adaugă un formular de căutare Codex în antetul panoului de administrare

Acesta este un mod simplu de a adăuga un formular de căutare Codex în antetul panoului de administrare, în partea dreaptă sus, lângă meniul rapid derulant.

/**
 * ADAUGĂ FORMULAR DE CĂUTARE WP CODEX ÎN ANTETUL PANOULUI DE ADMINISTRARE
 */
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==\'\') ? \'Caută în Codex\' : this.value;" onfocus="this.value=(this.value==\'Caută în Codex\') ? \'\' : this.value;" maxlength="150" value="Caută în Codex" name="search" class="text"> <input type="submit" value="Mergi" class="button" />
    </form>';
}

if( current_user_can( 'manage_plugins' )) {
// Numărul 11 trebuie să fie 10 pentru ca această funcție să funcționeze!
    add_filter( 'in_admin_header', 'wp_codex_search_form', 11 );
}
9 nov. 2010 05:22:03
Comentarii

poți actualiza acest cod pentru a se afișa doar utilizatorilor cu un anumit rol (în special administratori)?

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

@NetConstructor.com L-am editat pentru a afișa dacă current_user_can manage plugins, atunci se adaugă filtrul. E atât de simplu.

jaredwilli jaredwilli
23 feb. 2011 02:56:13

Funcționează încă în versiunea curentă de WP... Nu am reușit să-l fac să funcționeze

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

Am încapsulat add_filter în acest apel de acțiune: add_action('plugins_loaded', 'pluginInit');, iar apoi function pluginInit(){if...add_filter(...)} - - rulez acest cod în WP 3.4-alpha și a trebuit să folosesc in_admin_footer

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

Nouă Coloană în Biblioteca Media pentru Reatasarea Imaginilor

Acest cod adaugă o nouă coloană în pagina Biblioteca Media care permite reatasarea imaginilor

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'] = "Părinte";
    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('Reatașează'); ?></a>
            <?php
        } else {
            ?>
            <?php _e('(Neatasat)'); ?><br />
            <a class="hide-if-no-js" onclick="findPosts.open('media[]','<?php echo $post->ID ?>');return false;" href="#the-list"><?php _e('Atașează'); ?></a>
            <?php
        }
}
14 nov. 2010 17:57:56
1
13

Buclă personalizată cu temă folosind shortcode-uri

Argumentele sunt aceleași ca cele din query_posts. Conținutul încadrat între tag-ul query este șablonul.

add_shortcode('query', 'shortcode_query');

function shortcode_query($atts, $content){
  extract(shortcode_atts(array( // câteva valori implicite
   '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();

      // aceste argumente vor fi disponibile din interiorul $content
      $parameters = array(
        'PERMALINK' => get_permalink(),
        'TITLE' => get_the_title(),
        'CONTENT' => get_the_content(),
        'COMMENT_COUNT' => $post->comment_count,
        'CATEGORIES' => get_the_category_list(', '),
        // adaugă aici mai multe...
      );

      $finds = $replaces = array();
      foreach($parameters as $find => $replace):
        $finds[] = '{'.$find.'}';
        $replaces[] = $replace;
      endforeach;
      $output .= str_replace($finds, $replaces, $content);

    endwhile;
  else
    return; // nu s-au găsit postări

  wp_reset_query();
  return html_entity_decode($output);
}

Utilizare:

[query post_type=page posts_per_page=5]
Listare câteva pagini:    
<h5>{TITLE}</h5>
<div>{CONTENT}</div>
<p><a href="{PERMALINK}">{COMMENT_COUNT} comentarii</a></p>
[/query]

(va face o interogare pentru 5 pagini)


Inserarea de widget-uri preconfigurate oriunde folosind shortcode-uri

(unele idei de la http://webdesign.anmari.com/shortcode-any-widget)

add_action('widgets_init', 'create_arbitrary_sidebar');
function create_arbitrary_sidebar(){
  register_sidebar(array(
    'name' => __('Widget-uri Arbitrare'),
    'id' => 'arbitrary',
    'description' => sprintf(__('Widget-urile din această zonă pot fi adăugate în postări/pagini folosind shortcode-urile %1$s sau %2$s.'), '[widget ID]', '[widget Nume]'),
    '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 wp-save :( widget-ul trebuie salvat mai întâi...

  global $wp_registered_widgets;

  // obține widget-urile active din toate barele laterale
  $sidebars_widgets = wp_get_sidebars_widgets();

  // pregătește potrivirile
  $matches = array();
  foreach($wp_registered_widgets as $i => $w)
    if($w['name'] == $widget->name) $matches[] = $w['id'];

  // află poziția widget-ului (numărul)
  $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;">Pentru a include acest widget în postările sau paginile tale, folosește unul dintre următoarele shortcode-uri: <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,        // luat în considerare doar dacă primul argument este "Nume Widget" (nu ID-ul hash-uit)
    'title' => true,          // afișează titluri?
    'area' => 'arbitrary'     // bara laterală de căutat
  ), $atts));

  // obține primul parametru (presupunând că este ID-ul sau numele widget-ului țintă)
  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 "nu există widget-uri active valide în {$sidebar}";

  // presupunând că primim ID-ul hash-uit md5
  foreach ($wp_registered_widgets as $i => $w)
    if ($widget == substr(md5($w['id']), 0, 8)):
      $callback = ($w['callback']);
      $widget = $w['id']; // ID-ul real al widget-ului

    // compară și numele widget-urilor și construiește un array cu posibilele potriviri
    // (folosit mai târziu dacă potrivirea ID eșuează)
    elseif($widget == $w['name'])):
      $possible_matches[] = $w['id'];

    endif;

  // nimic găsit, presupunem că este "Nume 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;

  // ura. l-am găsit
  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();

    // elimină h3 dacă title = false
    if(!$title) $output = preg_replace('#<h3 class="title">(.*?)</h3>#', '', $output);
    return $output;
  else:
   return "instanță widget negăsită: ".esc_attr($atts[0]);
  endif;
}

Utilizare:

Plasează un widget în bara laterală "widget-uri arbitrare", salvează-l și vei primi shortcode-urile :)


Obținerea unei valori de câmp personalizat prin shortcode-uri

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);
}

Utilizare:

  • [field "cheia_mea"]
  • [field "cheia_mea" post_id=1]

Obținerea TinyURL a unui link prin shortcode-uri

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 de 1 zi, poate fi mărit
  endif;

  return '<a href="'.esc_url($cache).'" rel="'.esc_attr($rel).'">'.esc_attr($title).'</a>';
}

Utilizare:

  • [tinyurl]
  • [tinyurl url="http://google.com" title="google"]
21 dec. 2010 22:03:19
Comentarii

Este mai bine să folosești Javascript: <a href="javascript:window.open('http://tinyurl.com/api-create.php?url='+location.href"> Obține Link Scurt </a> (pentru a evita sute de interogări INUTILE de deschidere a paginii (de către roboți sau altele) către TinyUrl...

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

Setează Editorul Implicit la WYSIWYG sau HTML

function my_default_editor() {
    $r = 'tinymce'; // html sau tinymce
    return $r;
}
add_filter( 'wp_default_editor', 'my_default_editor' );

Iată cum poți elimina Editorul HTML

jQuery(document).ready(function($) {
$("#edButtonHTML").remove();
});

ACTUALIZAT iată o altă metodă pentru a seta editorul implicit la HTML

add_filter('wp_default_editor', create_function('', 'return "html";'));
16 nov. 2010 06:56:16
Comentarii

vezi mai multe informații despre sursă: http://wpengineer.com/1946/disable-html-editor-wordpress/

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

Elimină MetaBox-ul Autor/Opțiuni și Mută în MetaBox-ul Publicare

Testat pe: Wordpress 3.0.1

Unul dintre lucrurile care mă enervează este o interfață aglomerată în Administrarea WordPress. Unul dintre elementele pe care le configurez acum întotdeauna de la început în fișierul functions.php este eliminarea MetaBox-ului Autor și a Opțiunilor de Ecran, apoi adăugarea opțiunii în MetaBox-ul de Publicare. În opinia mea, acest lucru are sens și menține lucrurile organizate. De asemenea, respectă permisiunile aplicabile.

Pentru a realiza acest lucru, copiați și lipiți următorul cod în fișierul functions.php.

Dacă considerați că există o metodă mai bună de a face acest lucru, sugerați.

NOTĂ: CODUL A FOST ACTUALIZAT PENTRU A REMEDIA O PROBLEMĂ DE CODARE

// MUTĂ METABOX-UL AUTOR ÎN METABOX-UL PUBLICARE  
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;">Autor: ';  
    post_author_meta_box( $post );  
    echo '</div>';  
}  
30 sept. 2010 06:06:41
Comentarii

Nu adaugă caseta metabox pentru autor în caseta de publicare. Am crezut că este din cauză că nu există add_action pentru funcția move_author_to_publish_box, așa că am adăugat add_action('admin_menu', 'move_author_to_publish_box'); dar asta a generat o "Eroare fatală: Apel către funcția nedefinită post_author_meta_box()"

matt matt
5 dec. 2010 07:02:43

ce versiune de WordPress folosești?

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

Și cum ai adăuga autorul la publicare? Pe admin_init sau pe admin_menu nu ar funcționa.

kaiser kaiser
1 feb. 2011 09:42:15

@kaiser -- Nu sunt sigur că înțeleg întrebarea ta. Acest cod doar elimină metabox-ul "autor" și plasează opțiunea de selectare a autorului în metabox-ul "publicare".

NetConstructor.com NetConstructor.com
1 feb. 2011 17:07:08

@NetConstructor: Tocmai l-am testat ieri (3.0.4) și da, caseta autor a dispărut, dar nu a fost mutată în caseta de publicare. Când mă uit la cod, nu văd nicio modalitate, pentru că funcția nu este declanșată nicăieri... ai adăugat doar funcția remove_author_box() la hook-ul admin_menu, dar nu și funcția move_author_to_publish_box().

kaiser kaiser
1 feb. 2011 20:55:29

@kaiser -- ai dreptate, după ce am revizuit, am observat problema. Am actualizat codul în răspunsul meu, așa că șterge tot ce ai inclus din aceasta înainte și doar lipește codul complet de mai sus. Spune-mi dacă asta rezolvă problema. Votează în sus întrebarea și răspunsul dacă rezolvă problema - CH :)

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

@CH/NC: Sigur că funcționează, nici măcar nu trebuie să-l testezi. Votez în sus: n/p. Ar putea/ar trebui extins să includă și alte prostii/balast... (discuții, thumbnail-ul postării). Nu o să modific răspunsul tău, dar dacă ai ceva timp, chiar ar merita un articol pe blog. :)

kaiser kaiser
2 feb. 2011 01:50:33

@kaiser -- nu sunt exact sigur unde vezi valoare în asta? Obiectivul meu a fost doar să elimin unele dintre metabox-urile care erau în plus și inutile, cum ar fi slug-urile și autorii.

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

@tu: Nu, văd clar beneficiul. Nu doar că m-ai înțeles greșit, dar m-ai interpretat complet pe dos. Am spus că e atât de bun încât ar trebui a) extins la discuții & thumbnail-uri și b) să i se dedice un articol pe blog despre "simplificarea paginilor de editare a conținutului" sau ceva similar. Edit: "Fără nevoie de testare" înseamnă că știu că funcționează.

kaiser kaiser
2 feb. 2011 08:53:13

@kaiser -- apreciez complimentul, dar încă nu înțeleg cum consideri că ar fi benefic pentru utilizatori să integrezi discuțiile sau miniaturile în metabox-ul de publicare. Am văzut doar beneficiul eliminării metabox-urilor pentru slug și autor, deoarece acelea ar trebui să fie în mod logic în interiorul metabox-ului de publicare. Încă nu înțeleg punctul tău?

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

@NC: Nu, m-ai înțeles corect. Pentru mine nu este "metabox-ul de publicare", ci doar o cutie în partea dreaptă sus pentru lucruri mărunte. Nu văd nevoia să existe o cutie separată pentru fiecare linie de text "adaugă miniatură" sau pentru cele două checkbox-uri din discuții. Nimic altceva.

kaiser kaiser
3 feb. 2011 19:09:35
Arată celelalte 6 comentarii
3
11

Determină Rapid Detaliile Serverului și ale Mediului

Dacă ai mai multe servere și mai multe medii, cum ar fi dezvoltare, QA și producție, acest lucru poate fi foarte util.

Pentru sistemele mele, mediul este determinat de primele 3 litere ale numelui gazdei, dar acest lucru poate fi ușor modificat pentru a se potrivi nevoilor tale.

add_action( 'admin_notices', 'report_environment_status', 3 );

// Raportează detaliile serverului și ale mediului
function report_environment_status() {
    $server = php_uname('n');
    switch (strtolower(substr($server,0,3))) {
        case 'pXX':
            $msg = "PRODUCȚIE";
            break;
        case 'qXX':
            $msg = "QA";
            break;
        case 'dXX':
            $msg = "DEZVOLTARE";
            break;
        default :
            $msg = 'NECUNOSCUT';
    }
    echo "<div id='update-nag'>";
    echo "<b>Ești în mediul $msg. (Server: $server)</b>";
    echo "</div>";
}

Acest lucru m-a salvat de multe ori de la a face actualizări în mediul greșit.

Poți să transformi acest cod într-un plugin și să-l activezi în rețea, astfel încât toate site-urile să primească notificarea.

5 nov. 2010 22:03:12
Comentarii

mulțumesc pentru acest articol. Poți să elaborezi puțin mai mult despre acest subiect și diferite cazuri de utilizare? Cred că ar fi FOARTE util pentru mine și pentru alții dacă ai putea include eventual și alte fragmente de cod pe care le folosești când rulezi diferite versiuni de dezvoltare ale codului. De asemenea, dacă ai o metodă eficientă de a muta un site de la mediu de dezvoltare la producție sau de a migra de la un domeniu la altul. Toate aceste lucruri sunt foarte utile. În final, folosești vreun client de subversion când actualizezi fișierele? Dacă da, faci ceva anume în acest sens?

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

Te rog să nu marchezi acest răspuns ca soluție. Altfel, această listare nu va funcționa.

hakre hakre
6 nov. 2010 19:41:34

Cred că ar fi mai bine să folosești clase CSS diferite pentru mesaj, astfel încât mesajele să poată avea culori de fundal diferite în diferite medii, nu doar text ușor diferit. Altfel, cred că diferențele de text vor deveni rapid invizibile.

Ian Dunn Ian Dunn
16 ian. 2012 21:01:09
0
10

Rezolvat: Eliminarea casetelor meta implicite din WordPress

Acest lucru era foarte util, dar avea câteva erori

// ELIMINĂ CASETELE META DIN ECRANUL IMPLICIT AL POSTĂRILOR
function remove_default_post_screen_metaboxes() {
 remove_meta_box( 'postcustom','post','normal' ); // Caseta meta Câmpuri Personalizate
 remove_meta_box( 'postexcerpt','post','normal' ); // Caseta meta Rezumat
 remove_meta_box( 'commentstatusdiv','post','normal' ); // Caseta meta Comentarii
 remove_meta_box( 'trackbacksdiv','post','normal' ); // Caseta meta Trackback-uri
 remove_meta_box( 'slugdiv','post','normal' ); // Caseta meta Slug
 remove_meta_box( 'authordiv','post','normal' ); // Caseta meta Autor
}
add_action('admin_menu','remove_default_post_screen_metaboxes');


// ELIMINĂ CASETELE META DIN ECRANUL IMPLICIT AL PAGINILOR
function remove_default_page_screen_metaboxes() {
 global $post_type;
 remove_meta_box( 'postcustom','page','normal' ); // Caseta meta Câmpuri Personalizate
 remove_meta_box( 'postexcerpt','page','normal' ); // Caseta meta Rezumat
 remove_meta_box( 'commentstatusdiv','page','normal' ); // Caseta meta Comentarii
 remove_meta_box('commentsdiv','page','normal'); // Comentarii
 remove_meta_box( 'trackbacksdiv','page','normal' ); // Caseta meta Trackback-uri
 remove_meta_box( 'slugdiv','page','normal' ); // Caseta meta Slug
 remove_meta_box( 'authordiv','page','normal' ); // Caseta meta Autor
}
add_action('admin_menu','remove_default_page_screen_metaboxes');
9 nov. 2010 00:45:36
2
10

Extinderea perioadei de auto deconectare

Testat pe: WordPress 3.0.1

Folosind codul de mai jos, puteți crește timpul în care cookie-urile sunt păstrate și, prin urmare, utilizatorii autentificați rămân conectați mai mult timp:

function keep_me_logged_in_for_1_year( $expirein ) {
   return 31556926; // 1 an în secunde
}
add_filter( 'auth_cookie_expiration', 'keep_me_logged_in_for_1_year' );
11 nov. 2010 14:57:07
Comentarii

există un alt truc care poate fi folosit și pe care l-am găsit aici: http://wpengineer.com/2064/stop-wordpress-from-ever-logging-out/

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

Trebuie menționat că timeout-ul de sesiune există ca o măsură de securitate, așa că prelungirea/eliminarea lui face site-ul tău mai vulnerabil.

Ian Dunn Ian Dunn
16 ian. 2012 20:58:22
3
10

Adăugarea unui link "Setări" pentru plugin-uri pe pagina de listare a plugin-urilor

Configurarea linkului "Setări" pentru plugin-uri pe pagina de plugin-uri în interfața de administrare WordPress, ușor de utilizat pentru a accesa rapid setările (codul include și o soluție pentru versiunile de WordPress mai mici de 2.9)

// definiții 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) {
  /* creare link */
  if ( $file == FB_BASENAME ) {
    array_unshift(
      $links,
      sprintf( '<a href="options-general.php?page=%s">%s</a>', FB_FILENAME, __('Setări') )
    );
  }
  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
Comentarii

Am încercat să folosesc acest cod, dar se pare că nu funcționează pe WordPress 3.1. Poți confirma și actualiza?

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

@NetConstructor.com Am actualizat puțin dintr-unul dintre plugin-urile mele gratuite, pe toate plugin-urile mele funcționează bine acest lucru

bueltge bueltge
28 feb. 2011 19:23:56

Aș dori ca toți autorii de plugin-uri să facă acest lucru (pentru plugin-urile care au pagini de setări, desigur) astfel încât acest tip de cod să nu mai fie necesar.

JimmyPena JimmyPena
6 dec. 2011 21:00:37
1
10

Eliminarea Legăturilor Automate ale URL-urilor în Comentariile WordPress

remove_filter('comment_text', 'make_clickable', 9);
28 dec. 2010 02:14:24
Comentarii

Super! Căutam acea funcție make_clickable() să o aplic la the_content! De ce nu au făcut-o de la început? E la fel de simplu ca a adăuga add_filter( 'the_content', 'make_clickable'); Alternativ, s-ar putea face când postarea este salvată folosind un alt hook

fregante fregante
11 ian. 2014 02:57:27
1
10

Adăugare filtru pentru șabloane de pagini în lista de pagini

Testat pe: WP 3.1

Adaugă un filtru pentru șabloanele de pagini în lista de pagini, permițând vizualizarea unei liste de pagini care au un anumit șablon asociat.

class Page_Template_Filter {
    private $templates = array();
    public function __construct() {
        // Dacă nu suntem în zona de administrare sau utilizatorul curent nu poate edita pagini, ieșim
        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=""> - fără șablon - </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;
}

Necesită cel puțin versiunea 3.1 pentru a funcționa, deși meta_query poate fi înlocuit cu meta_key și meta_value pentru versiunea 3.0.

19 mar. 2011 17:52:55
Comentarii

funcționează impecabil, testat în 3.4-alpha

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

Afisează doar postările și fișierele media ale autorului conectat & corectează numărul de postări/media din barele de filtrare.

Testat pe: Wordpress 3.4.1

În mod implicit, WordPress permite Autorilor să vadă titlurile postărilor altor utilizatori, ciorne nepublicate și toate fișierele media, chiar dacă nu le pot edita.

Folosește acest cod pentru a permite afișarea doar a postărilor și fișierelor media ale autorului care este conectat în prezent.

Spre deosebire de alte soluții, acest cod corectează și numărul de postări/media din barele de filtrare (Toate|Publicate|Ciorne|În așteptare|Gunoi; Toate|Imagini|Video|Neatașate).

// Afișează doar postările și fișierele media ale autorului conectat
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');
    }
}

// Corectează numărul de postări
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 .'>Toate <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 .'>Publicate <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 .'>Ciornă'. ((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 .'>În așteptare <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 .'>Gunoi <span class="count">(%d)</span></a>', 'trash'),
                admin_url('edit.php?post_status=trash&post_type=post'),
                $result->found_posts);
        endif;
    }
    return $views;
}

// Corectează numărul de fișiere 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( __('Toate <span class="count">(%s)</span>', 'fișiere încărcate' ), 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( __( 'Neatașate <span class="count">(%s)</span>', 'fișiere detașate' ), $total_orphans ) . '</a>';
    return $views;
}
26 nov. 2011 15:11:36
Comentarii

fragment bun, singurul dezavantaj este că dacă nu există elemente media în bibliotecă, afișează erori deoarece rezultatul nu este un array.

chrismccoy chrismccoy
25 feb. 2012 02:38:23

Am definit $_num_posts ca un array. Acest lucru ar trebui să remedieze erorile pe care le primești când nu există elemente media în bibliotecă.

Paul Paul
17 aug. 2012 00:02:53

Știu că a trecut mult timp de când am întrebat despre asta, dar am încercat cu CPT-ul meu și numărul de postări nu pare să funcționeze, deși am schimbat toate tipurile de tur cu CPT-ul meu.

De asemenea, există vreo modalitate de a aplica filtrul și pentru termenii din CPT-ul meu?

Apropo, mulțumesc mult pentru codul tău.

Loc_rabbirt Loc_rabbirt
14 feb. 2020 02:06:54
2

Elimină XML-RPC când nu este folosit pentru o îmbunătățire a performanței

Testat pe: Wordpress 3.0.1

WordPress utilizează o operațiune CURL pentru a testa capacitatea SSL pentru XML-RPC. Dacă folosești XML-RPC dar nu-l utilizezi, poți elimina filtrul. Aceasta este o mică îmbunătățire a performanței (deoarece practic WP face un GET prin cURL pe URL-ul https și fie 1) primește un mesaj de respingere, fie 2) depășește timpul de așteptare, iar acest lucru poate dura până la 5 secunde), dar în cazul nostru a prevenit chiar un timeout al gateway-ului, unde un proxy depășea timpul de așteptare înainte ca operațiunea cURL GET să se termine, făcând XML-RPC inutilizabil.

// Previne WordPress să testeze capacitatea SSL pe domain.com/xmlrpc.php?rsd
remove_filter('atom_service_url','atom_service_url_filter');
13 sept. 2010 22:24:19
Comentarii

Mulțumesc pentru sugestia de cod. O întrebare, dacă folosești XML-RPC dar nu folosești capabilitățile SSL, ar putea includerea acestui cod să accelereze lucrurile? Dacă nu, în ce situații ar fi benefică includerea acestui cod?

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

Are un efect minuscul asupra performanței pentru apelurile XML-RPC, deoarece acestea nu mai trebuie să verifice capacitatea SSL printr-o cerere HTTP.

gabrielk gabrielk
19 sept. 2010 20:57:49
2

Colecție de modificări rapide în functions.php

Am și eu câteva ajustări minunate în functions.php. Le-am găsit pe majoritatea căutându-le de-a lungul anilor.

Sfârșitul Excerpt

function new_excerpt_more($more) {
    return '...';
}
add_filter('excerpt_more', 'new_excerpt_more');

Înlocuire Logo WP Admin

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 Personalizat pentru 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' );

Subsol Personalizat pentru Admin

function custom_admin_footer() {
echo 'Bine ați venit pe blogul meu! Fără link-uri de documentare!';
}
add_filter('admin_footer_text', 'custom_admin_footer');
6 nov. 2010 23:08:39
Comentarii

mulțumesc, dar acestea au fost deja adăugate.

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

poți, te rog, să verifici acestea și să te asiguri că nu există intrări duplicate și să le separi fiecare în propriul răspuns în următoarele săptămâni?

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

Obține toate câmpurile personalizate global

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;
}

Apoi apelează câmpul cu o singură linie

<?php get_custom_field('nume-camp-personalizat', TRUE); ?>
15 nov. 2010 07:45:04
Comentarii

De ce ar folosi cineva asta? Care sunt beneficiile?

matt matt
5 dec. 2010 07:10:33

pentru site-uri/template-uri care folosesc multe câmpuri personalizate (pe care le folosesc des în proiectele pentru clienți), permite mai puțin cod în template și de asemenea adăugarea de condiții pentru a decide dacă să afișeze sau nu câmpul respectiv.

Norcross Norcross
11 dec. 2010 00:44:34
0

Returnează numărul de comentarii

Aceasta este similar cu count_user_posts(), dar returnează numărul de comentarii în loc de postări:

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;
}

Mai mult: Numără postările utilizatorului (inclusiv tipurile personalizate de postări) sau comentariile:

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;
}

Exemple de utilizare:

<?php echo atom_count(1, 'movie'); // afișează numărul de postări de tip 'movie' ?>

<?php echo atom_count(1, 'comment'); // afișează numărul de comentarii ?>

17 nov. 2010 04:52:13
0

Activează oEmbed în Widget-urile Text/HTML

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

Folosesc acest cod pentru widget-uri cu videoclipuri YouTube și conținut Flickr.

28 dec. 2010 02:07:12
3

Numărătoare Cuvinte Articol

Testat pe: Wordpress 3.0.1

(Extras inițial din modulul Post Word Count de Nick Momrick)

Adaugă un contor al totalului de cuvinte publicate în partea de jos a casetei "Right Now" din panoul de administrare. Util dacă folosești blogul ca mediu pentru ceva de genul NaNoWriMo sau dacă vrei să ții evidența cât de prolific ai devenit în scris.

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 );
    // Acest bloc va adăuga numărătoarea de cuvinte în secțiunea de statistici din caseta Right Now
    $text = _n( 'Cuvânt', 'Cuvinte', $num );
    echo "<tr><td class='first b'>{$num}</td><td class='t'>{$text}</td></tr>";
    // Această linie va adăuga numărătoarea de cuvinte în partea de jos a casetei Right Now.
    echo '<p>Acest blog conține un total de <strong>' . $num . '</strong> cuvinte publicate!</p>';
}

// adaugă în tabelul Statistici Conținut
add_action( 'right_now_content_table_end', 'post_word_count');
// adaugă în partea de jos a casetei Activitate
add_action('activity_box_end', 'post_word_count');

Mulțumiri speciale lui Rarst pentru optimizarea codului fără interogări!

15 sept. 2010 18:58:01
Comentarii

Mulțumesc pentru ajutor, Rarst. De obicei nu-mi place să includ interogări directe la baza de date în codul din function.php al pluginului, dar cum am spus, inițial am preluat codul de la alt plugin.

EAMann EAMann
15 sept. 2010 19:56:22

Nicio problemă, am încercat asta acum mult timp și a fost un dezastru. :) Acum, cu abilitățile îmbunătățite, era momentul să o fac corect. De ce ai lăsat partea veche de afișare? Cred că are sens să o afișezi împreună cu restul statisticilor. Apropo, această versiune afișează un total diferit (comparativ cu explode), probabil din cauza filtrelor aplicate pe parcurs când se preiau datele prin API.

Rarst Rarst
15 sept. 2010 20:05:31

Diferența în numărul de articole este rezultatul filtrelor... dar folosirea get_posts() va oferi cel mai probabil un număr de cuvinte mai precis. Am lăsat linia veche de afișare pur și simplu pentru că așa am folosit-o eu până acum... mai degrabă o diferență de opinie decât altceva... voi readăuga exemplul tău pentru a-l include în statistici, astfel încât utilizatorii să poată alege.

EAMann EAMann
15 sept. 2010 20:17:22
0

Încărcarea condiționată a scripturilor

Iată o metodă de a încărca scripturi doar dacă un anumit shortcode sau widget este prezent. sursă: Încărcarea scripturilor doar dacă un anumit shortcode sau widget este prezent

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');

Și iată cum să încărcați scripturi doar dacă un anumit widget este prezent

Pentru a încărca scriptul doar în pagina unde widget-ul este încărcat, va trebui să adăugați codul is_active_widget() în clasa widget-ului. De exemplu, vedeți widget-ul implicit pentru comentarii recente (wp-includes/default-widgets.php, linia 602):

class WP_Widget_Recent_Comments extends WP_Widget {
    function WP_Widget_Recent_Comments() {
        $widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'Cele mai recente comentarii' ) );
        $this->WP_Widget('recent-comments', __('Comentarii Recente'), $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 sept. 2010 14:57:18
0

CSS Personalizat pentru Panoul de Control

/* Modifică CSS-ul panoului de control WordPress */
function custom_admin_styles() {
    echo '<style type="text/css">#wphead{background:#069}</style>';
}
add_action('admin_head', 'custom_admin_styles');

Puteți adăuga orice modificări CSS între tag-urile <style>.

10 nov. 2010 20:42:26
0

Elimină Prefixele Private și Protejate

Această funcție elimină prefixul "Privat:" din articolele și paginile marcate ca private. Utilă pentru conținut vizibil doar utilizatorilor autentificați sau anumitor grupuri.

function the_title_trim($title) {
$title = attribute_escape($title);
$findthese = array(
    '#Protected:#',
    '#Private:#'
);
$replacewith = array(
    '', // Ce să înlocuiască "Protected:" 
    '' // Ce să înlocuiască "Private:" 
);
$title = preg_replace($findthese, $replacewith, $title);
return $title;
}
add_filter('the_title', 'the_title_trim');

ACTUALIZARE: Am actualizat codul pentru a include și eliminarea prefixului "Protejat:".

3 dec. 2010 20:13:33
0

Lungime personalizată a rezumatului

function excerpt($num) {
    $limit = $num+1;
    $excerpt = explode(' ', get_the_excerpt(), $limit);
    array_pop($excerpt);
    $excerpt = implode(" ",$excerpt)."... (<a href='" .get_permalink($post->ID) ." '>Citește mai mult</a>)";
    echo $excerpt;
}

Limitează lungimea rezumatului afișat scriind în tema: excerpt('20');

Exemplu: <?php excerpt('22'); ?> Aceasta va limita rezumatul la 22 de caractere.

Rezumatul va fi întrerupt cu ... (Citește mai mult)

2 ian. 2011 22:00:51
0

Adaugă slug-ul paginii părinte în body_class

/***************************************************************
* Funcția body_class_section
* Adaugă pagina de nivel superior în clasa body pentru secțiuni 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;
}

Acest filtru adaugă o clasă unică body bazată pe cel mai înalt nivel al părintelui paginii curente. Folosesc acest lucru pentru site-uri care au culori sau layout-uri specifice pentru fiecare secțiune a site-ului. Funcționează cel mai bine cu site-uri bazate pe pagini. Exemple CSS:

.section-about { background: red; }
.section-portfolio { background: blue; }

Tema ta trebuie să folosească și funcția body_class.

Remediază obiectele Flash oEmbed

/***************************************************************
* Funcția my_oembed_wmode
* Remediază modul fereastră pentru obiectele Flash oEmbed
***************************************************************/

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;
}

Am avut probleme în trecut când obiectele Flash oEmbed intrau în conflict cu meniurile derulante. Acest filtru remediază problema prin adăugarea unui mod transparent al ferestrei la embed-uri.

Elimină coloana "comentarii" din lista paginilor din Admin

/***************************************************************
* Funcția custom_pages_columns
* Elimină "comentarii" din vizualizarea paginilor (rar folosesc comentarii pe pagini)
***************************************************************/

add_filter('manage_pages_columns', 'custom_pages_columns');

function custom_pages_columns($defaults) {
    unset($defaults['comments']);
    return $defaults;
}

Folosesc foarte rar comentariile pe pagini, iar acest lucru ajută la menținerea curățeniei în panoul de control WordPress.

21 feb. 2011 21:03:12
1

Activează Paginarea Numerică

Testat pe: Wordpress 3.0.1

/* Paginare Numerică ********************************************/

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'];

 // setează pagina curentă dacă suntem pe prima pagină
 if ($paged == null) {
  $paged = 1;
 }

 // verifică dacă începutul paginilor vizibile este la jumătatea intervalului și ajustează dacă e cazul
 if ($paged > floor($pageCount / 2)) {
  $pageStart = $paged - floor($pageCount / 2);
 }

 if ($pageStart < 1) {
  $pageStart = 1;
 }

 // asigură că începutul paginilor nu depășește numărul total de pagini
 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
 }
 // prima pagină nu este vizibilă...
 if ($pageStart > 1) {
  //echo 'previous';
 }
 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
  }
 }
 // ultima pagină nu este vizibilă
 if ($pageStart + $pageCount < $query->max_num_pages) {
  //echo "last";
 }
 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 sept. 2010 03:04:37
Comentarii

Există deja o funcție în WordPress pentru paginare numerică, vezi http://codex.wordpress.org/Function_Reference/paginate_links

t31os t31os
11 nov. 2010 19:09:23
1

Afisează conținut specific doar pentru utilizatorii autentificați

Testat pe: Wordpress 3.0.1

function content_only4logged_in($content) {

    // TOȚI UTILIZATORII AUTENTIFICAȚI
    if ( is_user_logged_in() &&
            !is_null($content) &&
            !is_feed()
         ) {
        return $content;
    } else {
        $content  = wp_html_excerpt( $content, 80 );
        $content .= ' …';
        $content .= __( 'Ne pare rău, restul acestui conținut este disponibil doar pentru utilizatorii autentificați.', FB_TEXTDOMAIN );
        return $content;
    }
}
add_action( 'the_content', 'content_only4logged_in' );

mai multe posibilități și informații în articolul http://wpengineer.com/2046/control-the-wordpress-content-via-userrights-or-time/

17 sept. 2010 11:34:49
Comentarii

Nu reușesc să afișez conținut modificat pentru utilizatorii nelogati... prima parte funcționează bine, dar dacă utilizatorul nu este logat și pagina este marcată ca privată, primesc doar eroarea 404 obișnuită?

gillespieza gillespieza
9 feb. 2011 22:58:07
2

Fă-ți Linkurile Scurte și Mai Scurte prin Eliminarea WWW

Testat pe: Wordpress 3.0.1

Fă-ți linkurile scurte și mai scurte dacă incluzi www. în domeniul tău. Via scratch99.com:

add_filter('get_shortlink','sjc_alter_shortlink');
function sjc_alter_shortlink($shortlink) {
    $shortlink = preg_replace('/^(https?:\/\/)?(www\.)/','$1',$shortlink);
    return $shortlink;
}
28 sept. 2010 03:53:46
Comentarii

Ar trebui adăugată o verificare pentru a ne asigura că șirul "www." este eliminat doar dacă se găsește la începutul părții de domeniu din URL-ul original. Înlocuirea acestuia oriunde în URL va duce la erori dacă a fost folosit pe un domeniu precum owww.com (care pare să ruleze WordPress) :)

Ingve Ingve
29 mai 2012 00:30:34

@Ingve Am rezolvat, acum va elimina doar www-ul inițial

fregante fregante
11 ian. 2014 03:04:48
2

Verifică dacă un articol are conținut încorporat

Verifică dacă un articol are conținut încorporat, funcționează în bucla folosind ID-ul articolului curent, sau poate primi un ID pentru a determina articolul care trebuie verificat pentru conținut încorporat.

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;
}

Folosești funcția în același mod în care verifici dacă un articol are o etichetă..

if( has_embed() ) {
   // fă ceva
}

Funcția returnează true dacă găsește un conținut încorporat, false în caz contrar.

4 nov. 2010 19:11:02
Comentarii

Interesant, dar mă întreb, de ce l-ai folosi? Ce fel de aplicații are?

matt matt
5 dec. 2010 07:08:44

Verificarea dacă un post conține un embed pe o pagină care afișează rezumate ar fi una dintre utilizări (și este cazul de utilizare original pentru care l-am scris). Alte cazuri posibile de utilizare ar fi cu utilizatorii care își scriu propriile șabloane de teme și doresc să ofere funcționalități în funcție de faptul dacă un post (sau un tip) are conținut încorporat, fără a fi nevoie de un filtru pe the_content sau numeroase apeluri get_post_custom_keys.

t31os t31os
5 dec. 2010 11:34:42
0

Afisarea postărilor din diferite tipuri personalizate de postări pe pagina principală

Prin adăugarea următorului cod la sfârșitul acestui articol în fișierul functions.php, puteți face ca WordPress să afișeze automat postări din diferite tipuri personalizate de postări pe care le-ați creat. În mod implicit, WordPress afișează doar postările care aparțin tipului standard "post".

În exemplul de mai jos, va trebui să modificați secțiunea care conține:

$query->set( 'post_type', array('post', 'page', 'services', 'attachment'));

Cu propriile tipuri personalizate de postări pe care doriți să le includeți în lista de rezultate de pe pagina principală. În acest caz, cerem WordPress să returneze toate postările care aparțin tipurilor standard "post" și "page", apoi să includă și tipul personalizat "services" creat de noi și în final tipul implicit WordPress "attachment", ceea ce înseamnă că orice element adăugat în biblioteca media va fi afișat automat pe pagina principală ca o intrare separată.

// LISTA PERSONALIZATĂ DE POSTĂRI PE PAGINA PRINCIPALĂ, INCLUZÂND DIFERITE POST_TYPE
// asigurați-vă că editați tipurile de postări pe care doriți să le includeți în lista de mai jos
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;
}

De asemenea, puteți utiliza această interogare personalizată în diferite locații, cum ar fi într-un flux personalizat, folosind ceva de genul:

if (( is_home() && false == $query->query_vars['suppress_filters'] ) || is_feed())
14 nov. 2010 21:53:13
0

Elimină câmpurile implicite de contact din profilul utilizatorului și înlocuiește-le cu ceva mai util

A doua parte a acestei funcții a fost deja menționată mai sus, dar eliminarea câmpurilor implicite - AIM, Yahoo IM și Jabber/Google Talk - nu a fost încă abordată:

function update_contact_methods( $contactmethods ) {

// Elimină câmpurile implicite inutile și nedorite
unset($contactmethods['aim']);  
unset($contactmethods['jabber']);  
unset($contactmethods['yim']);  

// Adaugă câmpuri noi  
$contactmethods['phone'] = 'Telefon';  
$contactmethods['mobile'] = 'Mobil';  
$contactmethods['address'] = 'Adresă';  

return $contactmethods;
}
add_filter('user_contactmethods', 'update_contact_methods');

Desigur, poți adăuga oricâte câmpuri dorești (vezi exemplele anterioare din acest fir) sub secțiunea "Adaugă câmpuri noi"

22 dec. 2010 10:46:37