Cea mai bună colecție de cod pentru fișierul tău 'functions.php'
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.

Adăugarea automată a imaginilor de antet dintr-o locație de director
În tema implicită care vine cu WordPress veți observa un meniu suplimentar de temă care se activează și vă permite să selectați o imagine de antet pentru a fi utilizată. În codul temei implicite, aceste imagini sunt hardcodate în fișierul functions.php. Codul de mai jos permite WordPress să preia automat imagini noi bazate pe un director specific de imagini de antet pe care îl puteți crea pe server (sau în folderul temei dumneavoastră).
Acesta va include automat orice fișiere .jpg sau .jpeg. Fiecare imagine trebuie să aibă un fișier thumbnail asociat, dar acesta poate fi doar o copie a originalului cu un nume diferit care trebuie să se termine cu "-thumbnail". Numele asociat este folosit ca descriere în setările de aspect pentru antete, iar underscore-urile sunt înlocuite automat cu spații. (de ex. My_Header_Image_A.jpg, My_Header_Image_A-thumbnail.jpg va avea descrierea prezentată automat ca "My Header Image A")
if ($handle = opendir( TEMPLATEPATH . '/images/headers/') ) {
$headers = array();
while (false !== ($file = readdir($handle))) {
$pos = strrpos( $file, '.' );
if( $pos !== false && $pos > 0 ) {
$file_name = substr( $file, 0, $pos );
if( strpos( $file_name, "-thumbnail" ) === false ) {
$file_ext = substr( $file, $pos+1 );
$file_ext_low = strtolower( $file_ext );
if( $file_ext_low == "jpg" || $file_ext_low == "jpeg" ) {
$headers[$file_name] = array (
'url' => '%s/images/headers/' . $file,
'thumbnail_url' => '%s/images/headers/' . $file_name ."-thumbnail." . $file_ext,
'description' => __( str_replace( "_", " ", $file_name ), 'twentyten' )
);
}
}
}
}
closedir($handle);
register_default_headers( $headers );
}

Afisarea informațiilor pentru utilizatorii autentificați
if ( is_user_logged_in() ) {
}
nu funcționează în fișierul functions.php. Puteți utiliza acest cod:
if ( !function_exists('is_user_logged_in') ) :
function is_user_logged_in() {
$user = wp_get_current_user();
if ( $user->id == 0 ){
// Această secțiune dacă utilizatorul nu este autentificat
} else {
// Această secțiune dacă utilizatorul este autentificat
}
}
endif;

if( !current_user_can('read') )
ar trebui să prindă vizitatorii (adică utilizatorii nelogati) ..

Logo-uri personalizate pentru pagina de autentificare și Admin
/*-----------------------------------------------------------------------------------*/
/* Logo-uri personalizate
/*-----------------------------------------------------------------------------------*/
function custom_admin_logo() {
echo '
<style type="text/css">
#header-logo { background-image: url('.get_bloginfo('template_directory').'/path/to/images/admin-logo.png) !important; }
</style>
';
}
add_action('admin_head', 'custom_admin_logo');
function custom_login_logo() {
echo '<style type="text/css">
h1 a { background-image:url('.get_bloginfo('template_directory').'/path/to/images/login-logo.png) !important; }
</style>';
}
add_action('login_head', 'custom_login_logo');

Te rog să arunci o privire la acest gist. Există chiar și opțiuni mai bune decât cele afișate în gist. Ai putea încerca să participi și la ticket-ul trac (link în antetul pluginului gist).

