Najlepsza kolekcja kodu dla pliku functions.php [zamknięte]


331

Głosuj na pytanie i wszelkie odpowiedzi, które uważasz za przydatne, klikając strzałkę W GÓRĘ po lewej stronie pytania lub odpowiedzi.

Podobnie jak wielu innych, którzy teraz oglądają ten post, czytałem różne blogi, fora i grupy dyskusyjne, aby uczyć się i doskonalić moje umiejętności w zakresie wordpress. W ciągu ostatnich 12 miesięcy miałem misję, aby zastąpić korzystanie z wtyczek przez dodanie kodu do mojego functions.phppliku. Chociaż całkowicie się zgadzam, że wtyczki są bardzo przydatne w wielu sytuacjach, moje doświadczenie pokazało, że w 90% przypadków użycia, chociaż wtyczka może istnieć, faktyczne użycie jej może spowodować niepotrzebne komplikacje i problemy ze zgodnością. Dodatkowo w wielu przypadkach takie wtyczki dodawały menu i inne elementy administracyjne, których nie chcę ani nie potrzebuję.

Najczęściej odkrywałem, że analizując kod wtyczek, byłem w stanie usunąć fragment kodu, który chciałem i na stałe go kodować functions.php. To zapewniło mi dokładnie taką funkcjonalność, jakiej potrzebowałem, bez konieczności dołączania niepotrzebnych elementów.

Tak więc celem tego postu jest moja próba zaangażowania ciebie, czytelnika / administratora / programisty, do udostępnienia mi i innym tutaj wszelkich bitów kodu, które uważasz za przydatne i które zostały dodane do function.phppliku twojego motywu w celu rozszerzenia lub ulepszenia WordPressa bez użycia podłącz.

Gdy prześlesz odpowiedź tutaj, prosimy nadać każdemu bitowi kodu tytuł, daj nam znać, jeśli z jaką wersją wordpress znasz, jest kompatybilny, dołącz dowolny opis, który najlepiej opisuje jego funkcję i (jeśli dotyczy) dołącz link do oryginału wtyczka lub źródło, w którym znalazłeś informacje.

Z niecierpliwością czekam na wszystkie twoje odpowiedzi i oczywiście będę stale dodawać własne nowe znaleziska za każdym razem, gdy je znajdę.


13
Biorąc pod uwagę, że pierwsze 5 odpowiedzi pochodziło od OP, a pytanie wydaje się bardziej nastawione na zebranie szeregu odpowiedzi niż pojedynczej, ostatecznej odpowiedzi, powinna to być wiki społeczności.
EAMann

17
Wszystkie odpowiedzi niezwiązane z tematem powinny zostać usunięte. Ten wątek jest dobrym przykładem złych praktyk kodowania.
fuxia

17
Myślę, że lepiej byłoby zachęcać ludzi do tworzenia niestandardowych wtyczek funkcyjnych zamiast korzystania z funkcji ich motywów. Php
Ian Dunn

3
@ NetConstructor.com Czysta liczba odsłon nie jest wskaźnikiem jakości. Powinniśmy zachęcać do konkretnych pytań z konkretnymi odpowiedziami i dobrymi praktykami kodowania. Ten wątek jest odwrotny.
fuxia

6
@ NetConstructor.com Omów to na Meta, gdzie ludzie mogą lepiej widzieć twoje argumenty. :)
fuxia

Odpowiedzi:


107

Włącz funkcję ukrytego administratora wyświetlającą WSZYSTKIE ustawienia witryny

Testowano na: Wordpress 3.1 RC3

Ten mały fragment kodu robi coś całkiem fajnego. Doda to dodatkową opcję do menu ustawień wraz z linkiem do „wszystkich ustawień”, który pokaże pełną listę wszystkich ustawień w bazie danych związanych z witryną WordPress. Poniższy kod sprawi, że ten link będzie widoczny tylko dla administratora i ukryje go dla wszystkich innych użytkowników.

// CUSTOM ADMIN MENU LINK FOR ALL SETTINGS
   function all_settings_link() {
    add_options_page(__('All Settings'), __('All Settings'), 'administrator', 'options.php');
   }
   add_action('admin_menu', 'all_settings_link');

Fantastyczny dla rozwoju! Często używam tabeli opcji do przechowywania wersji DB dla moich wtyczek ... używanie phpMyAdmina do resetowania do starej wersji DB w celu przetestowania skryptu aktualizacji jest uciążliwe ... to znacznie ułatwi !!!
EAMann

3
Możesz także przejść do tej samej strony opcji (po zalogowaniu), przechodząc do witryny / wp-admin / options.php
j08691

89

Zmodyfikuj logo logowania i łącze URL obrazu

Testowane na: WordPress 3.0.1

Ten kod pozwoli ci łatwo zmodyfikować logo strony WordPress, a także link i tekst tytułowy tego logo.

add_filter( 'login_headerurl', 'namespace_login_headerurl' );
/**
 * Replaces the login header logo URL
 *
 * @param $url
 */
function namespace_login_headerurl( $url ) {
    $url = home_url( '/' );
    return $url;
}

add_filter( 'login_headertitle', 'namespace_login_headertitle' );
/**
 * Replaces the login header logo title
 *
 * @param $title
 */
function namespace_login_headertitle( $title ) {
    $title = get_bloginfo( 'name' );
    return $title;
}

add_action( 'login_head', 'namespace_login_style' );
/**
 * Replaces the login header logo
 */
function namespace_login_style() {
    echo '<style>.login h1 a { background-image: url( ' . get_template_directory_uri() . '/images/logo.png ) !important; }</style>';
}

EDYCJA: Jeśli chcesz użyć logo witryny do zastąpienia logo logowania, możesz użyć następujących opcji, aby dynamicznie pobrać te informacje (testowane na 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;
}

