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.

Activează Funcția Ascunsă de Administrare care Afișează Toate Setările Site-ului
Testat pe: WordPress 3.1 RC3
Acest mic fragment de cod face ceva destul de interesant. Va adăuga o opțiune suplimentară în meniul de setări cu un link către "toate setările" care vă va afișa o listă completă a tuturor setărilor din baza de date legate de site-ul dumneavoastră WordPress. Codul de mai jos va face acest link vizibil doar pentru un utilizator cu rol de administrator și îl va ascunde pentru toți ceilalți utilizatori.
// LINK PERSONALIZAT ÎN MENIUL DE ADMINISTRARE PENTRU TOATE SETĂRILE
function all_settings_link() {
add_options_page(__('Toate Setările'), __('Toate Setările'), 'administrator', 'options.php');
}
add_action('admin_menu', 'all_settings_link');

Fantastic pentru dezvoltare! Folosesc frecvent tabelul de opțiuni pentru a stoca versiunile bazelor de date pentru plugin-urile mele... utilizarea phpMyAdmin pentru a reveni la o versiune veche a bazei de date și a testa un script de actualizare este o corvoadă... acest lucru o va face mult mai ușor!!!

Modificarea Siglei și a Linkului URL pentru Pagina de Autentificare
Testat pe: WordPress 3.0.1
Acest cod vă va permite să modificați cu ușurință sigla paginii de autentificare WordPress, precum și linkul href și textul titlului acestei sigle.
add_filter( 'login_headerurl', 'namespace_login_headerurl' );
/**
* Înlocuiește URL-ul siglei din antetul paginii de autentificare
*
* @param $url
*/
function namespace_login_headerurl( $url ) {
$url = home_url( '/' );
return $url;
}
add_filter( 'login_headertitle', 'namespace_login_headertitle' );
/**
* Înlocuiește titlul siglei din antetul paginii de autentificare
*
* @param $title
*/
function namespace_login_headertitle( $title ) {
$title = get_bloginfo( 'name' );
return $title;
}
add_action( 'login_head', 'namespace_login_style' );
/**
* Înlocuiește sigla din antetul paginii de autentificare
*/
function namespace_login_style() {
echo '<style>.login h1 a { background-image: url( ' . get_template_directory_uri() . '/images/logo.png ) !important; }</style>';
}
EDIT: Dacă doriți să utilizați sigla site-ului pentru a înlocui sigla paginii de autentificare, puteți folosi următorul cod pentru a prelua dinamic această informație (testat pe WP3.5):
function namespace_login_style() {
if( function_exists('get_custom_header') ){
$width = get_custom_header()->width;
$height = get_custom_header()->height;
} else {
$width = HEADER_IMAGE_WIDTH;
$height = HEADER_IMAGE_HEIGHT;
}
echo '<style>'.PHP_EOL;
echo '.login h1 a {'.PHP_EOL;
echo ' background-image: url( '; header_image(); echo ' ) !important; '.PHP_EOL;
echo ' width: '.$width.'px !important;'.PHP_EOL;
echo ' height: '.$height.'px !important;'.PHP_EOL;
echo ' background-size: '.$width.'px '.$height.'px !important;'.PHP_EOL;
echo '}'.PHP_EOL;
echo '</style>'.PHP_EOL;
}

Includere tipuri personalizate de postări în rezultatele căutării.
// FĂ CUSTOM POST TYPES CĂUTABILE
function searchAll( $query ) {
if ( $query->is_search ) { $query->set( 'post_type', array( 'site', 'plugin', 'theme', 'person' )); }
return $query;
}
add_filter( 'the_search_query', 'searchAll' );
Adaugă tipurile personalizate de postări în feed-ul RSS principal al site-ului implicit.
// ADAUGĂ CUSTOM POST TYPES ÎN FEED-UL RSS IMPLICIT
function custom_feed_request( $vars ) {
if (isset($vars['feed']) && !isset($vars['post_type']))
$vars['post_type'] = array( 'post', 'site', 'plugin', 'theme', 'person' );
return $vars;
}
add_filter( 'request', 'custom_feed_request' );
Includere tipuri personalizate de postări în widget-ul "Right Now" din panoul de administrare
Aceasta 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Ă CUSTOM POST TYPES ÎN WIDGET-UL 'RIGHT NOW' DIN DASHBOARD
function wph_right_now_content_table_end() {
$args = array(
'public' => 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 num b b-' . $post_type->name . '">' . $num . '</td>';
echo '<td class="text 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' );

Referitor la ultimul fragment din acest răspuns. Aceasta este o adăugare excelentă, deoarece eu adăugam acestea manual pentru fiecare tip de post. Singura problemă pe care o am cu acest lucru este că adaugă datele după intrările implicite pentru "categorie" și "etichetă". Ai putea actualiza răspunsul tău pentru a muta intrările implicite "categorie" sau "etichetă" mai jos sau pentru a le elimina, astfel încât să poată fi adăugate manual?

@NetConstructor.com Nu cred că înțeleg cererea ta. Dacă o înțeleg, atunci cred că ar fi ceva mai dificil de realizat și chiar acum nu am timp să descopăr cum să fac asta.

Elimină notificarea de actualizare pentru toți utilizatorii, cu excepția ADMIN-ului
Testat pe: WordPress 3.0.1
Acest cod asigură că niciun alt utilizator în afară de "admin" nu va primi notificări de la WordPress când sunt disponibile actualizări.
// ELIMINĂ NOTIFICAREA DE ACTUALIZARE WORDPRESS PENTRU TOȚI UTILIZATORII, CU EXCEPȚIA SYSADMIN
global $user_login;
get_currentuserinfo();
if ($user_login !== "admin") { // Schimbă admin cu numele de utilizator care trebuie să primească actualizările
add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );
}
Versiune modificată pentru a afișa notificări de actualizare doar pentru utilizatorii cu rol de administrator (în loc doar pentru utilizatorul 'admin'):
// ELIMINĂ NOTIFICAREA DE ACTUALIZARE WORDPRESS PENTRU TOȚI UTILIZATORII, CU EXCEPȚIA SYSADMIN
global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) { // Verifică dacă utilizatorul curent are permisiunea de a actualiza plugin-uri
add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );
}

Aceasta este departe de a fi ideal. Va funcționa doar dacă numele de utilizator al administratorului este încă implicit 'admin', ceea ce din motive de securitate nu ar trebui să fie. În schimb, ar trebui să verificați o anumită capabilitate pe care doriți ca utilizatorii să o aibă pentru a vedea mesajele.

Adică if (!current_user_can('manage_options')) {...add_filter...} -- Îmi cer scuze pentru comentariul dublu, am uitat că apăsarea Enter trimite comentariile)

De aceea am adăugat comentariul în cod unde poți schimba numele de utilizator al administratorului. Cum ai îmbunătăți/rescrie codul?

