Лучшая коллекция кода для вашего файла functions.php [закрыто]

332

Пожалуйста, проголосуйте за вопрос и любые ответы, которые вы найдете полезными, нажав на стрелку ВВЕРХ в левой части вопроса или ответа.

Как и многие другие, которые сейчас просматривают этот пост, я читал различные блоги, форумы и дискуссионные группы, чтобы изучить и улучшить свои навыки работы с WordPress. В течение последних 12 месяцев у меня была миссия заменить использование плагинов, добавив functions.phpвместо этого код в мой файл. Хотя я полностью согласен с тем, что плагины очень полезны во многих ситуациях, мой опыт доказал, что в 90% случаев использования, хотя плагин может существовать, его использование может создать ненужные сложности и проблемы совместимости. Кроме того, во многих случаях такие плагины добавили меню и другие элементы администратора, которые мне не нужны или не нужны.

Чаще всего я обнаруживал, что, анализируя код плагинов, я мог вырезать фрагмент кода, который хотел, и жестко запрограммировать его в свой functions.php. Это дало мне точную функциональность, в которой я нуждался, без необходимости включать ненужные элементы.

Итак, целью этого поста является моя попытка привлечь вас, читателя / администратора / разработчика, поделиться со мной и другими здесь любыми фрагментами кода, которые вы сочтете полезными и добавили в function.phpфайл вашей темы для расширения или улучшения WordPress без использования плагин.

Когда вы отправляете ответ здесь, пожалуйста, дайте каждому коду заголовок, дайте нам знать, если с какой версией WordPress вы знаете, что он совместим, включите любое описание, которое, по вашему мнению, лучше всего описывает его функцию, и (если применимо) укажите ссылку на оригинал Плагин или источник, где вы нашли информацию.

Я с нетерпением жду всех ваших ответов и, конечно, буду постоянно добавлять свои новые находки, когда бы я их ни нашел.

NetConstructor.com
источник
13
Учитывая, что первые 5 ответов были заданы ОП, и вопрос, кажется, больше ориентирован на сбор массива ответов, чем на один, окончательный ответ, это должна быть вики сообщества.
EAMann
17
Все ответы, не относящиеся к теме, должны быть удалены. Этот поток является хорошим примером плохой практики кодирования.
fuxia
17
Я думаю, что было бы лучше поощрять людей создавать пользовательский плагин функциональности вместо использования функций их тем. Php
Ян Данн
3
@ NetConstructor.com Чистое количество просмотров страниц не является показателем качества. Мы должны поощрять конкретные вопросы с конкретными ответами и хорошими методами кодирования. Эта тема противоположна.
fuxia
6
@ NetConstructor.com Обсудите это на Meta, где люди могут лучше увидеть ваши аргументы. :)
fuxia

Ответы:

107

Включить скрытую функцию администратора, отображающую ВСЕ настройки сайта

Проверено на: Wordpress 3.1 RC3

Этот маленький кусочек кода делает что-то очень крутое. Он добавит дополнительную опцию в ваше меню настроек со ссылкой на «все настройки», которая покажет вам полный список всех настроек в вашей базе данных, связанных с вашим сайтом WordPress. Приведенный ниже код сделает эту ссылку видимой только для администратора и скрыт для всех остальных пользователей.

// 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');
NetConstructor.com
источник
Фантастика для развития! Я часто использую таблицу параметров для хранения версий БД для моих плагинов ... использование phpMyAdmin для сброса старой версии БД для тестирования сценария обновления - это боль ... это сделает это намного проще !!!
EAMann
3
Вы также можете перейти на ту же страницу параметров (после входа в систему), зайдя на свой сайт / wp-admin / options.php
j08691
89

Изменить логин и ссылку на URL изображения

Проверено на: WordPress 3.0.1

Этот код позволит вам легко изменить логотип страницы входа в WordPress, а также ссылку href и текст заголовка этого логотипа.

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

РЕДАКТИРОВАТЬ: Если вы хотите использовать логотип сайта для замены логотипа входа, вы можете использовать следующее для динамического извлечения этой информации (протестировано на 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;
}
NetConstructor.com
источник
79