79

Uwzględnij niestandardowe typy postów w wynikach wyszukiwania.

// MAKE CUSTOM POST TYPES SEARCHABLE
function searchAll( $query ) {
 if ( $query->is_search ) { $query->set( 'post_type', array( 'site', 'plugin', 'theme', 'person' )); } 
 return $query;
}
add_filter( 'the_search_query', 'searchAll' );

Domyślnie dodaj niestandardowe typy postów do głównego kanału RSS swojej witryny.

// ADD CUSTOM POST TYPES TO THE DEFAULT RSS FEED
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' );

Uwzględnij niestandardowe typy postów w widżecie pulpitu administratora „Right Now”

Obejmuje to niestandardowe typy postów i liczbę wpisów dla każdego typu w widżecie pulpitu nawigacyjnego „Right Now”.

// ADD CUSTOM POST TYPES TO THE 'RIGHT NOW' DASHBOARD WIDGET
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' );

Odnośnie ostatniego fragmentu tej odpowiedzi. To świetny dodatek, ponieważ dodawałem je ręcznie dla każdego typu posta. Jedyny problem, jaki mam z tym, to to, że dodaje dane po domyślnym wpisie „kategoria” i „tag”. Czy możesz zaktualizować swoją odpowiedź, aby przenieść domyślne „kategorie” lub „oznaczyć” w dół lub usunąć je, aby można je było dodać ręcznie?
NetConstructor.com

@ NetConstructor.com Nie sądzę, że rozumiem twoją prośbę. Jeśli tak, to myślę, że byłoby to trochę trudniejsze i naprawdę nie mam teraz czasu, aby wymyślić, jak to zrobić.
jaredwilli

Uwzględnij niestandardowe typy postów w wynikach wyszukiwania - myślę, że teraz możesz to zrobić z exclude_from_searchparam register_post_type...
Krzysiek Dróżdż

78

Usuń powiadomienie o aktualizacji dla wszystkich użytkowników z wyjątkiem użytkownika ADMIN

Testowane na: Wordpress 3.0.1

Ten kod gwarantuje, że użytkownicy inni niż „admin” nie zostaną powiadomieni przez wordpress, gdy aktualizacje będą dostępne.

// REMOVE THE WORDPRESS UPDATE NOTIFICATION FOR ALL USERS EXCEPT SYSADMIN
   global $user_login;
   get_currentuserinfo();
   if ($user_login !== "admin") { // change admin to the username that gets the updates
    add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
    add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );
   }

Zmieniono wersję, aby wyświetlała powiadomienie o aktualizacji tylko dla użytkowników administracyjnych (w przeciwieństwie do samego użytkownika „admin”):

// REMOVE THE WORDPRESS UPDATE NOTIFICATION FOR ALL USERS EXCEPT SYSADMIN
       global $user_login;
       get_currentuserinfo();
       if (!current_user_can('update_plugins')) { // checks to see 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;" ) );
       }

8
To o wiele mniej niż idealne. Będzie działać tylko wtedy, gdy login administratora nadal będzie domyślnym „adminem”, co nie powinno być ze względów bezpieczeństwa. Zamiast tego powinieneś sprawdzić, czy chcesz, aby ludzie widzieli wiadomości.
jerclarke

1
Tj. If (! Current_user_can ('manage_options')) {... add_filter ...} - Przepraszam za podwójny komentarz, zapomniałem, że naciśnięcie Enter
powoduje

Właśnie dlatego dodałem komentarz do kodu, w którym możesz zmienić nazwę użytkownika administratora. Jak byś to ulepszył / przepisał?
NetConstructor.com

Najlepszym sposobem jest usunięcie globalnego $ user_login i get_currentuserinfo () i zamiast tego użycie current_user_can w klauzuli if. To tylko 1 linia zamiast 3 i jest to standardowy sposób. Możesz sprawdzić, jaka konkretna funkcja byłaby potrzebna do działania na komunikatach, w tym przypadku są to „update_core” i „update_plugins”.
jerclarke

2
więc: if (! current_user_can ('update_plugins')) {/ * USUŃ WIADOMOŚCI * /}
jerclarke

72

Ładowanie jQuery z Google CDN

Testowane na: Wordpress 3.0.1

// even more smart jquery inclusion :)
add_action( 'init', 'jquery_register' );

// register from google and for 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' );
}
}

Usuń informacje o wersji WordPress dla bezpieczeństwa

Testowane na: Wordpress 3.0.1

// remove version info from head and feeds
function complete_version_removal() {
    return '';
}
add_filter('the_generator', 'complete_version_removal');

Dodaj spam i usuń łącza do komentarzy w interfejsie użytkownika

Testowane na: Wordpress 3.0.1

Ułatwia to zarządzanie komentarzami z interfejsu użytkownika poprzez dodawanie spamu i usuwanie linków. **

// spam & delete links for all versions of 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.'">del</a> ';
        echo '| <a href="'.get_bloginfo('wpurl').'/wp-admin/comment.php?action=cdc&dt=spam&c='.$id.'">spam</a>';
    }
}

Opóźnij publiczne publikowanie na kanale RSS

Testowane na: Wordpress 3.0.1

Wreszcie, lubię opóźniać publikowanie na moich kanałach RSS o 10-15 minut, ponieważ zawsze znajduję co najmniej kilka błędów w tekście. Inne zastosowania to przypadki, w których chcesz, aby treści były dostępne wyłącznie na Twojej stronie przez dzień lub tydzień, zanim zostaną przesłane do twoich czytników RSS.