Cea mai bună metodă este să eliminați global $user_login și get_currentuserinfo() și în schimb să folosiți current_user_can în condiția if. Este doar o linie în loc de trei și este metoda standard. Puteți verifica capacitatea specifică necesară pentru a ACȚIONA asupra mesajelor, în acest caz avem 'update_core' și 'update_plugins'.

deci: if (!current_user_can('update_plugins')) {/ELIMINĂ MESAJELE/}

@Jeremy Clarke deci acest cod ar fi atunci modul corect de a face lucrurile? Dar, dacă ai vrut doar să permiți unui nume de utilizator specific să primească notificările, codul de mai sus ar fi cea mai bună metodă?
if (!current_user_can('update_plugins')) { add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 ); add_filter( 'pre_option_update_core', create_function( '$a', "return null;" )); }

Dacă ai vrut să verifici un nume de utilizator specific, presupun că codul din răspunsul tău original este acceptabil, deși ar putea exista o metodă puțin mai eficientă. Codul complet folosind soluția mea ar arăta ca ceea ce ai în ultimul tău comentariu. Este același lucru ca răspunsul tău, dar cu verificarea current_user_can() în loc de $user_login !== 'admin'.

Am editat răspunsul și am adăugat versiunea care folosește current_user_can('update_plugins')

Tocmai am încercat codurile. Dar primesc o pagină de eroare când folosesc codurile. Aceeași problemă cu ambele coduri