Включить пользовательские типы сообщений в результаты поиска.

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

По умолчанию добавляйте свои собственные типы сообщений в основной канал RSS своих сайтов.

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

Включить пользовательские типы сообщений в виджет панели администратора «Прямо сейчас»

Это будет включать ваши пользовательские типы сообщений и количество сообщений для каждого типа в виджете панели «Прямо сейчас».

// 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' );
jaredwilli
источник
Относительно последнего фрагмента к этому ответу. Это отличное дополнение, так как я добавлял их вручную для каждого типа сообщений. Единственная проблема, с которой я столкнулся, заключается в том, что он добавляет данные после записей по умолчанию «категория» и «тег». Не могли бы вы обновить свой ответ, чтобы переместить стандартные "категории" или "теги" по умолчанию вниз или удалить их, чтобы их можно было добавить вручную?
NetConstructor.com
@ NetConstructor.com Я не думаю, что понимаю ваш запрос. Если я это сделаю, то думаю, что это будет немного сложнее, и сейчас у меня нет времени, чтобы понять, как это сделать.
Джаредвилли
Включить пользовательские типы сообщений в результаты поиска - я думаю, теперь вы можете сделать это с exclude_from_searchпараметром register_post_type...
Krzysiek Dróżdż
78

Удалить уведомление об обновлении для всех пользователей, кроме пользователя ADMIN

Проверено на: Wordpress 3.0.1

Этот код гарантирует, что ни один пользователь, кроме «admin», не будет уведомлен WordPress о появлении обновлений.

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

Изменена версия, чтобы показывать уведомление об обновлении только для пользователей с правами администратора (в отличие от только пользователя '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;" ) );
       }
NetConstructor.com
источник
8
Это далеко не идеально. Он будет работать только в том случае, если логин администратора по-прежнему является «admin» по умолчанию, чего не должно быть по соображениям безопасности. Вместо этого вам следует проверить наличие определенных возможностей, чтобы люди могли видеть сообщения.
Джеркларк
1
Т.е. если (! Current_user_can ('manage_options')) {... add_filter ...} - Извините за двойной комментарий, я забыл, что при вводе ввод комментирует)
jerclarke
Вот почему я добавил комментарий к коду, где вы можете изменить имя администратора. Как бы вы улучшили / переписали это?
NetConstructor.com
Лучший способ - удалить глобальные $ user_login и get_currentuserinfo () и вместо этого использовать current_user_can в предложении if. Это только 1 строка вместо 3 и это стандартный способ. Вы можете проверить наличие определенных возможностей, которые необходимы для АКТА на сообщениях, в этом случае есть «update_core» и «update_plugins».
Джеркларк
2
итак: if (! current_user_can ('update_plugins')) {/ * УДАЛИТЬ СООБЩЕНИЯ * /}
jerclarke
72

Загрузка jQuery из Google CDN

Проверено на: 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' );
}
}

Удалите информацию о версии WordPress для безопасности

Проверено на: Wordpress 3.0.1

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

Добавить спам и удалить ссылки на комментарии на сайте

Проверено на: Wordpress 3.0.1

Это облегчает управление комментариями из внешнего интерфейса, добавляя спам и удаляя ссылки. **

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

Задержка публичной публикации в RSS-канал

Проверено на: Wordpress 3.0.1

Наконец, мне нравится откладывать публикацию в своих RSS-каналах на 10-15 минут, потому что я всегда нахожу в своем тексте хотя бы пару ошибок. Другое использование - в случае, если вы хотите, чтобы контент был эксклюзивным для вашего сайта в течение дня или недели, прежде чем распространять его среди читателей 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');
Дерек Перкинс
источник
источник на моем посту: wpengineer.com/320/publish-the-feed-later с дополнительной информацией
bueltge
1
Вы также можете просто удалить фильтр генератора:remove_action('wp_head', 'wp_generator');
Gipetto
25
Срок действия ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js истекает через один час. Всегда используйте полную информацию о версии, такую ​​как ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js , срок действия которой истекает через год.
fuxia
5
Код «Удалить информацию о версии WordPress для безопасности» на самом деле ничего не делает для повышения безопасности вашего сайта. Это даже не останавливает показ версии WP, используемой на вашем сайте.
Джозеф Скотт
1
Не правда, Джозеф, если ваша версия WordPress доступна, тогда люди могут увидеть, используете ли вы более старую версию, тем самым раскрывая ваши уязвимости. Это всегда хорошее решение удалить это из всех установок WordPress. Лично я даже не знаю, почему они ставят это во-первых, так как это проблема безопасности.
Джереми
58