// delay feed update
function publish_later_on_feed($where) {
    global $wpdb;

    if (is_feed()) {
        // timestamp in WP-format
        $now = gmdate('Y-m-d H:i:s');

        // value for wait; + device
        $wait = '10'; // integer

        // http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_timestampdiff
        $device = 'MINUTE'; // MINUTE, HOUR, DAY, WEEK, MONTH, YEAR

        // add SQL-sytax to default $where
        $where .= " AND TIMESTAMPDIFF($device, $wpdb->posts.post_date_gmt, '$now') > $wait ";
    }
    return $where;
}
add_filter('posts_where', 'publish_later_on_feed');

źródło w moim poście: wpengineer.com/320/publish-the-feed-later z dodatkowymi informacjami
bueltge

1
Możesz także po prostu usunąć filtr generatora:remove_action('wp_head', 'wp_generator');
Gipetto

25
ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js wygasa po godzinie. Zawsze używaj pełnych informacji o wersji, takich jak ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js - które wygasają po upływie jednego roku.
fuxia

5
Kod „Usuń informacje o wersji WordPress dla bezpieczeństwa” w rzeczywistości nie robi nic, aby zwiększyć bezpieczeństwo Twojej witryny. Nie zatrzymuje nawet ujawnienia wersji WP używanej w Twojej witrynie.
Joseph Scott

1
Nieprawda, Joseph, jeśli twoja wersja WordPress zostanie ujawniona, ludzie będą mogli zobaczyć, czy korzystasz ze starszej wersji, odsłaniając w ten sposób twoje słabości. Zawsze dobrą decyzją jest usunięcie tego ze wszystkich instalacji WordPress. Osobiście nawet nie wiem, dlaczego umieszczają go tutaj, ponieważ jest to kwestia bezpieczeństwa.
Jeremy

58

Ustaw maksymalną liczbę poprawek po, aby uniknąć wzdęcia DB.

Testowane na: Wordpress 3.0.1

Domyślnie jest nieskończony, spowoduje to zapamiętanie tylko ostatnich 5 edycji:

/**
 * Set the post revisions unless the constant was set in wp-config.php
 */
if (!defined('WP_POST_REVISIONS')) define('WP_POST_REVISIONS', 5);

FWIW istnieje mnóstwo świetnych pomysłów na CONSTANTS, które można ustawić na stronie Kodeksu Edycja wp-config.php .


Czy można to ustawić dla poszczególnych rodzajów postów?
NetConstructor.com

Patrząc na jego użycie w wp_save_post_revision (), wydaje się, że nie ma sposobu na rozróżnienie na podstawie typów postów. Nie ma filtru ani niczego w tej wartości, chociaż prawdopodobnie powinno być.
jerclarke

dzięki Jeremy - komukolwiek innemu, jeśli wiesz, jak to zrobić, opublikuj go tutaj.
NetConstructor.com

1
osobiście wolę 10. Wiem, że jest podwójna, ale zawsze, gdy potrzebuję korekty, zawsze jest starsza niż 5
Jan

56

Narzędzia do profilowania Wordpress

Lubię dodawać narzędzia do profilowania w osobnym pliku, który w razie potrzeby dołączam z functions.php:

<?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 queries - {$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 cache hits / " . ( $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, "Load");
    '), 10000000);
add_action('template_redirect', create_function('$in', '
    return add_stop($in, "Query");
    '), -10000000);
add_action('wp_footer', create_function('$in', '
    return add_stop($in, "Display");
    '), 10000000);
add_action('admin_footer', create_function('$in', '
    return add_stop($in, "Display");
    '), 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(
            'File/Line: ' . $trace['file'] . ', ' . $trace['line'],
            'Function / Class: ' . $trace['function'] . ', ' . $trace['class']
            );
} # dump_trace()
if ( $_GET['debug'] == 'http' )
    add_filter('http_request_args', 'dump_http', 0, 2);
?>

czy istnieje szybki sposób na zmodyfikowanie tego, aby skrypt był wywoływany tylko wtedy, gdy administrator ORAZ dopisał coś do adresu URL, aby wyświetlić informacje debugowania?
NetConstructor.com

1
Tak to jest zrobione w moim motywie: semiologic.com/software/sem-reloaded - plik /inc/debug.php jest zawarty w plikach /functions.php lub /inc/init.php (nie można go przypomnieć głowa).
Denis de Bernardy

52

Wyostrz obrazy o zmienionym rozmiarze (tylko jpg)

Ta funkcja wyostrza obrazy JPG o zmienionym rozmiarze. Przykład różnicy:http://dl.dropbox.com/u/1652601/forrst/gdsharpen.png

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', __('Could not read image size'), $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);

o wiele lepsze pliki JPEG, wielkie dzięki! testowany w 3,4-alfa
brasofilo


dokąd idzie ta funkcja?
StevieD

@StevieD - jak sugeruje tytuł, wchodzi do pliku functions.php w szablonie. Byłbym jednak ostrożny, ta funkcja ma prawie 8 lat.
timofey.com

51

Usuń domyślne skrzynki meta Wordpress

Testowane na: Wordpress 3.0.1

Ten kod pozwoli Ci usunąć określone MetaBoksy, które WordPress domyślnie dodaje do domyślnych ekranów Dodaj / Edytuj post i Dodaj / Edytuj stronę.

// REMOVE META BOXES FROM DEFAULT POSTS SCREEN
   function remove_default_post_screen_metaboxes() {
 remove_meta_box( 'postcustom','post','normal' ); // Custom Fields Metabox
 remove_meta_box( 'postexcerpt','post','normal' ); // Excerpt Metabox
 remove_meta_box( 'commentstatusdiv','post','normal' ); // Comments Metabox
 remove_meta_box( 'trackbacksdiv','post','normal' ); // Talkback Metabox
 remove_meta_box( 'slugdiv','post','normal' ); // Slug Metabox
 remove_meta_box( 'authordiv','post','normal' ); // Author Metabox
 }
   add_action('admin_menu','remove_default_post_screen_metaboxes');


// REMOVE META BOXES FROM DEFAULT PAGES SCREEN
   function remove_default_page_screen_metaboxes() {
 remove_meta_box( 'postcustom','page','normal' ); // Custom Fields Metabox
 remove_meta_box( 'postexcerpt','page','normal' ); // Excerpt Metabox
 remove_meta_box( 'commentstatusdiv','page','normal' ); // Comments Metabox
 remove_meta_box( 'trackbacksdiv','page','normal' ); // Talkback Metabox
 remove_meta_box( 'slugdiv','page','normal' ); // Slug Metabox
 remove_meta_box( 'authordiv','page','normal' ); // Author Metabox
 }
   add_action('admin_menu','remove_default_page_screen_metaboxes');

4
Według tego wordpress.stackexchange.com/questions/34030/ ... nie ukryłbym slugdiv w ten sposób, ale zamiast tego użyj tego gist.github.com/1863830

@CorvanNoorloos Twój link github jest uszkodzony.
user7003859

48

Usuń „Wordpress” z filtra „WordPress”

Testowane na: Wordpress 3.0.1

Do WordPress w wersji 3.0 dodano filtr, który automatycznie konwertuje wszystkie wystąpienia „Wordpress” (bez dużej litery P) na „WordPress” (z dużą literą P) w treści postu, tytułach postów i tekście komentarza. Niektórzy ludzie uważają to za natrętne, po prostu muszę od czasu do czasu źle wpisywać WordPress i uważam, że filtr jest nieco denerwujący.

// Remove annoying P filter
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 );
}

świetne małe znalezisko. Jedna z tych rzeczy, która po prostu usuwa kolejny niepotrzebny fragment kodu
NetConstructor.com

5
W WordPress 3.0.1 ten filtr jest dodawany z priorytetem 11 , dlatego należy go dodać 11jako trzeci parametr, aby go usunąć.
Jan Fabry,

46

Dostosuj pulpit nawigacyjny

add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');

function my_custom_dashboard_widgets() {
   global $wp_meta_boxes;

Usuń te widżety pulpitu nawigacyjnego ...

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

Dodaj niestandardowy widget o nazwie „Pomoc i obsługa techniczna”

   wp_add_dashboard_widget('custom_help_widget', 'Help and Support', 'custom_dashboard_help');
}

To jest treść niestandardowego widgetu

 function custom_dashboard_help() {
    echo '<p>Lorum ipsum delor sit amet et nunc</p>';
}

44

Dodaj niestandardowe pola profilu użytkownika

Umieść poniższy kod w pliku functions.php, aby dodać niestandardowe pola profilu użytkownika. Edytuj lub dodaj linie według własnego uznania.

Pamiętaj, aby nie usuwać wiersza: return $ contactmethods; inaczej to nie zadziała.

// CUSTOM USER PROFILE FIELDS
   function my_custom_userfields( $contactmethods ) {

    // ADD CONTACT CUSTOM FIELDS
    $contactmethods['contact_phone_office']     = 'Office Phone';
    $contactmethods['contact_phone_mobile']     = 'Mobile Phone';
    $contactmethods['contact_office_fax']       = 'Office Fax';

    // ADD ADDRESS CUSTOM FIELDS
    $contactmethods['address_line_1']       = 'Address Line 1';
    $contactmethods['address_line_2']       = 'Address Line 2 (optional)';
    $contactmethods['address_city']         = 'City';
    $contactmethods['address_state']        = 'State';
    $contactmethods['address_zipcode']      = 'Zipcode';
    return $contactmethods;
   }
   add_filter('user_contactmethods','my_custom_userfields',10,1);

Aby wyświetlić niestandardowe pola, możesz użyć jednej z dwóch metod wymienionych poniżej.

Opcja 1:

the_author_meta('facebook', $current_author->ID)

Opcja 2:

<?php $current_author = get_userdata(get_query_var('author')); ?>
<p><a href="<?php echo esc_url($current_author->contact_phone_office);?>" title="office_phone"> Office Phone</a></p>

41

Dostosuj kolejność menu administratora

testowane na: Wordpress 3.0.1

Ten kod pozwoli ci na reorganizację kolejności elementów w menu administratora. Wszystko, co musisz zrobić, to kliknąć istniejący link w menu administratora i skopiować wszystko przed / wp-admin / URL. Kolejność poniżej przedstawia kolejność, w jakiej będzie miało nowe menu administratora.

// CUSTOMIZE ADMIN MENU ORDER
   function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array(
        'index.php', // this represents the dashboard link
        'edit.php?post_type=events', // this is a custom post type menu
        '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', // this is the default page menu
        'edit.php', // this is the default POST admin menu 
    );
   }
   add_filter('custom_menu_order', 'custom_menu_order');
   add_filter('menu_order', 'custom_menu_order');

Czy naprawdę istnieje filtr rdzeniowy o nazwie custom_menu_order? Nie mogłem znaleźć jednego ...
kaiser


40

Funkcja zmiany długości ćwiczenia

Testowane na: Wordpress 3.0.1

Domyślnie wszystkie fragmenty są ograniczone do 55 słów. Korzystając z poniższego kodu, możesz zastąpić te ustawienia domyślne:

function new_excerpt_length($length) { 
    return 100;
}

add_filter('excerpt_length', 'new_excerpt_length');

Ten przykład zmienia długość fragmentu na 100 słów, ale możesz użyć tej samej metody, aby zmienić ją na dowolną wartość.


@ user402 ... czy to ograniczenie jest wyrażane słowami lub znakami? Czy możesz napisać, jak to zrobić?
NetConstructor.com

3
@ NetConstructor.com Ta funkcja (i excerpt_lengthzaczep) jest ograniczona słowami .
EAMann

Heh Mam ten filtr dodany do rdzenia. :)
Dougal Campbell

38

Dodaj miniatury w Zarządzaj listami postów / stron

Możesz dodać to do swoich funkcji, aby wyświetlić w kolumnie Zarządzaj / Edytuj post i Listę nową kolumnę z podglądem miniatur.

/****** Add Thumbnails in Manage Posts/Pages List ******/
if ( !function_exists('AddThumbColumn') && function_exists('add_theme_support') ) {

    // for post and page
    add_theme_support('post-thumbnails', array( 'post', 'page' ) );

    function AddThumbColumn($cols) {

        $cols['thumbnail'] = __('Thumbnail');

        return $cols;
    }

    function AddThumbValue($column_name, $post_id) {

            $width = (int) 35;
            $height = (int) 35;

            if ( 'thumbnail' == $column_name ) {
                // thumbnail of WP 2.9
                $thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true );
                // image from gallery
                $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 __('None');
                    }
            }
    }

    // for posts
    add_filter( 'manage_posts_columns', 'AddThumbColumn' );
    add_action( 'manage_posts_custom_column', 'AddThumbValue', 10, 2 );

    // for pages
    add_filter( 'manage_pages_columns', 'AddThumbColumn' );
    add_action( 'manage_pages_custom_column', 'AddThumbValue', 10, 2 );
}

