Functions.php - полезные функции

Тема в разделе "Wordpress", создана пользователем Apathetic, 25 мар 2013.

  1. Apathetic

    Apathetic

    Регистрация:
    21 мар 2013
    Сообщения:
    43
    Симпатии:
    11
    Тут уже есть ветка, посвященная минимальному набору плагинов, и я хочу создать тему, посвященную файлу functions.php. Есть ли у вас какие-то функции, которые вы используете каждый раз при создании новой темы? Ну и вообще, какие полезные штуки можно делать с помощью этого файла?

    Написал небольшую функцию для вывода любых данных любой записи/поста в любом месте. Она действительно очень простая, но заметно упрощает жизнь, когда нужно, к примеру, собрать главную страницу из десятка больших и не очень блоков.
    PHP:
    function main_content($page_ID$field$custom false){
        if (
    $custom == false) {
            
    $main_content get_post$page_IDARRAY_A );
            
    $text $main_content['post_' $field];
        } elseif (
    $custom == true) {
            
    $text get_post_meta$page_ID$fieldtrue );
        }
        echo 
    $text;
    }
    Соответственно, чтобы вывести, например, тело страницы с ID 5:
    PHP:
    <?php main_content('287''content'); ?>
    Кроме того, добавил шорткод, чтобы использовать эту функцию непосредственно в записях:
    PHP:
    function main_content_shortcode$atts$content null ){
        
    extract(shortcode_atts( array(
            
    'id' => 1,
            
    'field' => 'title',
            
    'custom' => false
        
    ), $atts));
        
    main_content($id$field$custom);
    }
    add_shortcode('content''main_content_shortcode');
    Шорткод, например, такой: [content id="15" field="content"]
    Нетрудно заметить, что функция и шорткод поддерживают так же и произвольные поля - нужно только указать его название и передать функции true.
     
    SergAgent нравится это.
  2. Иванушка

    Иванушка

    Регистрация:
    24 мар 2013
    Сообщения:
    16
    Симпатии:
    2
    Пытался так сделать, но почему-то сайт вылетал полностью. Причина может быть в нестандартном шаблоне?
     
  3. Apathetic

    Apathetic

    Регистрация:
    21 мар 2013
    Сообщения:
    43
    Симпатии:
    11
    Да нет, тут никаких нестандартных функций не используется, да и синтаксических ошибок вроде тоже нет - у меня именно в таком виде используется.
     
    SergAgent нравится это.
  4. Apathetic

    Apathetic

    Регистрация:
    21 мар 2013
    Сообщения:
    43
    Симпатии:
    11
    Полезная функция для шаблонов, написанных на html5: исправляет некорректную работу встроенного парсера с новыми тегами, такими, как article, footer и т.д.

    PHP:
    /* -----------------------------
    MODIFIED WPAUTOP - Allow HTML5 block elements in wordpress posts
    ----------------------------- */
     
    function html5autop($pee$br 1) {
      if ( 
    trim($pee) === '' )
          return 
    '';
      
    $pee $pee "\n"// just to make things a little easier, pad the end
      
    $pee preg_replace('|<br />\s*<br />|'"\n\n"$pee);
      
    // Space things out a little
    // *insertion* of section|article|aside|header|footer|hgroup|figure|details|figcaption|summary
      
    $allblocks '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr|fieldset|legend|section|article|aside|header|footer|hgroup|figure|details|figcaption|summary)';
      
    $pee preg_replace('!(<' $allblocks '[^>]*>)!'"\n$1"$pee);
      
    $pee preg_replace('!(</' $allblocks '>)!'"$1\n\n"$pee);
      
    $pee str_replace(array("\r\n""\r"), "\n"$pee); // cross-platform newlines
      
    if ( strpos($pee'<object') !== false ) {
          
    $pee preg_replace('|\s*<param([^>]*)>\s*|'"<param$1>"$pee); // no pee inside object/embed
          
    $pee preg_replace('|\s*</embed>\s*|''</embed>'$pee);
      }
      
    $pee preg_replace("/\n\n+/""\n\n"$pee); // take care of duplicates
      // make paragraphs, including one at the end
      
    $pees preg_split('/\n\s*\n/'$pee, -1PREG_SPLIT_NO_EMPTY);
      
    $pee '';
      foreach ( 
    $pees as $tinkle )
          
    $pee .= '<p>' trim($tinkle"\n") . "</p>\n";
      
    $pee preg_replace('|<p>\s*</p>|'''$pee); // under certain strange conditions it could create a P of entirely whitespace
    // *insertion* of section|article|aside
      
    $pee preg_replace('!<p>([^<]+)</(div|address|form|section|article|aside)>!'"<p>$1</p></$2>"$pee);
      
    $pee preg_replace('!<p>\s*(</?' $allblocks '[^>]*>)\s*</p>!'"$1"$pee); // don't pee all over a tag
      
    $pee preg_replace("|<p>(<li.+?)</p>|""$1"$pee); // problem with nested lists
      
    $pee preg_replace('|<p><blockquote([^>]*)>|i'"<blockquote$1><p>"$pee);
      
    $pee str_replace('</blockquote></p>''</p></blockquote>'$pee);
      
    $pee preg_replace('!<p>\s*(</?' $allblocks '[^>]*>)!'"$1"$pee);
      
    $pee preg_replace('!(</?' $allblocks '[^>]*>)\s*</p>!'"$1"$pee);
      if (
    $br) {
          
    $pee preg_replace_callback('/<(script|style).*?<\/\\1>/s'create_function('$matches''return str_replace("\n", "<WPPreserveNewline />", $matches[0]);'), $pee);
          
    $pee preg_replace('|(?<!<br />)\s*\n|'"<br />\n"$pee); // optionally make line breaks
          
    $pee str_replace('<WPPreserveNewline />'"\n"$pee);
      }
      
    $pee preg_replace('!(</?' $allblocks '[^>]*>)\s*<br />!'"$1"$pee);
    // *insertion* of img|figcaption|summary
      
    $pee preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol|img|figcaption|summary)[^>]*>)!''$1'$pee);
      if (
    strpos($pee'<pre') !== false)
          
    $pee preg_replace_callback('!(<pre[^>]*>)(.*?)</pre>!is''clean_pre'$pee );
      
    $pee preg_replace"|\n</p>$|"'</p>'$pee );
     
      return 
    $pee;
    }
     
    // remove the original wpautop function
    remove_filter('the_excerpt''wpautop');
    remove_filter('the_content''wpautop');
     
    // add our new html5autop function
    add_filter('the_excerpt''html5autop');
    add_filter('the_content''html5autop');
    --- добавлено: Mar 25, 2013 3:39 PM ---
    Можете выложить сюда свой файл functions.php? Я могу посмотреть, в чем дело.
     
    SergAgent нравится это.
  5. Apathetic

    Apathetic

    Регистрация:
    21 мар 2013
    Сообщения:
    43
    Симпатии:
    11
    Для тех, кому надоело постоянно логиниться в админ-панель. Эти функции увеличивают срок жизни куки и автоматически ставят галочку "запомнить меня" при входе.

    PHP:
    function wp_ozh_arm_init() {
        
    add_filter'login_footer',          'wp_ozh_arm_add_js' );
        
    add_filter'auth_cookie_expiration''wp_ozh_arm_cookie' );
    }
    add_action'init''wp_ozh_arm_init' );
     
    function 
    wp_ozh_arm_add_js() {
        echo <<<JS
        <script>
        document.getElementById('rememberme').checked = true;
        document.getElementById('user_login').focus();
        </script>
    JS;
    }
     
    function 
    wp_ozh_arm_cookie() {
        return 
    31536000;
    }
     
    SergAgent нравится это.
  6. Xelloss

    Xelloss

    Регистрация:
    25 май 2013
    Сообщения:
    10
    Симпатии:
    0
    А версия движка может влиять на работу этих функций?
     
  7. Luckas

    Luckas

    Регистрация:
    21 ноя 2012
    Сообщения:
    233
    Симпатии:
    57
    PHP:
    // Отключение обновления темы
    remove_action('load-update-core.php','wp_update_themes');
    add_filter('pre_site_transient_update_themes',create_function('$a'"return null;"));
    wp_clear_scheduled_hook('wp_update_themes');
    // Отключение обновления плагинов
    remove_action'load-plugins.php''wp_update_plugins' );
    remove_action'load-update.php''wp_update_plugins' );
    remove_action'admin_init''_maybe_update_plugins' );
    remove_action'wp_update_plugins''wp_update_plugins' );
    add_filter'pre_transient_update_plugins'create_function'$a',
    "return null;" ) );
    // Отключение обновления движка
    remove_action'wp_version_check''wp_version_check' );
    remove_action'admin_init''_maybe_update_core' );
    add_filter'pre_transient_update_core'create_function'$a',
    "return null;" ) );
    // Убираем meta generator
    remove_action('wp_head''wp_generator');
    // Отключаем RSS
    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);
     
    SergAgent нравится это.
  8. Luckas

    Luckas

    Регистрация:
    21 ноя 2012
    Сообщения:
    233
    Симпатии:
    57
    PHP:
    //замена лого при логине
    function my_login_logo(){

    echo 
    '

    <style type="text/css">
    #login h1 a { background: url(/img/login-logo.png) no-repeat 0 0 !important; }
    </style>'
    ;

    }
    add_action('login_head''my_login_logo');

    add_filter'login_headerurl'create_function('''return get_home_url();') );

    add_filter'login_headertitle'create_function('''return "Ваше описание";') );
    /img/login-logo.png - указываем свой путь к картинке. И не забывем заменить headertitle
    --- Добавлено, 7 сен 2013 ---
    PHP:
    //Убрать ссылки изображений из постов

    add_filter'the_content''attachment_image_link_remove_filter' );
    function 
    attachment_image_link_remove_filter$content ) {
    $content =
    preg_replace(
    array(
    '{<a(.*?)(wp-att|wp-content/uploads)[^>]*><img}',
    '{ wp-image-[0-9]*" /></a>}'),
    array(
    '<img','" />'),
    $content
    );
    return 
    $content;
    }
     
    SergAgent нравится это.
  9. Luckas

    Luckas

    Регистрация:
    21 ноя 2012
    Сообщения:
    233
    Симпатии:
    57
    Убирай функцию wptexturize с хуков, обрабатывающих вывод
    Т.е.
    PHP:
    remove_filter('the_content''wptexturize');
    remove_filter('the_title''wptexturize');
    remove_filter('comment_text''wptexturize');
    remove_filter('the_excerpt''wptexturize');
    --- Добавлено, 11 сен 2013 ---
    Правда если хочешь отменить только замену кавычек, а остальных символов нет, можешь вот такой фильтр накинуть
    PHP:
    add_filter'the_content''back_quotes' );
    function 
    back_quotes$text ){
        return 
    str_replace( array( '&#187;''&#171;''&#8216;''&#8217;' ), array( '"''"''\'''\'' ),  $text);
    }
     
    Последнее редактирование: 11 сен 2013
  10. Luckas

    Luckas

    Регистрация:
    21 ноя 2012
    Сообщения:
    233
    Симпатии:
    57
    Подключаем вложенные комментарии
    PHP:
    enable threaded comments
    function enable_threaded_comments(){
    if (!
    is_admin()) {
    if (
    is_singular() AND comments_open() AND (get_option('thread_comments') == 1))
    wp_enqueue_script('comment-reply');
    }
    }
    add_action('get_header''enable_threaded_comments');