Eliminare Administrator (Utilizator #1) din Lista de Utilizatori
function your_pre_user_query($user_search) {
$user = wp_get_current_user();
if ($user->ID!=1) { // Verifică dacă utilizatorul curent NU este administratorul principal (ID 1)
global $wpdb;
$user_search->query_where = str_replace('WHERE 1=1',
"WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where); // Exclude utilizatorul cu ID 1 din interogare
}
}
add_action('pre_user_query','your_pre_user_query'); // Adaugă acțiunea pentru filtrul pre_user_query

Din nou: utilizatorul 1 poate fi un non-admin. Vezi Roluri și Capabilități.

Este un exemplu. În plus, în instalările implicite utilizatorul 1 este Admin - primul utilizator creat. De aceea am evidențiat (Utilizatorul #1)

Acesta este un exemplu care arată cum să nu verifici capabilitățile administrative. Nu ar trebui să folosești acest cod pe un site real.

Exact. Acest cod nu verifică capacitățile, toscho, ci un anumit utilizator. Acest cod nu are nicio legătură cu capacitățile și nu am menționat capacitățile nicăieri. Nu văd de ce acest lucru nu ar putea fi folosit pe site-uri de producție.

@Daniel Sachs Dacă cauți primul administrator adăugat vreodată, te rog verifică mai întâi rolurile tuturor utilizatorilor, apoi sortează-i după ID și ia-l pe primul. După cum a spus @toscho: În prezent este "exemplul cum NU ar trebui să faci asta". Motive: a) administratorul real poate să nu fie cel cu ID-ul cel mai mic b) Dacă altcineva ar lucra la asta, ea/el nu ar căuta această funcționalitate într-o temă.

Obține Atributele unei Miniaturi Date
Folosește această funcție în buclă pentru a determina lățimea, înălțimea și URL-ul unei imagini miniaturizate. Foarte utilă pentru atribuirea unei imagini miniaturizate ca element de fundal prin CSS inline.
/**
* OBȚINE ATRIBUTELE MINIATURII
*
* Extrage lățimea, înălțimea și URL-ul unei miniaturi.
*
* @author Philip Downer <philip@manifestbozeman.com>
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version v1.0
*
* @param string $return Acceptă 'path', 'width', sau 'height'.
* @param string $size Dimensiunea miniaturii corespunzătoare funcției {@link add_image_size()} din nucleul WP.
* @return mixed Returnează informația solicitată sau 'false' dacă nu există 'Imagine Reprezentativă' asignată.
*/
function get_thumb_attr($return,$size='thumbnail') {
global $post;
if (has_post_thumbnail($post->ID)) {
$thumb = wp_get_attachment_image_src(get_post_thumbnail_id(), 'intro');
if ( $return == 'path' ) { return $thumb[0]; }
if ( $return == 'width' ) { return $thumb[1]; }
if ( $return == 'height' ) { return $thumb[2]; }
} else {
return false;
}
}//end function

Afisează conținutul unui widget în afara contextului unei bare laterale folosind ID-ul său. Codul HTML de învelire (before/after) nu este inclus. Trebuie să cunoști ID-ul specific al widget-ului pe care îl cauți (de exemplu 'text-5').
function widget_contents($id) {
list($type,$number) = explode('-',$id);
global $wp_registered_widgets;
$wp_registered_widgets[$id]['callback'][0]->display_callback(array('widget_id'=>$id),$number);
}
Poți verifica rezultatul funcției wp_get_sidebars_widgets() dacă nu ești sigur de ID-ul exact de care ai nevoie.
Un exemplu mai complet preluat din /wp-includes/widgets.php sub funcția dynamic_sidebar():
function render_widget($id) {
global $wp_registered_widgets;
$params = array_merge(
array( array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ),
(array) $wp_registered_widgets[$id]['params']
);
$classname_ = '';
foreach ( (array) $wp_registered_widgets[$id]['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'], $id, $classname_);
if ( is_callable($wp_registered_widgets[$id]['callback']) )
call_user_func_array($wp_registered_widgets[$id]['callback'], $params);
}

Uf. Metoda mult mai simplă ar fi să folosești the_widget()
http://codex.wordpress.org/Function_Reference/the_widget

Emoticoane personalizate (plugin)
/**
* Emoticoane.
*/
function filter_smilies_src($img_src, $img, $siteurl) {
return plugins_url('', __FILE__) . '/img/smilies/' . $img;
}
add_filter('smilies_src', 'filter_smilies_src', 1, 10);
Emoticoane personalizate (temă)
/**
* Emoticoane.
*/
function filter_smilies_src($img_src, $img, $siteurl) {
return get_bloginfo('stylesheet_directory') . '/images/smilies/' . $img;
}
add_filter('smilies_src', 'filter_smilies_src', 1, 10);

Repozitionarea editorului WYSIWYG prin JQUERY
Testat pe: Wordpress 3.0.1
Acest cod vă va permite să eliminați anumite cutii meta pe care WordPress le adaugă implicit pe ecranele de POSTĂRI și PAGINI.
// REPOZITIONAREA EDITORULUI WYSIWYG PRIN JQUERY
add_action('admin_head','admin_head_hook');
function admin_head_hook() {
?><style type="text/css">
#postdiv.postarea, #postdivrich.postarea { margin:0; }
#post-status-info { line-height:1.4em; font-size:13px; }
.custom-wysiwyg-editor-container { margin:2px 6px 6px 6px; }
#ed_toolbar { display:none; }
#postdiv #ed_toolbar, #postdivrich #ed_toolbar { display:block; }
</style><?php
}
add_action('admin_footer','admin_footer_hook');
function admin_footer_hook() {
?><script type="text/javascript">
jQuery('#postdiv, #postdivrich').prependTo('.custom-wysiwyg-editor-container');
</script><?php
}

Închidere automată a etichetelor lipsă din editorul WYSIWYG
Testat pe: Wordpress 3.0.1
Acest cod va închide automat orice etichetă lipsă atunci când utilizați editorul WYSIWYG.
// CURĂȚARE AUTOMATĂ A HTML DIN EDITORUL WYSIWYG PRIN ÎNCHIDEREA ETICHETELOR LIPSĂ
function clean_bad_content($bPrint = false) {
global $post;
$szPostContent = $post->post_content;
$szRemoveFilter = array("~<p[^>]*>\s?</p>~", "~<a[^>]*>\s?</a>~", "~<font[^>]*>~", "~<\/font>~", "~style\=\"[^\"]*\"~", "~<span[^>]*>\s?</span>~");
$szPostContent = preg_replace($szRemoveFilter, '', $szPostContent);
$szPostContent = apply_filters('the_content', $szPostContent);
if ($bPrint == false) return $szPostContent;
else echo $szPostContent;
}

Elimină atributele role="search"
pentru get_search_form()
function remove_role_search($role)
{
$result = array();
// Caută toate atributele role în șir
preg_match_all('|role="[^"]*"|U', $role, $result);
// Elimină fiecare atribut role găsit
foreach ($result[0] as $role_tag) {
$role = str_replace($role_tag, '', $role);
}
return $role;
}
// Aplică filtrul pe formularul de căutare
add_filter('get_search_form', 'remove_role_search');

Adăugarea unui Link de Autentificare în wp_nav_menu
//ADAUGĂ LINK DE AUTENTIFICARE/DEAUTENTIFICARE ÎN MENIU
add_filter('wp_nav_menu_items', 'add_login_logout_link', 10, 2);
function add_login_logout_link($items, $args) {
$loginoutlink = wp_loginout('index.php', false);
$items .= '<li>'. $loginoutlink .'</li>';
return $items;
}

Schimbarea numelui meniului "Postări" în admin la orice doriți (de exemplu "Articole")
// conectarea filtrelor de traducere
add_filter('gettext','change_post_to_article');
add_filter('ngettext','change_post_to_article');
function change_post_to_article( $translated ) {
$translated = str_ireplace('Post','Articol',$translated );// ireplace este doar pentru PHP5
return $translated;
}
Credite către smashingmagazine.com

Elimină Elementul de Meniu Linkuri
Multe dintre instalările mele WordPress nu necesită ca utilizatorii să aibă acces la elementul de meniu 'Linkuri'. Această funcție îl elimină din vedere.
add_action( 'admin_menu', 'custom_admin_menu' );
function custom_admin_menu()
{
global $menu;
// var_dump($menu); // folosește aceasta pentru a identifica cheia pentru elementul de meniu pe care dorești să-l elimini
unset( $menu[15] ); //cheia 15 este pentru linkuri
if ( !current_user_can('manage_options') ) { unset( $menu[75] ) }; //cheia 75 este pentru unelte ... dar doar pentru non super admini
}

Începând cu WP 3.1, poți folosi și remove_submenu_page
http://codex.wordpress.org/Function_Reference/remove_submenu_page

Dezactivare mesaj "Actualizează acum" pentru non-administratori
Personal, nu sunt un mare fan al utilizării acestui cod. În schimb, prefer să permit clienților să-și actualizeze singuri instalările WordPress. Acest lucru ajută la menținerea site-ului la zi și mă forțează să scriu cod mai bun.
if ( !current_user_can( 'manage_options' ) ) {
add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );
}

Adaugă automat un câmp personalizat ascuns și o valoare asociată unui articol atunci când acesta este publicat
add_action('publish_page', 'add_custom_field_automatically');
add_action('publish_post', 'add_custom_field_automatically');
function add_custom_field_automatically($post_ID) {
global $wpdb;
if(!wp_is_post_revision($post_ID)) {
add_post_meta($post_ID, 'field-name', 'valoare personalizată', true);
}
}

Adăugați o clasă personalizată la link-urile următoare și anterioare
add_filter('next_posts_link_attributes', 'posts_link_attributes');
add_filter('previous_posts_link_attributes', 'posts_link_attributes');
function posts_link_attributes(){
return 'class="styled-button"';
}

Adăugare tipuri personalizate de postări pe pagina de arhivă
function namespace_add_custom_types( $query ) {
if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) ) {
$query->set( 'post_type', array(
'post', 'your-custom-post-type-here' // Înlocuiește cu slug-ul tipului tău de postare personalizată
));
return $query;
}
}
add_filter( 'pre_get_posts', 'namespace_add_custom_types' );