Jak przesunąć kolumnę najbardziej w lewo?
Bogaty

38

Usuń pingi z własnego bloga

Testowane na: Wordpress 3.0.1

//remove pings to self
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' );

jak często i kiedy samo WordPing pinguje?
NetConstructor.com

Często mam ten problem. Jeśli odwołuję się do wewnętrznego linku do innego postu na moim blogu WP, otrzymam od siebie trackback lub pingback (nie pamiętam, który). To denerwujące.
Sahas Katta,

To samo tutaj. Mam blog z wiadomościami / czasopismami i dość często link do innych artykułów.
Steven

35

Włącz kompresję wyjściową GZIP

Zwykle serwer powinien być skonfigurowany do robienia tego automatycznie, ale wielu współdzielonych hostów tego nie robi (prawdopodobnie w celu zwiększenia wykorzystania przepustowości klienta)

 if(extension_loaded("zlib") && (ini_get("output_handler") != "ob_gzhandler"))
   add_action('wp', create_function('', '@ob_end_clean();@ini_set("zlib.output_compression", 1);'));

32

Wyświetl zapytania DB, spędzony czas i zużycie pamięci

Testowane na: Wordpress 3.0.1

function performance( $visible = false ) {

    $stat = sprintf(  '%d queries in %.3f seconds, using %.2fMB memory',
        get_num_queries(),
        timer_stop( 0, 3 ),
        memory_get_peak_usage() / 1024 / 1024
        );

    echo $visible ? $stat : "<!-- {$stat} -->" ;
}

Następnie kod poniżej powyższego kodu, który automatycznie wstawi powyższy kod do stopki Twojej publicznej witryny (upewnij się, że Twój motyw wywołuje wp_footer):

add_action( 'wp_footer', 'performance', 20 );

Można wywoływać wiele razy.


dla użycia php <5.2memory_get_usage()
onetrickpony 23.01.11

31

Wyrejestruj domyślne widżety WP

Testowane na: WordPress 3.0.1

// unregister all default WP Widgets
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);

Użyłem go w wersji 3.1.4. Ale widżety wciąż tam są. Czy ktoś ma pomysł?
user391

Nadal działa na WP 4.5 :)
Tim Malone

30

Automatyczne wyodrębnianie pierwszego obrazu z treści postu

Testowane na: Wordpress 3.0.1

Ten kod automatycznie wyodrębni pierwszy obraz powiązany z postem i pozwoli ci go wyświetlić / użyć, wywołując funkcję getImage.

// AUTOMATICALLY EXTRACT THE FIRST IMAGE FROM THE POST 
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;
}

6
Fajnie, ale get_the_image również świetnie sobie z tym radzi. wordpress.org/extend/plugins/get-the-image
artlung

poprawne, ale ten działa inaczej i naprawia różne problemy, których get_the_image nie bierze pod uwagę
NetConstructor.com

3
Co robi inaczej niż skrypt get_the_image?
mat

1
@matt - W wordpress istnieją różne sposoby dodawania obrazów do postów i myślę, że skrypt get_the_image po prostu patrzy na jeden z nich. Sprawdza to, czy istnieje wyróżniony obraz i używa go jako pierwszego, jeśli jest dostępny, a następnie myślę, że sprawdza pierwszy obraz dodany do treści postu, a jeśli go nie znaleziono, sprawdza w galerii multimediów obraz o najwyższym sortowaniu kolejność (przynajmniej tak pamiętam kolejność).
NetConstructor.com

sugeruję wordpress.org/extend/plugins/auto-post-thumbnail Automatyczne generowanie miniatury posta (wyróżniona miniatura) z pierwszego obrazu w poście lub dowolnego niestandardowego typu postu tylko wtedy, gdy nie ustawiono miniatury postu
Ünsal Korkmaz

27

W nagłówku należy podać plik szablonu motywu, którego używa post / strona

add_action('wp_head', 'show_template');
function show_template() {
    global $template;
    print_r($template);
}

Skróć domyślne wyjście DIV, jeśli Twój motyw używa klasy post_class.

jeśli Twój motyw używa czegoś podobnego

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

Możesz mieć szalone długie divy w swoim źródle, które mogą wyglądać tak lub nawet dłużej:

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