Установите максимальное количество ревизий постов, чтобы избежать раздувания БД.

Проверено на: Wordpress 3.0.1

Значение по умолчанию бесконечно, это установит только запоминание последних 5 правок:

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

FWIW Существует множество отличных идей для CONSTANTS, которые можно установить на странице Кодекса Редактирование wp-config.php .

Джереми Кларк
источник
Можно ли это установить для каждого типа поста?
NetConstructor.com
Глядя на его использование в wp_save_post_revision (), кажется, нет способа различить, основываясь на типах записей. Там нет фильтра или что-то на значение, хотя, вероятно, должно быть.
Джеркларк
спасибо Джереми - кому-то еще, если вы знаете, как это сделать, пожалуйста, опубликуйте это здесь.
NetConstructor.com
1
лично я предпочитаю 10. Я знаю, что это в два раза больше, но всегда, когда мне нужна ревизия, она всегда старше 5
января
56

Инструменты профилирования Wordpress

Мне нравится добавлять инструменты профилирования в отдельный файл, который я при необходимости добавляю из 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);
?>
Денис
источник
Есть ли быстрый способ изменить это так, чтобы скрипт вызывался только тогда, когда ваш администратор И добавляет что-то к URL, чтобы показать информацию об отладке?
NetConstructor.com
1
Вот как это делается в моей теме: semiologic.com/software/sem-reloaded - /inc/debug.php включен в /functions.php или /inc/init.php (не могу вспомнить с верха моего голова).
Дени де Бернарди
52

Резкость изображения с измененным размером (только JPG)

Эта функция повышает резкость изображений jpg. Пример различия: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);
Юнсал Коркмаз
источник
намного лучше jpegs, спасибо большое! протестировано в 3.4-альфа
brasofilo
2
если вы, ребята, хотите это как плагин: wordpress.org/extend/plugins/sharpen-resized-images
Юнсал Коркмаз
Куда идет эта функция?
StevieD
@StevieD - как следует из названия, он идет внутри functions.php в вашем шаблоне. Я был бы осторожен, хотя, этой функции почти 8 лет.
timofey.com
51

Удалить стандартные WordPress мета-боксы

Проверено на: Wordpress 3.0.1

Этот код позволит вам удалить определенные мета-боксы, которые WordPress по умолчанию добавляет на экраны Add / Edit Post и Add / Edit Page по умолчанию.

// 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');
NetConstructor.com
источник
4
Согласно этому wordpress.stackexchange.com/questions/34030/… я бы не стал прятать slugdiv таким образом, но вместо этого использовал бы этот gist.github.com/1863830
@CorvanNoorloos Ваша ссылка на github не работает.
user7003859
48

Удалить фильтр «WordPress» в «WordPress»

Проверено на: Wordpress 3.0.1

В WordPress версии 3.0 был добавлен фильтр, который автоматически преобразует все экземпляры «Wordpress» (без заглавной буквы P) в «WordPress» (с заглавной буквой P) в содержимом сообщений, заголовках сообщений и тексте комментариев. Некоторые люди считают это навязчивым, мне просто нужно время от времени неправильно вводить WordPress, и этот фильтр показался мне несколько раздражающим.

// 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 );
}
EAMann
источник
отличная маленькая находка. Одна из тех вещей, которая просто удаляет другой фрагмент кода, который не нужен
NetConstructor.com
5
В WordPress 3.0.1 этот фильтр добавляется с приоритетом 11 , поэтому 11для его удаления необходимо добавить третий параметр.
Ян Фабри
46