Încărcarea jQuery de pe Google CDN
Testat pe: WordPress 3.0.1
// O includere și mai inteligentă a jQuery :)
add_action( 'init', 'jquery_register' );
// Înregistrare de la Google și pentru footer
function jquery_register() {
if ( !is_admin() ) {
wp_deregister_script( 'jquery' );
wp_register_script( 'jquery', ( 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js' ), false, null, true );
wp_enqueue_script( 'jquery' );
}
}
Eliminarea informațiilor despre versiunea WordPress pentru securitate
Testat pe: WordPress 3.0.1
// Elimină informațiile despre versiune din head și feed-uri
function complete_version_removal() {
return '';
}
add_filter('the_generator', 'complete_version_removal');
Adăugarea linkurilor Spam & Ștergere pentru comentarii pe front-end
Testat pe: WordPress 3.0.1
Acest lucru face mult mai ușoară gestionarea comentariilor din front-end prin adăugarea linkurilor de spam și ștergere.**
// Linkuri spam și ștergere pentru toate versiunile de WordPress
function delete_comment_link($id) {
if (current_user_can('edit_post')) {
echo '| <a href="'.get_bloginfo('wpurl').'/wp-admin/comment.php?action=cdc&c='.$id.'">șterge</a> ';
echo '| <a href="'.get_bloginfo('wpurl').'/wp-admin/comment.php?action=cdc&dt=spam&c='.$id.'">spam</a>';
}
}
Întârzierea publicării în fluxul RSS
Testat pe: WordPress 3.0.1
În final, îmi place să întârzii publicarea în fluxurile mele RSS cu 10-15 minute pentru că întotdeauna găsesc cel puțin câteva erori în textul meu. Alte utilizări sunt în cazul în care doriți ca conținutul să fie exclusiv pe site-ul dumneavoastră pentru o zi sau o săptămână înainte de a-l distribui cititorilor prin RSS.
// Întârziere actualizare flux
function publish_later_on_feed($where) {
global $wpdb;
if (is_feed()) {
// Timestamp în format WordPress
$now = gmdate('Y-m-d H:i:s');
// Valoare pentru așteptare; + unitate
$wait = '10'; // întreg
// http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_timestampdiff
$device = 'MINUTE'; // MINUTE, ORA, ZI, SĂPTĂMÂNĂ, LUNA, AN
// Adăugare sintaxă SQL la $where implicit
$where .= " AND TIMESTAMPDIFF($device, $wpdb->posts.post_date_gmt, '$now') > $wait ";
}
return $where;
}
add_filter('posts_where', 'publish_later_on_feed');

sursa pe postarea mea: http://wpengineer.com/320/publish-the-feed-later/ cu mai multe informații

De asemenea, poți pur și simplu să elimini filtrul generator: remove_action('wp_head', 'wp_generator');

@Derek Perkins - Poți face fiecare dintre aceste fragmente de cod un răspuns separat, astfel încât să poată fi votate individual?

http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js expiră după doar o oră. Întotdeauna folosește versiunea completă, precum http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js – aceasta expiră după un an.

Poți, te rog, să separi fiecare dintre aceste intrări wiki în articole separate în următoarele săptămâni? Voiam să o fac eu, dar nu am vrut să par că încerc să îmi atribui puncte pentru informațiile pe care le-ai împărtășit.

Codul "Elimină informațiile despre versiunea WordPress pentru securitate" nu face de fapt nimic pentru a crește securitatea site-ului tău. Nici măcar nu oprește expunerea versiunii de WP utilizată pe site.

Nu este adevărat Joseph, dacă versiunea ta de WordPress este expusă, oamenii pot vedea dacă rulezi o versiune mai veche, expunându-ți astfel vulnerabilitățile. Este întotdeauna o decizie bună să elimini acest lucru din toate instalările WordPress. Personal, nici nu înțeleg de ce au pus-o acolo în primul rând, deoarece ESTE o problemă de securitate.

Setează un număr maxim de revizii pentru articole pentru a evita umflarea bazei de date.
Testat pe: WordPress 3.0.1
Implicit, numărul este nelimitat, iar acest cod va seta memorarea doar a ultimelor cinci modificări:
/**
* Setează reviziile articolelor, cu excepția cazului în care constanta a fost deja setată în wp-config.php
*/
if (!defined('WP_POST_REVISIONS')) define('WP_POST_REVISIONS', 5);
Pentru informații suplimentare, există o mulțime de idei bune pentru CONSTANTE care pot fi setate pe pagina Codex Editarea wp-config.php.

Analizând utilizarea sa în wp_save_post_revision(), nu pare să existe o modalitate de a face distincția în funcție de tipurile de postări. Nu există niciun filtru sau altceva pe valoare, deși probabil ar trebui să existe.

mulțumesc Jeremy - Pentru oricine altcineva, dacă știți cum să faceți acest lucru, vă rog să postați aici.

Instrumente de profilare WordPress
Îmi place să adaug instrumente de profilare într-un fișier separat, pe care apoi îl includ din functions.php când este nevoie:
<?php
if ( !defined('SAVEQUERIES') && isset($_GET['debug']) && $_GET['debug'] == 'sql' )
define('SAVEQUERIES', true);
if ( !function_exists('dump') ) :
/**
* dump()
*
* @param mixed $in
* @return mixed $in
*/
function dump($in = null) {
echo '<pre style="margin-left: 0px; margin-right: 0px; padding: 10px; border: solid 1px black; background-color: ghostwhite; color: black; text-align: left;">';
foreach ( func_get_args() as $var ) {
echo "\n";
if ( is_string($var) ) {
echo "$var\n";
} else {
var_dump($var);
}
}
echo '</pre>' . "\n";
return $in;
} # dump()
endif;
/**
* add_stop()
*
* @param mixed $in
* @param string $where
* @return mixed $in
*/
function add_stop($in = null, $where = null) {
global $sem_stops;
global $wp_object_cache;
$queries = get_num_queries();
$milliseconds = timer_stop() * 1000;
$out = "$queries interogări - {$milliseconds}ms";
if ( function_exists('memory_get_usage') ) {
$memory = number_format(memory_get_usage() / ( 1024 * 1024 ), 1);
$out .= " - {$memory}MB";
}
$out .= " - $wp_object_cache->cache_hits accesări cache / " . ( $wp_object_cache->cache_hits + $wp_object_cache->cache_misses );
if ( $where ) {
$sem_stops[$where] = $out;
} else {
dump($out);
}
return $in;
} # add_stop()
/**
* dump_stops()
*
* @param mixed $in
* @return mixed $in
*/
function dump_stops($in = null) {
if ( $_POST )
return $in;
global $sem_stops;
global $wp_object_cache;
$stops = '';
foreach ( $sem_stops as $where => $stop )
$stops .= "$where: $stop\n";
dump("\n" . trim($stops) . "\n");
if ( defined('SAVEQUERIES') && $_GET['debug'] == 'sql' ) {
global $wpdb;
foreach ( $wpdb->queries as $key => $data ) {
$query = rtrim($data[0]);
$duration = number_format($data[1] * 1000, 1) . 'ms';
$loc = trim($data[2]);
$loc = preg_replace("/(require|include)(_once)?,\s*/ix", '', $loc);
$loc = "\n" . preg_replace("/,\s*/", ",\n", $loc) . "\n";
dump($query, $duration, $loc);
}
}
if ( $_GET['debug'] == 'cache' )
dump($wp_object_cache->cache);
if ( $_GET['debug'] == 'cron' ) {
$crons = get_option('cron');
foreach ( $crons as $time => $_crons ) {
if ( !is_array($_crons) )
continue;
foreach ( $_crons as $event => $_cron ) {
foreach ( $_cron as $details ) {
$date = date('Y-m-d H:m:i', $time);
$schedule = isset($details['schedule']) ? "({$details['schedule']})" : '';
if ( $details['args'] )
dump("$date: $event $schedule", $details['args']);
else
dump("$date: $event $schedule");
}
}
}
}
return $in;
} # dump_stops()
add_action('init', create_function('$in', '
return add_stop($in, "Încărcare");
'), 10000000);
add_action('template_redirect', create_function('$in', '
return add_stop($in, "Interogare");
'), -10000000);
add_action('wp_footer', create_function('$in', '
return add_stop($in, "Afișare");
'), 10000000);
add_action('admin_footer', create_function('$in', '
return add_stop($in, "Afișare");
'), 10000000);
/**
* init_dump()
*
* @return void
*/
function init_dump() {
global $hook_suffix;
if ( !is_admin() || empty($hook_suffix) ) {
add_action('wp_footer', 'dump_stops', 10000000);
add_action('admin_footer', 'dump_stops', 10000000);
} else {
add_action('wp_footer', 'dump_stops', 10000000);
add_action("admin_footer-$hook_suffix", 'dump_stops', 10000000);
}
} # init_dump()
add_action('wp_print_scripts', 'init_dump');
/**
* dump_phpinfo()
*
* @return void
*/
function dump_phpinfo() {
if ( isset($_GET['debug']) && $_GET['debug'] == 'phpinfo' ) {
phpinfo();
die;
}
} # dump_phpinfo()
add_action('init', 'dump_phpinfo');
/**
* dump_http()
*
* @param array $args
* @param string $url
* @return array $args
*/
function dump_http($args, $url) {
dump(preg_replace("|/[0-9a-f]{32}/?$|", '', $url));
return $args;
} # dump_http()
/**
* dump_trace()
*
* @return void
*/
function dump_trace() {
$backtrace = debug_backtrace();
foreach ( $backtrace as $trace )
dump(
'Fișier/Line: ' . $trace['file'] . ', ' . $trace['line'],
'Funcție / Clasă: ' . $trace['function'] . ', ' . $trace['class']
);
} # dump_trace()
if ( $_GET['debug'] == 'http' )
add_filter('http_request_args', 'dump_http', 0, 2);
?>

există o modalitate rapidă de a modifica acest lucru astfel încât scriptul să fie apelat doar când ești administrator și să adaugi ceva la URL pentru a afișa informațiile de depanare?

Așa se face în tema mea: http://www.semiologic.com/software/sem-reloaded/ -- fișierul /inc/debug.php este inclus de /functions.php sau /inc/init.php (nu-mi amintesc exact acum).

Mărește Claritatea Imaginilor Redimensionate (doar JPEG)
Această funcție mărește claritatea imaginilor JPEG redimensionate. Iată un exemplu al diferenței:
function ajx_sharpen_resized_files( $resized_file ) {
$image = wp_load_image( $resized_file );
if ( !is_resource( $image ) )
return new WP_Error( 'error_loading_image', $image, $file );
$size = @getimagesize( $resized_file );
if ( !$size )
return new WP_Error('invalid_image', __('Nu s-a putut citi dimensiunea imaginii'), $file);
list($orig_w, $orig_h, $orig_type) = $size;
switch ( $orig_type ) {
case IMAGETYPE_JPEG:
$matrix = array(
array(-1, -1, -1),
array(-1, 16, -1),
array(-1, -1, -1),
);
$divisor = array_sum(array_map('array_sum', $matrix));
$offset = 0;
imageconvolution($image, $matrix, $divisor, $offset);
imagejpeg($image, $resized_file,apply_filters( 'jpeg_quality', 90, 'edit_image' ));
break;
case IMAGETYPE_PNG:
return $resized_file;
case IMAGETYPE_GIF:
return $resized_file;
}
return $resized_file;
}
add_filter('image_make_intermediate_size', 'ajx_sharpen_resized_files', 900);

dacă vreți asta ca plugin: http://wordpress.org/extend/plugins/sharpen-resized-images/

Eliminarea Casutelor Meta Implicite din WordPress
Testat pe: WordPress 3.0.1
Acest cod vă va permite să eliminați casutele Meta specifice pe care WordPress le adaugă implicit în ecranele implicite de Adăugare/Editare Articol și Adăugare/Editare Pagină.
// ELIMINARE CASUTE META DIN ECRANUL IMPLICIT DE ARTICOLE
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 Trackbacks
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');
// ELIMINARE CASUTE META DIN ECRANUL IMPLICIT DE PAGINI
function remove_default_page_screen_metaboxes() {
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( 'trackbacksdiv','page','normal' ); // Caseta Meta Trackbacks
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');

Conform acestui http://wordpress.stackexchange.com/questions/34030/cant-change-permalink-url-after-hitting-ok-and-update/37779#37779 nu aș ascunde slugdiv în acest fel, ci aș folosi mai degrabă acest https://gist.github.com/1863830

Filtru pentru eliminarea corectării "Wordpress" în "WordPress"
Testat pe: WordPress 3.0.1
Începând cu versiunea 3.0 a WordPress, a fost adăugat un filtru care convertește automat toate aparițiile cuvântului "Wordpress" (fără P majuscul) în "WordPress" (cu P majuscul) în conținutul articolelor, titlurile postărilor și textul comentariilor. Unii utilizatori consideră acest filtru prea intrusiv, iar eu personal am nevoie uneori să folosesc varianta incorectă "Wordpress" și am găsit acest filtru destul de enervant.
// Elimină filtrul enervant pentru corectarea literei P
if(function_exists('capital_P_dangit')) {
foreach ( array( 'the_content', 'the_title' ) as $filter )
remove_filter( $filter, 'capital_P_dangit', 11 );
remove_filter('comment_text', 'capital_P_dangit', 31 );
}

o mică descoperire excelentă. Unul dintre acele lucruri care elimină pur și simplu o altă bucată de cod care nu este necesară

În WordPress 3.0.1, acest filtru este adăugat cu prioritatea 11, deci trebuie să adaugi 11
ca al treilea parametru pentru a-l elimina.

Personalizează Panoul de Control
add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');
function my_custom_dashboard_widgets() {
global $wp_meta_boxes;
Elimină aceste widget-uri din panoul de control...
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']);
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']);
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']);
Adaugă un widget personalizat numit 'Ajutor și Suport'
wp_add_dashboard_widget('custom_help_widget', 'Ajutor și Suport', 'custom_dashboard_help');
}
Acesta este conținutul pentru widget-ul tău personalizat
function custom_dashboard_help() {
echo '<p>Lorum ipsum delor sit amet et nunc</p>';
}

Adăugare Câmpuri Personalizate în Profilul Utilizatorului
Introdu codul de mai jos în fișierul functions.php pentru a adăuga câmpuri personalizate în profilul utilizatorului. Editează sau adaugă linii după cum consideri necesar.
Nu uita să nu elimini linia: return $contactmethods; altfel funcționalitatea nu va fi activă.
// CÂMPURI PERSONALIZATE PENTRU UTILIZATOR
function my_custom_userfields( $contactmethods ) {
// ADAUGĂ CÂMPURI DE CONTACT PERSONALIZATE
$contactmethods['contact_phone_office'] = 'Telefon Birou';
$contactmethods['contact_phone_mobile'] = 'Telefon Mobil';
$contactmethods['contact_office_fax'] = 'Fax Birou';
// ADAUGĂ CÂMPURI DE ADRESĂ PERSONALIZATE
$contactmethods['address_line_1'] = 'Adresă Linia 1';
$contactmethods['address_line_2'] = 'Adresă Linia 2 (opțional)';
$contactmethods['address_city'] = 'Oraș';
$contactmethods['address_state'] = 'Județ';
$contactmethods['address_zipcode'] = 'Cod Poștal';
return $contactmethods;
}
add_filter('user_contactmethods','my_custom_userfields',10,1);
Pentru a afișa câmpurile personalizate poți folosi una din cele două metode prezentate mai jos.
Opțiunea 1:
the_author_meta('facebook', $current_author->ID)
Opțiunea 2:
<?php $current_author = get_userdata(get_query_var('author')); ?>
<p><a href="<?php echo esc_url($current_author->contact_phone_office);?>" title="telefon_birou"> Telefon Birou</a></p>

Personalizează ordinea meniului de administrare
Testat pe: WordPress 3.0.1
Acest cod vă va permite să reordonați elementele din meniul de administrare. Tot ce trebuie să faceți este să dați click pe un link existent în meniul de administrare și să copiați tot ce este înainte de URL-ul /wp-admin/. Ordinea de mai jos reprezintă ordinea pe care o va avea noul meniu de administrare.
// PERSONALIZEAZĂ ORDINEA MENIULUI DE ADMINISTRARE
function custom_menu_order($menu_ord) {
if (!$menu_ord)
return true;
return array(
'index.php', // Acesta reprezintă link-ul către panoul de control
'edit.php?post_type=events', // Acesta este un meniu de tip post personalizat
'edit.php?post_type=news',
'edit.php?post_type=articles',
'edit.php?post_type=faqs',
'edit.php?post_type=mentors',
'edit.php?post_type=testimonials',
'edit.php?post_type=services',
'edit.php?post_type=page', // Acesta este meniul implicit pentru pagini
'edit.php', // Acesta este meniul implicit pentru POST-uri în administrare
);
}
add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

Există într-adevăr un filtru de bază numit custom_menu_order
? Nu am reușit să-l găsesc...

@kaiser documentat aici http://codex.wordpress.org/Plugin_API/Filter_Reference/custom_menu_order

Funcție pentru modificarea lungimii Excerpt
Testat pe: WordPress 3.0.1
În mod implicit, toate fragmentele de text sunt limitate la 55 de cuvinte. Utilizând codul de mai jos, puteți suprascrie această setare implicită:
function new_excerpt_length($length) {
return 100;
}
add_filter('excerpt_length', 'new_excerpt_length');
Acest exemplu schimbă lungimea fragmentului la 100 de cuvinte, dar puteți folosi aceeași metodă pentru a o modifica la orice valoare.

@user402... această limită se aplică la cuvinte sau la caractere? Ai putea posta cum se face pentru ambele variante?

@NetConstructor.com Această funcție (și hook-ul excerpt_length
) limitează după cuvinte.

Adăugare Miniaturi în Lista de Articole/Pagini Administrate
Puteți adăuga acest cod în funcțiile dumneavoastră pentru a afișa în lista de administrare/editare a articolelor și paginilor o coloană nouă cu previzualizarea miniaturii.
/****** Adăugare Miniaturi în Lista de Articole/Pagini Administrate ******/
if ( !function_exists('AddThumbColumn') && function_exists('add_theme_support') ) {
// pentru articole și pagini
add_theme_support('post-thumbnails', array( 'post', 'page' ) );
function AddThumbColumn($cols) {
$cols['thumbnail'] = __('Miniatură');
return $cols;
}
function AddThumbValue($column_name, $post_id) {
$width = (int) 35;
$height = (int) 35;
if ( 'thumbnail' == $column_name ) {
// miniatura din WP 2.9
$thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true );
// imagine din galerie
$attachments = get_children( array('post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image') );
if ($thumbnail_id)
$thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true );
elseif ($attachments) {
foreach ( $attachments as $attachment_id => $attachment ) {
$thumb = wp_get_attachment_image( $attachment_id, array($width, $height), true );
}
}
if ( isset($thumb) && $thumb ) {
echo $thumb;
} else {
echo __('Niciuna');
}
}
}
// pentru articole
add_filter( 'manage_posts_columns', 'AddThumbColumn' );
add_action( 'manage_posts_custom_column', 'AddThumbValue', 10, 2 );
// pentru pagini
add_filter( 'manage_pages_columns', 'AddThumbColumn' );
add_action( 'manage_pages_custom_column', 'AddThumbValue', 10, 2 );
}

Elimină ping-urile către propriul blog
Testat pe: WordPress 3.0.1
// Elimină ping-urile către sine
function no_self_ping( &$links ) {
$home = get_option( 'home' );
foreach ( $links as $l => $link )
if ( 0 === strpos( $link, $home ) )
unset($links[$l]);
}
add_action( 'pre_ping', 'no_self_ping' );

De fapt, am această problemă destul de des. Dacă fac o referință internă către un alt articol pe blogul meu WP, primesc un trackback sau pingback (nu mai țin minte care) de la mine însumi. Este enervant.

Activează compresia GZIP pentru output
În mod normal serverul ar trebui să fie configurat să facă acest lucru automat, dar multe hosturi partajate nu fac asta (probabil pentru a crește utilizarea lățimii de bandă a clienților).
if(extension_loaded("zlib") && (ini_get("output_handler") != "ob_gzhandler"))
add_action('wp', create_function('', '@ob_end_clean();@ini_set("zlib.output_compression", 1);'));

Afișează Interogări la Bază de Date, Timp Petrecut și Consum de Memorie
Testat pe: WordPress 3.0.1
function performance( $visible = false ) {
$stat = sprintf( '%d interogări în %.3f secunde, folosind %.2fMB memorie',
get_num_queries(),
timer_stop( 0, 3 ),
memory_get_peak_usage() / 1024 / 1024
);
echo $visible ? $stat : "<!-- {$stat} -->" ;
}
Apoi, acest cod de mai jos va insera automat codul de mai sus în subsolul site-ului tău public (asigură-te că tema ta apelează wp_footer
):
add_action( 'wp_footer', 'performance', 20 );
Poate fi apelat de mai multe ori.

Extrage automat prima imagine din conținutul articolului
Testat pe: WordPress 3.0.1
Acest cod va extrage automat prima imagine asociată unui articol și îți va permite să o afișezi/folosești prin apelarea funcției getImage.
// EXTRAGE AUTOMAT PRIMA IMAGINE DIN ARTICOL
function getImage($num) {
global $more;
$more = 1;
$link = get_permalink();
$content = get_the_content();
$count = substr_count($content, '<img');
$start = 0;
for($i=1;$i<=$count;$i++) {
$imgBeg = strpos($content, '<img', $start);
$post = substr($content, $imgBeg);
$imgEnd = strpos($post, '>');
$postOutput = substr($post, 0, $imgEnd+1);
$postOutput = preg_replace('/width="([0-9]*)" height="([0-9]*)"/', '',$postOutput);;
$image[$i] = $postOutput;
$start=$imgEnd+1;
}
if(stristr($image[$num],'<img')) {
echo '<a href="'.$link.'">'.$image[$num]."</a>";
}
$more = 0;
}

Frumos, dar get_the_image face și el o treabă foarte bună cu asta. http://wordpress.org/extend/plugins/get-the-image/

corect, dar acesta funcționează diferit și rezolvă diverse probleme pe care get_the_image nu le ia în considerare

@matt -- În WordPress există diferite moduri de a adăuga imagini în articole și cred că scriptul get_the_image verifică doar unul dintre acestea. Acest script verifică mai întâi dacă există o imagine reprezentativă și o folosește pe aceea dacă este disponibilă, apoi cred că verifică prima imagine adăugată în conținutul articolului și dacă nu este găsită, caută în galeria media imaginea cu cel mai mare ordin de sortare (cel puțin așa îmi amintesc ordinea).

sugerez http://wordpress.org/extend/plugins/auto-post-thumbnail/ Generează automat imaginea reprezentativă (Featured Thumbnail) din prima imagine din articol sau din orice tip de postare personalizată, doar dacă imaginea reprezentativă nu este setată

Dezregistrează Widget-urile Implicate în WordPress
Testat pe: WordPress 3.0.1
// Dezregistrează toate widget-urile implicite din WordPress
function unregister_default_wp_widgets() {
unregister_widget('WP_Widget_Pages');
unregister_widget('WP_Widget_Calendar');
unregister_widget('WP_Widget_Archives');
unregister_widget('WP_Widget_Links');
unregister_widget('WP_Widget_Meta');
unregister_widget('WP_Widget_Search');
unregister_widget('WP_Widget_Text');
unregister_widget('WP_Widget_Categories');
unregister_widget('WP_Widget_Recent_Posts');
unregister_widget('WP_Widget_Recent_Comments');
unregister_widget('WP_Widget_RSS');
unregister_widget('WP_Widget_Tag_Cloud');
}
add_action('widgets_init', 'unregister_default_wp_widgets', 1);

Afișează fișierul template folosit de un post/pagină în header
add_action('wp_head', 'show_template');
function show_template() {
global $template;
print_r($template);
}
Redu ieșirea implicită a DIV-ului dacă tema ta folosește post_class.
Dacă tema ta folosește ceva de genul:
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
Poți avea DIV-uri extrem de lungi în sursă care ar putea arăta astfel sau chiar mai lung:
<div id="post-4" class="post-4 post type-post hentry category-uncategorized category-test category-test-1-billion category-test2 category-test3 category-testing">
Aceasta poate îngrămădi sursa și pare inutil în majoritatea cazurilor, 3-4 niveluri sunt suficiente.
Pentru exemplul de mai sus putem limita ieșirea astfel:
// Limitează ieșirile lungi ale DIV-urilor
function category_id_class($classes) {
global $post;
foreach((get_the_category($post->ID)) as $category)
$classes[] = $category->category_nicename;
return array_slice($classes, 0,5);
}
add_filter('post_class', 'category_id_class');
Aceasta limitează ieșirea la doar primele 5 valori, deci exemplul de mai sus devine:
<div id="post-4" class="post-4 post type-post hentry category-uncategorized">
Fă ca arhivele de categorii să afișeze toate postările, indiferent de tipul postării: util pentru postări personalizate
function any_ptype_on_cat($request) {
if ( isset($request['category_name']) )
$request['post_type'] = 'any';
return $request;
}
add_filter('request', 'any_ptype_on_cat');
Elimină elemente nedorite din panoul de control
Acest lucru a fost deja postat, dar nu avea lista completă de elemente. În special acele enervante "legături primite!"
add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');
function my_custom_dashboard_widgets() {
global $wp_meta_boxes;
// Right Now - Comentarii, Postări, Pagini la o privire
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']);
// Comentarii recente
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']);
// Legături primite
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']);
// Pluginuri - Populare, Noi și Actualizate recent
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']);
// Blogul de dezvoltare WordPress
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']);
// Alte știri WordPress
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']);
// Formular rapid de postare
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']);
// Ciorne recente
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']);
}
Elimină saltul "Citește mai mult"**
În schimb, revino la începutul paginii. Știi cum atunci când apeși "citește mai mult" sare la locul din pagină, ceea ce poate fi enervant, acest cod face ca pagina să se încarce normal, fără sărituri!
function remove_more_jump_link($link) {
$offset = strpos($link, '#more-');
if ($offset) {
$end = strpos($link, '"', $offset);
}
if ($end) {
$link = substr_replace($link, '', $offset, $end-$offset);
}
return $link;
}
add_filter('the_content_more_link', 'remove_more_jump_link');
Restricționează elementele din meniul ADMIN pe baza numelui de utilizator, înlocuiește username cu numele real al unui utilizator.
function remove_menus()
{
global $menu;
global $current_user;
get_currentuserinfo();
if($current_user->user_login == 'username')
{
$restricted = array(__('Postări'),
__('Media'),
__('Legături'),
__('Pagini'),
__('Comentarii'),
__('Aspect'),
__('Pluginuri'),
__('Utilizatori'),
__('Unelte'),
__('Setări')
);
end ($menu);
while (prev($menu)) {
$value = explode(' ',$menu[key($menu)][0]);
if(in_array($value[0] != NULL ? $value[0] : "" , $restricted)) {
unset($menu[key($menu)]);
}
} // end while
} // end if
}
add_action('admin_menu', 'remove_menus');
//alternativ, poți folosi if($current_user->user_login != 'admin'), probabil mai util
Stilizează norul de etichete
// Personalizare nor de etichete
add_filter('widget_tag_cloud_args', 'style_tags');
function style_tags($args) {
$args = array(
'largest' => '10',
'smallest' => '10',
'format' => 'list',
);
return $args;
}
O referință completă a opțiunilor este aici (sunt multe!) http://codex.wordpress.org/Function_Reference/wp_tag_cloud
Schimbă intervalul implicit de actualizare pentru Widget-ul RSS
(Implicit este 6 sau 12 ore - nu mai țin minte (1800 = 30 minute).
add_filter( 'wp_feed_cache_transient_lifetime', create_function('$fixrss', 'return 1800;') );

poți, te rog, să separi fiecare dintre acestea în răspunsuri separate în următoarele săptămâni. Voiam să o fac eu, dar nu am vrut să par că îmi atribui meritul pentru răspunsurile tale. În orice caz - încerc să păstrez asta organizat, astfel încât utilizatorii să poată găsi cu ușurință informațiile pe care le caută. Mulțumesc anticipat

tocmai foloseam codul "Restrict ADMIN menu items based on username, replace username with an actual user's name" care este grozav, dar poți actualiza codul pentru a arăta și cum se poate face acest lucru pentru un "rol de utilizator" specific. Cred că ar fi foarte util!

Îmi pare rău NetConstructor, tocmai am văzut acum comentariul tău. Pentru rolul de utilizator, aș folosi "current_user_can". Nu am timp acum să testez, dar când voi avea, îl voi adăuga.

Elimină notificarea de actualizare DOAR pentru plugin-uri INACTIVE
function update_active_plugins($value = '') {
/*
Tabloul $value transmis conține lista de plugin-uri cu marcajele de timp
când ultima dată grupurile au fost verificate pentru potrivirea versiunii
Nodul $value->response conține un tablou cu elementele care sunt
depășite. Acest nod response este folosit de meniul 'Plugin-uri'
de exemplu pentru a indica că există actualizări. De asemenea, în lista
actuală de plugin-uri pentru a afișa caseta galbenă sub un anumit plugin
care indică faptul că este necesară o acțiune din partea utilizatorului.
*/
if ((isset($value->response)) && (count($value->response))) {
// Obține lista plugin-urilor active curente
$active_plugins = get_option('active_plugins');
if ($active_plugins) {
// Aici începem să comparăm elementele din $value->response
// verificând fiecare în raport cu lista de plugin-uri active.
foreach($value->response as $plugin_idx => $plugin_item) {
// Dacă elementul din response nu este un plugin activ, îl eliminăm.
// Acest lucru va împiedica WordPress să indice că plugin-ul necesită acțiuni de actualizare.
if (!in_array($plugin_idx, $active_plugins))
unset($value->response[$plugin_idx]);
}
}
else {
// Dacă nu există plugin-uri active, ignorăm cele inactive care sunt depășite.
foreach($value->response as $plugin_idx => $plugin_item) {
unset($value->response);
}
}
}
return $value;
}
add_filter('transient_update_plugins', 'update_active_plugins'); // Hook pentru 2.8.+
//add_filter( 'option_update_plugins', 'update_active_plugins'); // Hook pentru 2.7.x

Elimină informațiile și HTML-ul inutile din tag-ul <head>
// elimină informațiile inutile din header
add_action( 'init', 'remove_header_info' );
function remove_header_info() {
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'wp_generator' );
remove_action( 'wp_head', 'start_post_rel_link' );
remove_action( 'wp_head', 'index_rel_link' );
remove_action( 'wp_head', 'adjacent_posts_rel_link' ); // pentru WordPress < 3.0
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' ); // pentru WordPress >= 3.0
}
// elimină CSS-ul adițional injectat de widget-ul 'Comentarii Recente'
add_action( 'widgets_init', 'remove_recent_comments_style' );
function remove_recent_comments_style() {
global $wp_widget_factory;
remove_action( 'wp_head', array(
$wp_widget_factory->widgets['WP_Widget_Recent_Comments'],
'recent_comments_style'
) );
}

Activarea Depanării și Înregistrării Erorilor pentru Utilizare pe Site-uri Live
Acesta este un fragment de cod pe care l-am scris pentru a utiliza constantele WP_DEBUG care sunt de obicei dezactivate implicit. Am creat o metodă de a nu numai activa WP_DEBUG pentru a-l putea folosi pe un site live fără efecte negative, dar am și utilizat alte constante de depanare pentru a forța afișarea erorilor și pentru a crea un fișier de log al erorilor și Notificărilor în directorul /wp-content.
Introdu acest cod în fișierul wp-config.php (DUPA CE AI SALVAT O COPIE DE SIGURANȚĂ, CA PRECAUȚIE) și apoi poți adăuga parametrii ?debug=1, 2 sau 3 la sfârșitul oricărei URL pe site-ul tău.
?debug=1 = afișează toate erorile/notificările ?debug=2 = forțează afișarea lor ?debug=3 = creează un fișier debug.log cu toate erorile în directorul /wp-content.
/**
* Scris de Jared Williams - http://new2wp.com
* @wp-config.php înlocuiește constanta WP_DEBUG cu acest cod
* Activează depanarea WP pentru utilizare pe un site live
* http://core.trac.wordpress.org/browser/trunk/wp-includes/load.php#L230
* Adaugă parametrul '?debug=#' la sfârșitul oricărei URL pe site
*
* http://exemplu.com/?debug=1, /?debug=2, /?debug=3
*/
if ( isset($_GET['debug']) && $_GET['debug'] == '1' ) {
// Activează raportarea notificărilor în timpul dezvoltării - E_ALL
define('WP_DEBUG', true);
} elseif ( isset($_GET['debug']) && $_GET['debug'] == '2' ) {
// Trebuie să fie true pentru ca WP_DEBUG_DISPLAY să funcționeze
define('WP_DEBUG', true);
// Forțează afișarea erorilor
define('WP_DEBUG_DISPLAY', true);
} elseif ( isset($_GET['debug']) && $_GET['debug'] == '3' ) {
// Trebuie să fie true pentru ca WP_DEBUG_LOG să funcționeze
define('WP_DEBUG', true);
// Înregistrează erorile în debug.log în directorul wp-content
define('WP_DEBUG_LOG', true);
}
Intru în mai multe detalii în postarea pe care am scris-o ca oaspete pentru Comluv dacă ești interesat, aici: http://comluv.com/dev/enable-debugging-and-logging-for-live-site-usage/
Încă lucrez la o metodă de a face acest lucru fie protejat prin parolă, sau preferabil, să funcționeze doar dacă (current_user_can('manage_themes') și is_logged_in().
Dar acolo devine mult mai complicat.

Adăugare Automată a Titlurilor Dinamice pe Paginile Publice
Testat pe: WordPress 3.0.1
Utilizând codul de mai jos, veți crea automat titluri dinamice pentru paginile/articolele afișate public.
/* Titluri Dinamice **/
// Acest cod setează <title> în funcție de pagina vizitată, pentru un format mai bun și pentru SEO
// Trebuie să setați variabila $longd cu un text personalizat la începutul funcției
function dynamictitles() {
$longd = __('Introduceți descrierea lungă aici.', 'texdomainstring');
if ( is_single() ) {
wp_title('');
echo ' | '.get_bloginfo('name');
} else if ( is_page() || is_paged() ) {
bloginfo('name');
wp_title('|');
} else if ( is_author() ) {
bloginfo('name');
wp_title(' | '.__('Autor', 'texdomainstring'));
} else if ( is_category() ) {
bloginfo('name');
wp_title(' | '.__('Arhivă pentru', 'texdomainstring'));
} else if ( is_tag() ) {
echo get_bloginfo('name').' | '.__('Arhivă etichetă pentru', 'texdomainstring');
wp_title('');
} else if ( is_archive() ) {
echo get_bloginfo('name').' | '.__('Arhivă pentru', 'texdomainstring');
wp_title('');
} else if ( is_search() ) {
echo get_bloginfo('name').' | '.__('Rezultate Căutare', 'texdomainstring');
} else if ( is_404() ) {
echo get_bloginfo('name').' | '.__('Eroare 404 (Pagina nu a fost găsită)', 'texdomainstring');
} else if ( is_home() ) {
echo get_bloginfo('name').' | '.get_bloginfo('description');
} else {
echo get_bloginfo('name').' | '.($blog_longd);
}
}

Noi Roluri și Capabilități - Rulează o singură dată!
Le țin la îndemână, acesta este modul corect de a le face fără un plugin. Acestea setează un singur câmp (prefix_user_roles) în baza de date de opțiuni și nu ai nevoie de un plugin pentru a le seta. Consultă pagina Codex pentru o listă cu capabilitățile disponibile și descrieri despre ce fac. Trebuie doar să decomentezi unul dintre aceste blocuri, să încarci orice pagină și apoi să le comentezi din nou! Aici creez un rol care are capabilitățile de care am nevoie:
/* Capabilități */
// Pentru a adăuga noul rol, folosind 'international' ca nume scurt și
// 'International Blogger' ca nume afișat în lista de Utilizatori și pagina de editare:
/*
add_role('international', 'International Blogger', array(
'read' => true, // True permite acea capabilitate, False o elimină în mod specific.
'edit_posts' => true,
'delete_posts' => true,
'edit_published_posts' => true,
'publish_posts' => true,
'edit_files' => true,
'import' => true,
'upload_files' => true //ultimul din array nu are nevoie de virgulă!
));
*/
// Pentru a elimina un rol complet sau unul dintre cele implicite:
/*
remove_role('international');
*/
Uneori este util să adaugi/elimini dintr-un rol existent în loc să îl elimini și să îl adaugi din nou. Din nou, trebuie doar să îl decomentezi, să reîncarci o pagină și apoi să îl comentezi din nou. Acest lucru va stoca rolul/capabilitatea corect în tabelul de opțiuni. (Acest lucru îți permite, dezvoltatorului, să le controlezi și elimină overhead-ul plugin-urilor voluminoase care fac același lucru.) Aici modific rolul de autor pentru a-și șterge postările publicate (implicit), dar le permit capabilitatea de a-și edita postările publicate (ceea ce nu este posibil pentru acest rol implicit) -- folosind *add_cap* sau *remove_cap*.
/*
$edit_role = get_role('author');
$edit_role->add_cap('edit_published_posts');
$edit_role->remove_cap('delete_published_posts');
*/
Țin un fișier Excel cu grila de pe pagina Codex pentru site-urile care modifică în acest fel, astfel încât să-mi amintesc cum sunt setate lucrurile, deși lăsând codul comentat în fișierul functions.php va funcționa și el. Nu lăsa aceste exemple decomentate, altfel va scrie în baza de date la fiecare încărcare de pagină!

Funcțiile menționate mai sus scriu într-un câmp din baza de date de opțiuni. Comentarea și decomentarea lor este soluția corectă. Există plugin-uri pentru rolurile utilizatorilor, dar dacă folosești funcțiile menționate mai sus, nu poți lăsa aceste funcții să ruleze și NU trebuie să le configurezi mai mult de o dată sau să le setezi în funcție de dacă un anumit utilizator accesează ceva. Dacă dorești asta, configurează acel utilizator cu un rol specific, unic. Consultă codex-ul, tot ce am scris mai sus este 100% corect dacă faci asta fără un plugin.
Pentru aproape fiecare caz, trebuie să setezi rolurile utilizatorilor doar o singură dată.

@tomcat23: Pentru a ilustra, am încapsulat-o într-o funcție care adaugă rolul doar dacă acesta nu există deja. O altă observație: Cred că ar fi mai ușor să plasezi rolul undeva în ierarhia de roluri, preluând capabilitățile dintr-un rol predefinit și apoi adăugând/eliminând capabilitățile din rolul predefinit. Asta ar face mai clar și mai ușor de reținut dacă capabilitățile sale sunt plasate undeva între, de exemplu, administrator și editor. - Sper că nu te supări că am editat răspunsul tău. Dacă da, te rog să-l revii. :)

Susțin răspunsul meu așa cum l-am lăsat. Funcția ta ratează esența și nu oferă același răspuns ca textul meu. De asemenea, consider că este destul de nepoliticos din partea ta să modifici codul și răspunsul meu.

Nu numai atât, dar funcția ta nu face același lucru ca codul meu. Funcția ta lasă doar încă o verificare în loc, get_role('international', care nu este necesară! Am folosit acest cod pentru a muta un client care avea un server care folosea php4 și, prin urmare, nu putea utiliza pluginul role scoper pe care îl utilizaseră, care era doar pentru php5. (Și era singurul plugin care avea nevoie de php5 pentru instalarea lor.) Ca dezvoltator, am văzut că singurul motiv pentru care aveau nevoie de el era să configureze câteva roluri și să schimbe unele capabilități. Și acest cod, răspunsul meu original de aici, este cum să faci asta!

Nu trebuie, și nici nu ar trebui, să înfășori asta într-o funcție. Ai nevoie doar să setezi corect rolurile și capabilitățile. Dacă vrei să te joci cu ele, există câteva pluginuri grozave (deși umflate) pentru asta.
Dacă înțelegi rolurile și capabilitățile în WordPress și nu doar încerci să te joci cu ele, și nu scrii propriul tău plugin, atunci așa se face corect. Te rog să nu editezi codul meu. L-am readus la forma originală. Înfășurarea ta în funcție este în istoric pentru oricine să vadă, deși sunt în dezacord cu ceea ce ai făcut.

Pentru a clarifica în continuare, nu ai nevoie să înfășori asta într-o funcție sau să faci verificări de admin. add_role(), remove_role(), add_cap() și remove_cap(), așa cum arăt în răspunsul meu original, nu trebuie să fie executate mereu -- ele doar setează un câmp în tabelul de opțiuni care nu trebuie scris mereu -- de aceea înfășurarea ta în funcție este greșită. Știu, adaugi o acțiune la after_setup_theme, dar setarea unui rol cu acel hook nu era despre ce vorbeam în răspunsul meu. (Și, în general, rolurile nu trebuie să fie incluse în teme.)

Puh... Cum am scris: "Sper că nu te deranjează că am editat răspunsul tău. Dacă da, te rog să îl revii la versiunea anterioară. :)". Ai revenit la versiunea anterioară, ai explicat motivul și ghici ce: E în regulă. Așa că calmează-te. Dar ca să-ți ofer aceeași cantitate de explicații: Eu mereu încapsulez lucrurile în funcții și le adaug în folderul cu fișierele de test ale temei mele. În felul acesta pot testa ușor diverse lucruri, de exemplu răspunsurile WA și le pot adăuga rapid dacă am nevoie de ceva, așa că încapsularea într-o funcție e ok. Mai mult, e mai ușor să dezactivezi (doar apelul add_action) și să permiți comentarii doc cu /**/ în loc de comentarii multiline cu //. Cam atât despre „de ce” al meu.

@tomcat23 - Reține că suntem o comunitate care se sprijină reciproc, nu una care se provoacă reciproc, decât în mod academic. După cum vezi din răspunsul lui @kaiser, el încerca doar să ajute.

@MikeSchinkel Îmi amintesc că au fost două comentarii de la @kaiser pe 1 februarie, motiv pentru care am răspuns atunci așa cum am făcut-o. (Ești moderator, poți verifica dacă a făcut asta? Pentru că nu cred că greșesc în a crede că a avut 2 comentarii despre faptul că modul meu de utilizare nu i s-a părut ok.) Nu am simțit că codul meu sau explicația aveau nevoie de ajutor și i-am spus asta pe 1 februarie. Mă întorc ceva timp mai târziu și constat că el mi-a modificat codul - prima mea expunere la aspectul „wiki” al acestui site - și am fost, în opinia mea, pe bună dreptate iritat că în timp ce textul și comentariile mele discutau un lucru, codul în sine era diferit.

Răspunsul meu este în spiritul întrebării originale. Acesta este codul meu util, acesta este ceea ce funcționează bine pentru mine și nu îl folosesc încadrat într-o funcție. Dacă @kaiser ar fi vrut să răspundă la această întrebare cu codul încadrat într-o funcție și atașat la un hook, el este în continuare liber să o facă.
Din nou, @kaiser, ceea ce ai făcut schimbând codul meu dar nu și textul a fost dăunător pentru alți oameni care ar veni aici, l-ar vedea și ar descoperi că discuția mea despre cod nu avea sens. De aceea consider că a fost nepoliticos din partea ta să faci ceea ce ai făcut și de aceea am răspuns ieri atât de aspru.

@tomcat23 - Apa trecută sub pod în acest moment. Tot ce spun este că nu sunt interesat să atribui vina, ci doar să avem pace pentru toți în continuare. :)

@MikeSchinkel Da, ai dreptate.
@kaiser Îmi cer scuze dacă te-am jignit.

Wordpress Footer Personalizat în Administrare
// personalizare text footer administrare
function custom_admin_footer() {
echo 'adaugă aici textul tău personalizat și html pentru footer';
}
add_filter('admin_footer_text', 'custom_admin_footer');
Folosesc acest cod pe site-urile clienților ca o simplă referință pentru a mă contacta pe mine ca developer.

Funcție pentru Dezactivarea Fluxurilor RSS
Testat pe: WordPress 3.0.1
Puteți dezactiva fluxurile RSS dacă doriți să mențineți site-ul WordPress ca unul static.
Puteți utiliza această funcție:
function fb_disable_feed() {
wp_die( __('Nu există flux disponibil, vă rugăm să vizitați <a href="'. get_bloginfo('url') .'">pagina noastră principală</a>!') );
}
add_action('do_feed', 'fb_disable_feed', 1);
add_action('do_feed_rdf', 'fb_disable_feed', 1);
add_action('do_feed_rss', 'fb_disable_feed', 1);
add_action('do_feed_rss2', 'fb_disable_feed', 1);
add_action('do_feed_atom', 'fb_disable_feed', 1);

Sursă: http://bueltge.de/wordpress-feeds-deaktivieren/794/ (Frank Bueltge)

Mulțumesc Toscho! sursa este disponibilă și în engleză http://wpengineer.com/287/disable-wordpress-feed/

Schimbă mesajul "Howdy" în "Bine ați venit"
Cu această funcție poți personaliza mesajul "Howdy" din partea dreaptă sus a zonei de administrare.
Această funcție folosește JQuery pentru a schimba mesajul "Howdy" în "Bine ați venit".
/****** Personalizează mesajul de administrare "Howdy" în "Bine ați venit" ******/
$nohowdy = "Bine ați venit";
if (is_admin()) {
add_action('init', 'artdev_nohowdy_h');
add_action('admin_footer', 'artdev_nohowdy_f');
}
// Încarcă jQuery
function artdev_nohowdy_h() {
wp_enqueue_script('jquery');
}
// Modifică
function artdev_nohowdy_f() {
global $nohowdy;
echo <<<JS
<script type="text/javascript">
//<![CDATA[
var nohowdy = "$nohowdy";
jQuery('#user_info p')
.html(
jQuery('#user_info p')
.html()
.replace(/Howdy/,nohowdy)
);
//]]>
JS;
}
Versiune PHP, folosind filtrul gettext
:
add_filter('gettext', 'change_howdy', 10, 3);
function change_howdy($translated, $text, $domain) {
if (!is_admin() || 'default' != $domain)
return $translated;
if (false !== strpos($translated, 'Howdy'))
return str_replace('Howdy', 'Bine ați venit', $translated);
return $translated;
}

Nu se poate deja edita pe partea de PHP astfel încât să nu fie deloc afișat?