To może naprawdę zaśmiecać twoje źródło i wydaje się raczej niepotrzebne w większości przypadków, wchodzenie w głębokość 3-4 jest wystarczające.

W górnym przykładzie możemy pokroić dane wyjściowe w następujący sposób:

// slice crazy long div outputs
    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');

to wycina dane wyjściowe tak, aby zawierały tylko pierwsze 5 wartości, więc powyższy przykład wygląda następująco:

<div id="post-4" class="post-4 post type-post hentry category-uncategorized"> 

Spraw, aby archiwa kategorii wyświetlały wszystkie posty, niezależnie od typu postu: dobre dla niestandardowych typów postów

function any_ptype_on_cat($request) {
 if ( isset($request['category_name']) )
  $request['post_type'] = 'any';

 return $request;
}
add_filter('request', 'any_ptype_on_cat');

Usuń niechciane elementy deski rozdzielczej

To zostało już opublikowane, ale nie ma pełnej listy elementów. Zwłaszcza te irytujące „linki przychodzące!”

add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');

function my_custom_dashboard_widgets() {
global $wp_meta_boxes;
 //Right Now - Comments, Posts, Pages at a glance
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']);
//Recent Comments
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']);
//Incoming Links
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']);
//Plugins - Popular, New and Recently updated Wordpress Plugins
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']);

//Wordpress Development Blog Feed
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']);
//Other Wordpress News Feed
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']);
//Quick Press Form
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']);
//Recent Drafts List
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']);
}

Usuń skoki strony „Czytaj więcej” **

zamiast tego wróć na górę strony. Wiesz, kiedy klikniesz „czytaj więcej”, przeskoczy do miejsca na stronie, co może być denerwujące, powoduje to, że po prostu ładuje stronę normalnie, bez przeskakiwania!

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

Ogranicz elementy menu ADMIN na podstawie nazwy użytkownika , zastąp nazwę użytkownika rzeczywistą nazwą użytkownika.

function remove_menus()
{
    global $menu;
    global $current_user;
    get_currentuserinfo();

    if($current_user->user_login == 'username')
    {
        $restricted = array(__('Posts'),
                            __('Media'),
                            __('Links'),
                            __('Pages'),
                            __('Comments'),
                            __('Appearance'),
                            __('Plugins'),
                            __('Users'),
                            __('Tools'),
                            __('Settings')
        );
        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');

// alternatywnie możesz zamiast tego użyć if ($ current_user-> user_login! = 'admin'), prawdopodobnie bardziej przydatny

Styluj chmurkę znaczników

//tag cloud custom
add_filter('widget_tag_cloud_args','style_tags');
function style_tags($args) {
$args = array(
     'largest'    => '10',
     'smallest'   => '10',
     'format'     => 'list',
     );
return $args;
}

Pełny wykaz opcji tutaj (jest ich wiele!) Http://codex.wordpress.org/Function_Reference/wp_tag_cloud

Zmień domyślny zegar aktualizacji widżetu RSS

(domyślnie to 6 lub 12 godzin, o których zapomniałem (1800 = 30 minut).

add_filter( 'wp_feed_cache_transient_lifetime', create_function('$fixrss', 'return 1800;') );

czy możesz podzielić każdą z nich na osobne odpowiedzi w ciągu kilku najbliższych tygodni? Zamierzałem to dla ciebie zrobić, ale nie chciałem, żeby ci się wydawało, że biorę za twoje odpowiedzi. W każdym razie - staram się to uporządkować, aby użytkownicy mogli łatwo znaleźć informacje, których szukają. Z góry
dziękuję

Właśnie użyłem kodu „Ogranicz elementy menu ADMIN na podstawie nazwy użytkownika, zastąp nazwę użytkownika rzeczywistą nazwą użytkownika”, co jest świetne, ale czy możesz zaktualizować kod, aby pokazać, jak można to zrobić dla określonej „roli użytkownika”. Myślę, że byłoby to bardzo przydatne!
NetConstructor.com

Przepraszam NetConstructor Właśnie widziałem twój komentarz. Do roli użytkownika użyłbym „current_user_can”. Nie mam czasu na testowanie, ale kiedy to zrobię, dodam to.
Wyck

wartość domyślna dla wp_feed_cache_transient_lifetime wynosi 43200 (12 godzin)
brasofilo,

26

Usuń powiadomienie o aktualizacji wtyczek TYLKO dla NIEAKTYWNYCH wtyczek

function update_active_plugins($value = '') {
    /*
    The $value array passed in contains the list of plugins with time
    marks when the last time the groups was checked for version match
    The $value->reponse node contains an array of the items that are
    out of date. This response node is use by the 'Plugins' menu
    for example to indicate there are updates. Also on the actual
    plugins listing to provide the yellow box below a given plugin
    to indicate action is needed by the user.
    */
    if ((isset($value->response)) && (count($value->response))) {

        // Get the list cut current active plugins
        $active_plugins = get_option('active_plugins');    
        if ($active_plugins) {

            //  Here we start to compare the $value->response
            //  items checking each against the active plugins list.
            foreach($value->response as $plugin_idx => $plugin_item) {

                // If the response item is not an active plugin then remove it.
                // This will prevent WordPress from indicating the plugin needs update actions.
                if (!in_array($plugin_idx, $active_plugins))
                    unset($value->response[$plugin_idx]);
            }
        }
        else {
             // If no active plugins then ignore the inactive out of date ones.
            foreach($value->response as $plugin_idx => $plugin_item) {
                unset($value->response);
            }          
        }
    }  
    return $value;
}
add_filter('transient_update_plugins', 'update_active_plugins');    // Hook for 2.8.+
//add_filter( 'option_update_plugins', 'update_active_plugins');    // Hook for 2.7.x

1
Niekoniecznie jest to dobry pomysł - nieaktywna wtyczka jest nadal obecna w systemie plików, a niepewna można nadal wykorzystać do zhakowania strony. Wtyczki powinny być zawsze aktualne.
Tim Malone

25

Usuń zbędne informacje i kod HTML z <head>tagu

// remove unnecessary header info
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' );         // for WordPress < 3.0
    remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' ); // for WordPress >= 3.0
}

// remove extra CSS that 'Recent Comments' widget injects
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'
    ) );
}