Настройте приборную панель

add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');

function my_custom_dashboard_widgets() {
   global $wp_meta_boxes;

Удалить эти виджеты панели инструментов ...

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

Добавьте пользовательский виджет под названием «Помощь и поддержка»

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

Это контент для вашего пользовательского виджета

 function custom_dashboard_help() {
    echo '<p>Lorum ipsum delor sit amet et nunc</p>';
}
Джордж Вискомб
источник
44

Добавить пользовательские поля профиля пользователя

Поместите приведенный ниже код в свой файл functions.php, чтобы добавить настраиваемые поля профиля пользователя. Редактируйте или добавляйте строки по своему усмотрению.

Не забудьте удалить строку: return $ contactmethods; иначе это не сработает.

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

Для отображения пользовательских полей вы можете использовать один из двух методов, перечисленных ниже.

Опция 1:

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

Вариант 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>
оборота NetConstructor.com
источник
41

Настройте порядок меню администратора

проверено на: Wordpress 3.0.1

Этот код позволит вам реорганизовать порядок элементов в меню администратора. Все, что вам нужно сделать, это нажать на существующую ссылку в меню администратора и скопировать все до / wp-admin / URL. Порядок ниже представляет порядок, который будет иметь новое меню администратора.

// 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');
NetConstructor.com
источник
Действительно ли назван основной фильтр custom_menu_order? Я не мог найти один ...
Кайзер
4
@kaiser задокументировано здесь codex.wordpress.org/Plugin_API/Filter_Reference/…
Мэнни Флермонд,
40

Функция для изменения длины Exerpt

Проверено на: Wordpress 3.0.1

По умолчанию все выдержки ограничены 55 словами. Используя приведенный ниже код, вы можете переопределить эти настройки по умолчанию:

function new_excerpt_length($length) { 
    return 100;
}

add_filter('excerpt_length', 'new_excerpt_length');

В этом примере длина фрагмента изменяется на 100 слов, но вы можете использовать тот же метод, чтобы изменить его на любое значение.

Name-AK
источник
@ user402 ... это заглавные буквы или символы? Не могли бы вы опубликовать, как сделать оба?
NetConstructor.com
3
@ NetConstructor.com Эта функция (и excerpt_lengthкрючок) ограничены словами .
EAMann
Хех. Я добавил этот фильтр в ядро. :)
Дугал Кэмпбелл
38

Добавить миниатюры в список сообщений / страниц управления

Вы можете добавить это к своим функциям, чтобы отобразить в столбце «Управление / редактирование» и «Список страниц» новый столбец с предварительным просмотром миниатюр.