23

Włącz debugowanie błędów i logowanie, aby używać ich w witrynach na żywo

To jest fragment kodu, który napisałem, aby skorzystać ze stałych WP_DEBUG, które normalnie są domyślnie wyłączone. Cóż, stworzyłem sposób, aby nie tylko włączyć WP_DEBUG, abyś mógł używać go na stronie bez żadnych negatywnych skutków ubocznych, ale skorzystałem również z innych stałych debugowania do wymuszania wyświetlania błędów i do tworzenia pliku dziennika błędy i uwagi w katalogu / wp-content.

Upuść ten kod w pliku wp-config.php (PO ZAPISIE KOPII TYLKO W PRZYPADKU), a następnie możesz przekazać parametr? Debug = 1, 2 lub 3 parametry na końcu dowolnego adresu URL w witrynie.

? debug = 1 = pokazuje wszystkie błędy / powiadomienia? debug = 2 = zmusza je do wyświetlenia? debug = 3 = tworzy plik debug.log wszystkich błędów w katalogu / wp-content reż.

/**
* Written by Jared Williams - http://new2wp.com
* @wp-config.php replace WP_DEBUG constant with this code
* Enable WP debugging for usage on a live site
* http://core.trac.wordpress.org/browser/trunk/wp-includes/load.php#L230
* Pass the '?debug=#' parameter at the end of any url on site
*
* http://example.com/?debug=1, /?debug=2, /?debug=3
*/
if ( isset($_GET['debug']) && $_GET['debug'] == '1' ) {
    // enable the reporting of notices during development - E_ALL
    define('WP_DEBUG', true);
} elseif ( isset($_GET['debug']) && $_GET['debug'] == '2' ) {
    // must be true for WP_DEBUG_DISPLAY to work
    define('WP_DEBUG', true);
    // force the display of errors
    define('WP_DEBUG_DISPLAY', true);
} elseif ( isset($_GET['debug']) && $_GET['debug'] == '3' ) {
    // must be true for WP_DEBUG_LOG to work
    define('WP_DEBUG', true);
    // log errors to debug.log in the wp-content directory
    define('WP_DEBUG_LOG', true);
}

Bardziej szczegółowo wchodzę w post gościnny, który napisałem dla Comluv, jeśli jesteś zainteresowany, tutaj: http://comluv.com/dev/enable-debugging-and-logging-for-live-site-usage/

Nadal pracuję nad sposobem, aby zabezpieczyć to hasłem, lub raczej w jakiś sposób sprawić, aby działało, jeśli (current_user_can ('manage_themes') i is_logged_in ().

Ale właśnie tam staje się znacznie trudniejsze.


Używamy czegoś podobnego do konfigurowania szczegółów połączenia z bazą danych na żywo, przemieszczania i tworzenia danych.
Tom

20

Automatycznie dodawaj tytuły dynamiczne do stron publicznych

Testowane na: Wordpress 3.0.1

Wykorzystanie poniższego kodu automatycznie utworzy dynamiczne tytuły stron na podstawie stron / postów oglądanych publicznie.

/* Dynamic Titles **/
// This sets your <title> depending on what page you're on, for better formatting and for SEO
// You need to set the variable $longd to some custom text at the beginning of the function
function dynamictitles() {
$longd = __('Enter your longdescription here.', '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(' | '.__('Author', 'texdomainstring'));

} else if ( is_category() ) {
      bloginfo('name');
      wp_title(' | '.__('Archive for', 'texdomainstring'));

} else if ( is_tag() ) {
      echo get_bloginfo('name').' | '.__('Tag archive for', 'texdomainstring');
      wp_title('');

} else if ( is_archive() ) {
      echo get_bloginfo('name').' | '.__('Archive for', 'texdomainstring');
      wp_title('');

} else if ( is_search() ) {
      echo get_bloginfo('name').' | '.__('Search Results', 'texdomainstring');
} else if ( is_404() ) {
      echo get_bloginfo('name').' | '.__('404 Error (Page Not Found)', 'texdomainstring');

} else if ( is_home() ) {
      echo get_bloginfo('name').' | '.get_bloginfo('description');

} else {
      echo get_bloginfo('name').' | '.($blog_longd);
}
}

20

Nowe role i możliwości - Uruchom tylko raz!

Trzymam je pod ręką, jest to właściwy sposób na zrobienie ich bez wtyczki. Ustawiają pojedyncze pole (prefix_user_roles) w bazie danych opcji i nie potrzebujesz wtyczki, aby je ustawić. Na stronie Kodeksu znajduje się lista dostępnych możliwości i opisy ich działań. Musisz tylko odkomentować jeden z tych bloków, załadować dowolną stronę, a następnie skomentować je ponownie! Tutaj tworzę rolę, która ma możliwości, których potrzebuję:

/* Capabilities */

// To add the new role, using 'international' as the short name and
// 'International Blogger' as the displayed name in the User list and edit page:
/*
add_role('international', 'International Blogger', array(
    'read' => true, // True allows that capability, False specifically removes it.
    'edit_posts' => true,
    'delete_posts' => true,
    'edit_published_posts' => true,
    'publish_posts' => true,
    'edit_files' => true,
    'import' => true,
    'upload_files' => true //last in array needs no comma!
));
*/


// To remove one outright or remove one of the defaults:
/* 
remove_role('international');
*/

Czasami przydaje się dodawanie / usuwanie z istniejącej roli zamiast jej usuwania i ponownego dodawania. Ponownie musisz tylko odkomentować, ponownie załadować stronę, a następnie skomentować. Spowoduje to prawidłowe zapisanie roli / możliwości w tabeli opcji. (To pozwala programistom kontrolować je i usuwa narzut nieporęcznych wtyczek, które robią to samo.) Tutaj zmieniam rolę autora, aby usunąć ich opublikowane posty (domyślnie), ale umożliwiając im edycję ich opublikowane posty (co domyślnie nie jest możliwe dla tej roli) - przy użyciu * add_cap * lub * remove_cap *.

/*
$edit_role = get_role('author');
   $edit_role->add_cap('edit_published_posts');
   $edit_role->remove_cap('delete_published_posts');
*/

Trzymam arkusz kalkulacyjny z siatką ze strony Kodeksu dla stron, które modyfikują w ten sposób, więc pamiętam, jak to wszystko jest ustawione, chociaż pozostanie zakomentowany kod w pliku functions.php będzie działał. Nie pozostawiaj tych przykładów bez komentarza, bo będzie zapisywać do bazy danych przy każdym ładowaniu strony!


Funkcje, o których wspomniałem powyżej, zapisują w polu bazy danych opcji. Komentowanie i komentowanie ich jest właściwą drogą. Dostępne są wtyczki do ról użytkowników, ale jeśli użyjesz wspomnianych wyżej funkcji, nie możesz pozostawić tych funkcji uruchomionych i NIE musisz ustawiać ich więcej niż raz ani ustawiać w oparciu o to, czy określony użytkownik uzyskuje dostęp do czegoś. Jeśli chcesz, ustaw tego użytkownika z określoną, unikalną rolą. I zapoznaj się z kodeksem, wszystko co piszę powyżej jest w 100% poprawne, jeśli robisz to bez wtyczki. W prawie każdym przypadku role użytkowników należy ustawić tylko raz.
tomcat23

@ tomcat23: Aby to zilustrować, zapakowałem to w funkcję dodawania roli tylko wtedy, gdy jeszcze nie istnieje. Kolejna uwaga: myślę, że łatwiej byłoby umieścić rolę gdzieś w hierarchii ról, pobierając ograniczenia z niektórych wbudowanych ról, a następnie dodając / usuwając możliwości z wbudowanej roli. Sprawiłoby, że byłoby bardziej jasne i łatwiejsze do zapamiętania, jeśli czapki są umieszczone gdzieś pomiędzy ex. administrator i redaktor. - Mam nadzieję, że nie masz nic przeciwko, że zredagowałem twoją odpowiedź. Jeśli tak, proszę odegrać rolę z powrotem. :)
kaiser

1
@ tomcat23 - Woda pod mostem w tym miejscu. Mówię tylko, że nie jestem zainteresowany obwinianiem, a jedynie zapewnianiem spokoju wszystkim, którzy pójdą naprzód. :)
MikeSchinkel,

2
@MikeSchinkel Tak, masz rację. @kaiser Przepraszam, że spowodowałem zniewagę.
tomcat23

1
@MikeSchinkel: dzięki za przywrócenie pokoju. @ Tomcat23: Nie, nie zrobiłeś tego. Potrafię poradzić sobie z tego rodzaju krytyką. Przepraszam też.
kaiser

19

Wordpress Custom Admin Footer

// dostosuj tekst stopki administratora
funkcja custom_admin_footer () {
        echo „dodaj tutaj swój niestandardowy tekst stopki i HTML”;
} 
add_filter ('admin_footer_text', 'custom_admin_footer');

Używam tego dla stron klienckich jako prostego punktu odniesienia do skontaktowania się ze mną jako deweloperem.


19

Włącz skróty w widżetach

// shortcode in widgets
if ( !is_admin() ){
    add_filter('widget_text', 'do_shortcode', 11);
}

18

Funkcja wyłączania kanałów RSS

Testowane na: Wordpress 3.0.1

Możesz wyłączyć kanały RSS Jeśli chcesz utrzymać swoją witrynę opartą na Wordpress jako statyczną.

Możesz użyć tej funkcji:

function fb_disable_feed() {
wp_die( __('No feed available,please visit our <a href="'. get_bloginfo('url') .'">homepage</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);


Dzięki, Toscho! źródło jest również dostępne w języku angielskim wpengineer.com/287/disable-wordpress-feed
bueltge

16

Zmień wiadomość „Howdy” na „Welcome”

Za pomocą tej funkcji możesz dostosować komunikat „Howdy” w prawym górnym rogu obszaru administratora.
Ta funkcja wykorzystuje JQuery do zmiany komunikatu „Howdy” na „Welcome”.

/****** Customize admin message "Howdy" to "Welcome" ******/
$nohowdy = "Welcome";

if (is_admin()) {
    add_action('init', 'artdev_nohowdy_h');
    add_action('admin_footer', 'artdev_nohowdy_f');
}
// Load jQuery
function artdev_nohowdy_h() {
    wp_enqueue_script('jquery');
}
// Modify
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;
}

Wersja PHP, używając gettextfiltra:

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', 'Welcome', $translated);

    return $translated;
}

3
Czy nie można tego już edytować po stronie PHP, aby w ogóle nie otrzymywał danych wyjściowych?
hakre

Na pewno działa dobrze w wersjach 3.0+, ale dlaczego nie w starszych wersjach? Sprawdź, czy jakakolwiek inna wtyczka, której używasz, jest za to odpowiedzialna. Tekst tutaj zastąpiony JQuery, może wtyczka JQuery?
Philip
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.