/****** 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 );
}
Philip
источник
Как переместить колонку в крайнее левое положение?
Богатый
38

Удалить пинг в свой блог

Проверено на: 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' );
Dan Gayle
источник
Как часто и когда WordPing пингует себя?
NetConstructor.com
У меня на самом деле есть эта проблема довольно часто. Если я ссылаюсь на внутреннюю ссылку на другой пост в моем блоге WP, я получаю трекбек или пингбек (не помню какой) от себя. Это раздражает.
Сахас Катта
Тоже самое. У меня есть блог новостей / журналов и ссылки на другие статьи довольно часто.
Стивен
35

Включить сжатие вывода GZIP

Обычно сервер должен быть настроен на автоматическое выполнение этого, но многие общие хосты этого не делают (возможно, для увеличения пропускной способности клиента)

 if(extension_loaded("zlib") && (ini_get("output_handler") != "ob_gzhandler"))
   add_action('wp', create_function('', '@ob_end_clean();@ini_set("zlib.output_compression", 1);'));
onetrickpony
источник
32

Отображение запросов к БД, затраченного времени и потребления памяти

Проверено на: 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} -->" ;
}

Затем этот код под кодом выше, который автоматически вставит код выше в нижний колонтитул вашего общедоступного веб-сайта (убедитесь, что ваша тема вызывает wp_footer):

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

Можно вызывать несколько раз.

Rarst
источник
для использования php <5.2memory_get_usage()
onetrickpony
31

Отменить регистрацию виджетов WP по умолчанию

Проверено на: 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);
bueltge
источник
Я использовал его в версии 3.1.4. Но виджеты все еще там. У кого-нибудь есть идея?
user391
Все еще работает на WP 4.5 :)
Тим Мэлоун
30

Автоматическое извлечение первого изображения из содержимого публикации

Проверено на: Wordpress 3.0.1

Этот код автоматически извлечет первое изображение, связанное с публикацией, и позволит вам отобразить / использовать его, вызвав функцию 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;
}
оборота NetConstructor.com
источник
6
Хорошо, но get_the_image также отлично справляется с этой задачей. wordpress.org/extend/plugins/get-the-image
artlung
правильно, но этот работает по-другому и исправляет различные проблемы, которые get_the_image не учитывает
NetConstructor.com
3
Чем он отличается от сценария get_the_image?
Мэтт
1
@matt - В WordPress существуют разные способы добавления изображений в сообщения, и я думаю, что скрипт get_the_image просто смотрит на один из них. Это проверяет, есть ли выбранное изображение, и использует ли оно сначала, если оно доступно, затем, я думаю, оно проверяет первое изображение, добавленное к содержимому публикации, и, если оно не найдено, оно проверяет галерею мультимедиа на предмет изображения с наивысшей сортировкой. заказ (по крайней мере, так я помню, как происходит заказ).
NetConstructor.com
Я предлагаю wordpress.org/extend/plugins/auto-post-thumbnail Автоматически генерировать миниатюру поста ( рекомендуемое миниатюру) из первого изображения в посте или любого пользовательского типа поста, только если миниатюра поста не установлена
Юнсал Коркмаз
27

Выведите, какой файл шаблона темы использует пост / страница в заголовке

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

Сократите вывод DIV по умолчанию, если ваша тема использует post_class.

если ваша тема использует что-то вроде

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

Вы можете иметь сумасшедшие длинные div в вашем источнике, которые могут выглядеть так или даже дольше:

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

Это действительно может начать загромождать ваш источник и в большинстве случаев может показаться излишним, достаточно углубиться в 3-4.

Для верхнего примера мы можем нарезать вывод так:

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

это срезает выходные данные, чтобы включить только первые 5 значений, поэтому приведенный выше пример становится:

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

Сделайте так, чтобы архивы категорий отображали все сообщения независимо от их типа: хорошо для пользовательских типов сообщений

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

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

Удалить ненужные элементы панели инструментов

Это было уже размещено, но не было полного списка пунктов. Особенно те раздражающие "входящие ссылки!"

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

Удалить переходы «Подробнее» на странице **

вместо этого вернитесь в начало страницы. Вы знаете, как, когда вы нажимаете «читать дальше», он переходит на место на странице, что может раздражать, это заставляет его просто загружать страницу нормально, без прыжков!

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

Ограничьте элементы меню ADMIN на основе имени пользователя , замените имя пользователя фактическим именем пользователя.

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

// в качестве альтернативы вы можете использовать if ($ current_user-> user_login! = 'admin') вместо этого, возможно, более полезно

Стиль облака тегов

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

Полный список опций здесь (их много!) Http://codex.wordpress.org/Function_Reference/wp_tag_cloud

Изменить таймер обновления виджета RSS по умолчанию

(по умолчанию я забываю 6 или 12 часов (1800 = 30 минут).

add_filter( 'wp_feed_cache_transient_lifetime', create_function('$fixrss', 'return 1800;') );
Wyck
источник
Не могли бы вы разделить каждый из них на отдельные ответы в течение следующих нескольких недель. Я собирался сделать это для вас, но не хотел, чтобы это выглядело так, будто я принимаю кредит на ваши ответы. В любом случае - я стараюсь держать это организованным, чтобы пользователи могли легко найти информацию, которую они ищут. Заранее спасибо
NetConstructor.com
Я просто использовал код «Ограничить пункты меню ADMIN на основе имени пользователя, замените имя пользователя на фактическое имя пользователя», что замечательно, но не могли бы вы обновить код, чтобы также показать, как это можно сделать для определенной «роли пользователя». Я думаю, что это было бы очень полезно!
NetConstructor.com
Извините NetConstructor Я только что увидел ваш комментарий сейчас. Для роли пользователя я бы использовал "current_user_can". У меня нет времени, чтобы проверить это, но когда я это сделаю, я добавлю это.
Wyck
значение по умолчанию для wp_feed_cache_transient_lifetime составляет 43200 (12 часов)
brasofilo
26

Удалить уведомление об обновлении плагинов ТОЛЬКО для НЕАКТИВНЫХ плагинов

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
оборота NetConstructor.com
источник
1
Это не обязательно хорошая идея - неактивный плагин все еще присутствует в файловой системе, и небезопасный плагин все еще можно использовать для взлома сайта. Плагины всегда должны быть в актуальном состоянии.
Тим Мэлоун
25

Удалите лишнюю информацию и HTML внутри <head>тега

// 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'
    ) );
}
Andrew Ryno
источник
23

Включить отладку и ведение журнала ошибок для использования на живых сайтах

Это фрагмент кода, который я написал для использования констант WP_DEBUG, которые по умолчанию обычно отключены. Ну, я создал способ не только включить WP_DEBUG, чтобы вы могли использовать его на действующем сайте без отрицательных побочных эффектов, но я также использовал другие константы отладки для принудительного отображения ошибок и для создания файла журнала ошибки и уведомления в каталоге / wp-content.

Удалите этот код в файл wp-config.php (ПОСЛЕ ТОГО, КАК ВЫ СОХРАНИТЕ РЕЗЕРВНОЕ КОПИРОВАНИЕ ПРОСТО В СЛУЧАЕ), и затем вы можете передать параметры? Debug = 1, 2 или 3 в конце любого URL на вашем сайте.

? debug = 1 = показывает все ошибки / уведомления? debug = 2 = заставляет их отображаться? debug = 3 = создает файл debug.log обо всех ошибках в / wp-content dir.

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

Я более подробно расскажу о гостевом посте, который я написал для Comluv, если вам интересно, здесь: http://comluv.com/dev/enable-debugging-and-logging-for-live-site-usage/

Я все еще работаю над тем, чтобы сделать это либо паролем, либо, желательно, каким-то образом заставить его работать с if (current_user_can ('manage_themes') и is_logged_in ().

Но здесь все становится сложнее.

jaredwilli
источник
Мы используем что-то похожее для настройки live, staging и dev деталей подключения к базе данных.
Том
20

Автоматически добавлять динамические заголовки на общедоступные страницы

Проверено на: Wordpress 3.0.1

Используя приведенный ниже код, вы автоматически создадите динамические заголовки страниц на основе публично просматриваемых страниц / сообщений.

/* 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);
}
}
Chris_O
источник
20

Новые роли и возможности - запускай только один раз!

Я держу это под рукой, это правильный способ сделать их без плагина. Они устанавливают одно поле (prefix_user_roles) в базе данных опций, и вам не нужен плагин для их установки. Обратитесь к странице Кодекса за списком доступных возможностей и описаниями того, что они делают. Вам нужно только раскомментировать один из этих блоков, загрузить любую страницу и затем прокомментировать их снова! Здесь я создаю роль, которая обладает необходимыми мне возможностями:

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

Иногда удобно добавлять / удалять из существующей роли, а не удалять и повторно добавлять ее. Опять же, вам нужно только раскомментировать, перезагрузить страницу и затем прокомментировать ее. Это правильно сохранит роль / возможность в таблице параметров. (Это позволяет вам, разработчику, контролировать их и устраняет накладные расходы на громоздкие плагины, которые делают то же самое.) Здесь я изменяю роль автора, чтобы удалить их опубликованные посты (по умолчанию), но предоставил им возможность редактировать их опубликованные посты (что по умолчанию невозможно для этой роли) - используя * add_cap * или * remove_cap *.

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

Я храню электронную таблицу с сеткой со страницы Кодекса для сайтов, которые изменяют этот способ, поэтому я могу помнить, как все устроено, хотя оставленный закомментированный код в вашем файле functions.php будет работать. Не оставляйте эти примеры без комментариев, иначе они будут записываться в базу данных при каждой загрузке страницы!

tomcat23
источник
Функции, о которых я упоминал выше, записываются в поле базы данных опций. Комментирование и раскомментирование их - это путь. Существуют плагины для пользовательских ролей, но если вы используете функции, упомянутые выше, вы не можете оставить эти функции работающими, и вам НЕ нужно устанавливать их более одного раза или устанавливать их в зависимости от того, имеет ли конкретный пользователь доступ к чему-либо. Если вы хотите, назначьте этому пользователю определенную уникальную роль. И обратитесь к кодексу, все, что я пишу выше, на 100% правильно, если вы делаете это без плагина. Практически в каждом случае вам нужно установить роли пользователя только один раз.
tomcat23
@ tomcat23: Чтобы проиллюстрировать это, я обернул его в функцию, чтобы добавить роль только тогда, когда она еще не существует. Еще одно примечание: я полагаю, было бы проще поместить роль где-то в иерархии ролей, получив заглавные буквы из какой-либо встроенной роли, а затем добавить / удалить возможности из встроенной роли. Сделал бы его более понятным и простым для запоминания, если его заглавные буквы расположены где-то между бывшими. админ и редактор. - Надеюсь, ты не против, что я отредактировал твой ответ. Если вы делаете, пожалуйста, роль его обратно. :)
Кайзер
1
@ tomcat23 - Вода под мостом в этой точке. Все, что я хочу сказать, это то, что я не заинтересован в том, чтобы обвинять, просто в том, чтобы каждый мир продвигался вперед. :)
MikeSchinkel
2
@MikeSchinkel Да, вы правы. @kaiser Мои извинения, если я причинил вам оскорбление.
tomcat23
1
@MikeSchinkel: спасибо, что вернули мир. @ Tomcat23: Нет, вы этого не сделали. Я могу иметь дело с такой критикой. Мои извинения тоже.
Кайзер
19

Wordpress Custom Admin Нижний колонтитул

// настроить текст нижнего колонтитула администратора
function custom_admin_footer () {
        echo «добавьте свой собственный текст нижнего колонтитула и HTML здесь»;
} 
add_filter ('admin_footer_text', 'custom_admin_footer');

Я использую это для клиентских сайтов в качестве простой ссылки, чтобы связаться со мной как с разработчиком.

Чак Рейнольдс
источник
19

Включить шорткоды в виджетах

// shortcode in widgets
if ( !is_admin() ){
    add_filter('widget_text', 'do_shortcode', 11);
}
CommentLuv
источник
18

Функция для отключения RSS-каналов

Проверено на: Wordpress 3.0.1

Вы можете отключить RSS-каналы, если вы хотите поддерживать свой веб-сайт на Wordpress как статический.

Вы можете использовать эту функцию:

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);
Name-AK
источник
Источник: bueltge.de/wordpress-feeds-deaktivieren/794 (Фрэнк Бьюлтдж)
fuxia
Спасибо Тошо! источник также доступен на английском языке wpengineer.com/287/disable-wordpress-feed
bueltge
16

Измените сообщение «Привет» на «Добро пожаловать»

С помощью этой функции вы можете настроить сообщение «Привет» в правом верхнем углу вашей области администратора.
Эта функция использует JQuery для изменения сообщения «Привет» на «Добро пожаловать».

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

Версия PHP с использованием 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', 'Welcome', $translated);

    return $translated;
}
Philip
источник
3
Разве это не может быть уже отредактировано на стороне PHP, чтобы оно вообще не получало вывод?
hakre
Он отлично работает здесь в версиях 3.0+, но почему не в старых версиях? Проверьте, не отвечает ли за это какой-либо другой используемый вами плагин. Текст здесь заменен на JQuery, может быть плагин JQuery?
Филипп