[Инфо] Wordpress: плюшки файла functions.PHP ))

Тема в разделе "Wordpress", создана пользователем Красавчег, 10 окт 2012.

Информация :
Все пользователи Nulled-а обязаны ознакомиться с основными правилами форума!
Правила: Правила форума
Правила раздела: ОБЩИЕ СВЕДЕНИЯ | Правила раздела | Правила оформления [​IMG]
Полезное: Раскодирование шаблонов | Шорткоды | Поиск плагинов | [​IMG] Складчины
Плюшки: functions.PHP - часть 1 | часть 2
Разделы WP: Шаблоны | CodeCanyon
Статус темы:
Закрыта.
Модераторы: ponoroshca
  1. areshin71

    areshin71 Постоялец

    Регистр.:
    19 сен 2015
    Сообщения:
    79
    Симпатии:
    26
    Убрать артикул только с карточек товара, оставив артикул в админке.
    function sv_remove_product_page_skus( $enabled ) {
    if ( ! is_admin() && is_product() ) {
    return false;
    }
    return $enabled;
    }
    add_filter( 'wc_product_sku_enabled', 'sv_remove_product_page_skus' );

    Добавление второго поля для описания на категории товаров (в итоге получится один текстовый блок над товарами и один под ними).
    add_action( 'product_cat_edit_form_fields', 'wpm_taxonomy_edit_meta_field', 10, 2 );

    function wpm_taxonomy_edit_meta_field($term) {
    $t_id = $term->term_id;
    $term_meta = get_option( "taxonomy_$t_id" );
    $content = $term_meta['custom_term_meta'] ? wp_kses_post( $term_meta['custom_term_meta'] ) : '';
    $settings = array( 'textarea_name' => 'term_meta[custom_term_meta]' );
    ?>
    <tr class="form-field">
    <th scope="row" valign="top"><label for="term_meta[custom_term_meta]">Второе описание или банеры внизу для категории</label></th>
    <td>
    <?php wp_editor( $content, 'product_cat_details', $settings ); ?>

    </td>
    </tr>
    <?php
    }

    add_action( 'edited_product_cat', 'save_taxonomy_custom_meta', 10, 2 );
    add_action( 'create_product_cat', 'save_taxonomy_custom_meta', 10, 2 );

    function save_taxonomy_custom_meta( $term_id ) {
    if ( isset( $_POST['term_meta'] ) ) {
    $t_id = $term_id;
    $term_meta = get_option( "taxonomy_$t_id" );
    $cat_keys = array_keys( $_POST['term_meta'] );
    foreach ( $cat_keys as $key ) {
    if ( isset ( $_POST['term_meta'][$key] ) ) {
    $term_meta[$key] = wp_kses_post( stripslashes($_POST['term_meta'][$key]) );
    }
    }

    update_option( "taxonomy_$t_id", $term_meta );
    }
    }

    add_action( 'woocommerce_after_shop_loop', 'wpm_product_cat_archive_add_meta' );

    function wpm_product_cat_archive_add_meta() {
    $t_id = get_queried_object()->term_id;
    $term_meta = get_option( "taxonomy_$t_id" );
    $term_meta_content = $term_meta['custom_term_meta'];
    if ( $term_meta_content != '' ) {
    echo '<div class="woo-sc-box normal rounded full">';
    echo apply_filters( 'the_content', $term_meta_content );
    echo '</div>';
    }
    }

    Вывести цену вариативного товара «от» вместо диапазона цен.
    add_filter( 'woocommerce_variable_sale_price_html', 'wc_wc20_variation_price_format', 10, 2 );
    add_filter( 'woocommerce_variable_price_html', 'wc_wc20_variation_price_format', 10, 2 );
    function wc_wc20_variation_price_format( $price, $product ) {

    // Основная цена
    $prices = array( $product->get_variation_price( 'min', true ), $product->get_variation_price( 'max', true ) );
    $price = $prices[0] !== $prices[1] ? sprintf( __( 'от %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );
    // Цена со скидкой
    $prices = array( $product->get_variation_regular_price( 'min', true ), $product->get_variation_regular_price( 'max', true ) );
    sort( $prices );
    $saleprice = $prices[0] !== $prices[1] ? sprintf( __( 'от %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );
    if ( $price !== $saleprice ) {
    $price = '<del>' . $saleprice . '</del> <ins>' . $price . '</ins>';
    }
    return $price;
    }
     
    нарада нравится это.
  2. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    29
    Симпатии:
    6
    PHP:
    //проверка доступности youtube видео

    function yt_exists($videoID) {
        
    $theURL "http://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=$videoID&format=json";
        
    $headers get_headers($theURL);

        if (
    substr($headers[0], 93) !== "404") {
            return 
    true;
        } else {
            return 
    false;
        }
    }
    далее уже на странице вывода видео вызывается функция yt_exist с указанием id видео (работает для ютуб)
     
  3. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    29
    Симпатии:
    6
    PHP:
    //изменение стандартной картинки плейсхолдера для вукомерц

    add_filter('woocommerce_placeholder_img_src''custom_woocommerce_placeholder_img_src');

    function 
    custom_woocommerce_placeholder_img_src$src ) {
    $upload_dir wp_upload_dir();
    $uploads untrailingslashit$upload_dir['baseurl'] );
    $src $uploads '/image.jpg';

    return 
    $src;
    }

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

    PHP:
    //отображение ссылок на атрибуты на страницах товаров на вкладке "свойства"

    add_filter ('woocommerce_attribute''link_attributes'103);
    function 
    link_attributes($attributes_string$attribute$terms) {
    global 
    $post;
    $taxonomy get_taxonomy$attribute['name'] );
      if ( 
    $taxonomy && ! is_wp_error$taxonomy ) ) {
          
    $attribute_string '';
          
    $terms wp_get_post_terms$post->ID$taxonomy->name );
          if ( !empty( 
    $terms ) ) {
            foreach ( 
    $terms as $term ) {
              if (
    strlen($attribute_string) > 0) {
                
    $attribute_string .= ', ';
              }
              
    $archive_link get_term_link$term->slug$attribute['name'] );
              
    $attribute_string .= '<a href="' $archive_link '">'$term->name '</a>';
            }
          }
        }
        return 
    '<p>'.$attribute_string.'</p>';
      }

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

    PHP:
    // Изменение ссылки атрибутов, удаление префикса 'pa_'
    add_action('woocommerce_register_taxonomy''razorfrog_woo_register_taxonomy');
    function 
    razorfrog_woo_register_taxonomy() {
        global 
    $razorfrog_woo_attribute_labels;
        
    $razorfrog_woo_attributes_labels = array();

        if ( 
    $attribute_taxonomies wc_get_attribute_taxonomies() ) {
            foreach ( 
    $attribute_taxonomies as $tax ) {
                if ( 
    $name wc_attribute_taxonomy_name$tax->attribute_name ) ) {
                    
    $razorfrog_woo_attribute_labels$tax->attribute_label ] = $tax->attribute_name;
                    
    add_filter('woocommerce_taxonomy_args_'.$name'razorfrog_woo_taxonomy_args');
                }
            }
        }
    }

    function 
    razorfrog_woo_taxonomy_args($taxonomy_data) {
        global 
    $razorfrog_woo_attribute_labels;
       
        if (isset(
    $taxonomy_data['rewrite']) && is_array($taxonomy_data['rewrite']) && empty($taxonomy_data['rewrite']['slug'])) {
            
    $taxonomy_data['rewrite']['slug'] = $razorfrog_woo_attribute_labels$taxonomy_data['labels']['name'] ];
        }  
        return 
    $taxonomy_data;
    }
     
  4. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    29
    Симпатии:
    6
    и еще один блок для хлебных крошек, если используется плагин seo_yoast и через него выводятся хлебные крошки

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

    PHP:
    //смена заголовка или же URL в хлебных крошках
    add_filter'wpseo_breadcrumb_output''custom_wpseo_breadcrumb_output' );
    function 
    custom_wpseo_breadcrumb_output$output ){
        if( 
    is_page() ){
            
    $from '<a href="http://site.ru" rel="v:url" property="v:title">Title</a>';
            
    $to     '<a href="http://site.ru" rel="v:url" property="v:title">Title_new</a>';
            
    $output str_replace$from$to$output );
        }
        return 
    $output;
    }

    //добавление нового пункта меню в хлебные крошки
    add_filter'wpseo_breadcrumb_links''wpseo_breadcrumbs_output_post_single' );
    function 
    wpseo_breadcrumbs_output_post_single$links ) {
        global 
    $post;

        if ( 
    is_singular('post')) { // условие, если к примеру, нужно добавить ссылку только на страницах постов
            
    $breadcrumb[] = array(
                
    'url' => 'site.ru'//урл адрес страницы
                
    'text' => 'Title'//анкор ссылки
            
    );

            
    array_splice$links10$breadcrumb ); //указываем то, куда добавляем ссылку, здесь добавляется после первоо элемента
        
    }

        return 
    $links;
    }
     
  5. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    29
    Симпатии:
    6
    удаление авторедактирования кода, порой при переключении вкладок "текст" и "визуально" удаляет нужные тэги, чтоб избежать код ниже

    PHP:

    function change_mce_options($initArray) {

        
    $initArray['verify_html'] = false;
        
    $initArray['cleanup_on_startup'] = false;
        
    $initArray['cleanup'] = false;
        
    $initArray['forced_root_block'] = false;
        
    $initArray['validate_children'] = false;
        
    $initArray['remove_redundant_brs'] = false;
        
    $initArray['remove_linebreaks'] = false;
        
    $initArray['force_p_newlines'] = false;
        
    $initArray['force_br_newlines'] = false;
        
    $initArray['fix_table_elements'] = false;

        
    $initArray['entities'] = '160,nbsp,38,amp,60,lt,62,gt';

        return 
    $initArray;
    }

    add_filter('tiny_mce_before_init''change_mce_options');

    настройка поиска

    PHP:

    function searchfilter($query) {
      if (
    $query->is_search) {
          
    $query->set('post_type',array('product','post','page')); //здесь устанавливаются типы постов по которым осуществляется поиск, можно убрать post и page, чтоб поиск был только по товарам
         
    }
      return 
    $query;
    }
    add_filter('pre_get_posts','searchfilter');

     
    mischael1 нравится это.
  6. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    29
    Симпатии:
    6
    //Добавление пункта в админ-панель на странице товаров выбора продуктов "в наличии" и "нет в наличии"
    //оч удобно

    PHP:

    add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );

    function wpse45436_admin_posts_filter_restrict_manage_posts(){

        $type = 'product';
        if (isset($_GET['post_type'])) {
            $type = $_GET['post_type'];
        }

        //only add filter to post type you want
        if ('product' == $type){
            //change this to the list of values you want to show
            //in 'label' => 'value' format
            $values = array(
              'В наличии'     => 'instock',
                'Нет в наличии'   => 'outofstock', 
            );
            ?>
            <select name="Stock">
            <option value="">Все товары</option>
            <?php
                $current_v 
    = isset($_GET['Stock'])? $_GET['Stock']:'';
                foreach (
    $values as $label => $value) {
                    
    printf
                        
    (
                            
    '<option value="%s"%s>%s</option>',
                            
    $value,
                            
    $value == $current_v' selected="selected"':'',
                            
    $label
                        
    );
                    }
            
    ?>
            </select>
            <?php
        
    }
    }

    add_filter'parse_query''wpse45436_posts_filter' );

    function 
    wpse45436_posts_filter$query ){
        global 
    $pagenow;
        
    $type 'product';
        if (isset(
    $_GET['post_type'])) {
            
    $type $_GET['post_type'];
        }
        if ( 
    'product' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['Stock']) && $_GET['Stock'] != '') {
            
    $query->query_vars['meta_key'] = '_stock_status';
            
    $query->query_vars['meta_value'] = $_GET['Stock'];
        }
    }

     
  7. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    29
    Симпатии:
    6
    Создание дополнительных колонок в админке для нужных нам типов записей

    везде вместо <post_type> нужно указать тип поста, на админ-странице которого необходимо вывести доп колонку

    PHP:

    // создаем новую колонку
    add_filter('manage_edit-<post_type>_columns''add_new_column'4);
    function 
    add_new_column$columns ){
      
    $num 2// после какой по счету колонки вставлять новые

      
    $new_columns = array(
        
    'column_name'    => 'Новая колонка',
      );

      return 
    array_slice$columns0$num ) + $new_columns array_slice$columns$num );
    }

    // заполняем колонку данными
    add_filter('manage_<post_type>_posts_custom_column''fill_new_column'52);
    function 
    fill_new_column($column_name$post_id) {
      if( 
    $column_name === 'column_name' ){
       
    //далее необходимо инициализировать поле, ниже я беру поле созданное плагином advanced custom fields и проверяю его значения
        
    if (get_field('field_name') == 'yes') {
          echo 
    "Да";
        } else {
          echo 
    "Нет";
        }
      }
    }

    // подправим ширину колонки через css
    add_action('admin_head''add_new_column_css');
    function 
    add_new_column_css(){
      echo 
    '<style type="text/css">.column-column_name,{width:15%;}</style>';
    }

    // добавляем возможность сортировать колонку
    add_filter('manage_edit-<post_type>_sortable_columns''add_sortable_new_column');
    function 
    add_sortable_new_column($sortable_columns){
    //добавляем ниже в массив новое поле + те поля, по которым уже есть сортировка на странице в админке
      
    $sortable_columns = array(
        
    'column_name' => 'column_name_sort',
        
    'date' => 'date',
        
    'title'  => 'title',
        );

      return 
    $sortable_columns;
    }

    // изменяем запрос при сортировке колонки
    add_filter('pre_get_posts''add_new_column_request');
    function 
    add_new_column_request$object ){
      if( (
    $object->get('orderby') != 'column_name_sort' ) ) {
          return;
      }
      if ( 
    $object->get('orderby') == 'column_name_sort' ) {
        
    $object->set('meta_key''field_name');
        
    $object->set('orderby''meta_value');  

      }
    }

     
  8. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    29
    Симпатии:
    6
    увеличение длительности залогиненности в админке вордпресса, чтоб не выкидывало при неактивности и можно было дольше заходить на сайт)

    PHP:

    add_filter
    'auth_cookie_expiration''stay_logged_in_for_1_year' );
    function 
    stay_logged_in_for_1_year$expire ) {
          return 
    31556926// 1 год в секундах
    }

    замена текста приветствия в админке, можно написать что-нибудь типа "Как у вас дела?" или "Пользователь залогиненен под ..."

    PHP:
    function replace_howdy$wp_admin_bar ) { 
             
    $my_account=$wp_admin_bar->get_node('my-account');
             
    $newtitle str_replace'Howdy,''<новый текст>'$my_account->title );     
             
    $wp_admin_bar->add_node( array(
                                    
    'id' => 'my-account',
                                    
    'title' => $newtitle,     ) ); 
    }

    add_filter'admin_bar_menu''replace_howdy',25 );

     
  9. WebWolfRus

    WebWolfRus Постоялец

    Регистр.:
    4 июн 2016
    Сообщения:
    54
    Симпатии:
    16
    Очень долго искать код который скроет записи, изображения и комментарии от других аккаунтов пользователей.

    Код:
    //Скрываем изображения от других пользователей
    add_filter( 'posts_where', 'hide_attachments_wpquery_where' );
    function hide_attachments_wpquery_where( $where ){
        global $current_user;
        if( !current_user_can( 'manage_options' ) ) {
            if( is_user_logged_in() ){
                if( isset( $_POST['action'] ) ){
                    // library query
                    if( $_POST['action'] == 'query-attachments' ){
                        $where .= ' AND post_author='.$current_user->data->ID;
                    }
                }
            }
        }
        return $where;
    }
    
    
    //Скрываем посты от других пользователей.
    function hide_posts_media_by_other($query) {
        global $pagenow;
        if( ( 'edit.php' != $pagenow && 'upload.php' != $pagenow   ) || !$query->is_admin ){
            return $query;
        }
        if( !current_user_can( 'manage_options' ) ) {
            global $user_ID;
            $query->set('author', $user_ID );
        }
        return $query;
    }
    add_filter('pre_get_posts', 'hide_posts_media_by_other');
    
    //Скрываем комментарии от других пользователей.
    function true_get_comments_by_user_posts($clauses) {
        if (is_admin()) {
            global $wpdb, $user_ID;
            $clauses['join'] = ", {$wpdb->prefix}posts";
            $clauses['where'] .= " AND {$wpdb->prefix}posts.post_author = ".$user_ID." AND {$wpdb->prefix}comments.comment_post_ID = {$wpdb->prefix}posts.ID";
        }
        return $clauses;
    }
     // включаем фильтр, если у пользователя нет прав на редактирование чужих постов, то есть он либо автор, либо участник, либо подписчик
    if(!current_user_can('edit_others_posts')) {add_filter('comments_clauses', 'true_get_comments_by_user_posts');}
    
    
     
  10. ezh88

    ezh88 Постоялец

    Регистр.:
    26 янв 2016
    Сообщения:
    55
    Симпатии:
    14
    А можно в плагин еще добавить удаление rel_canonical? И для удаления canonical Yoast SEO?

    remove_action('wp_head', 'rel_canonical');

    Код:
    // Remove Canonical Link Added By Yoast WordPress SEO Plugin
    function at_remove_dup_canonical_link() {
            return false;
    }
    add_filter( 'wpseo_canonical', 'at_remove_dup_canonical_link' );
    
        remove_action('wp_head', 'wp_generator'); // Убирает вывод используемого движка и его версии
        remove_action('wp_head', 'rel_canonical'); // Убирает канонические линки
        remove_action('wp_head', 'wp_shortlink_wp_head'); // Убирает короткую ссылку к текущей странице
        remove_action('wp_head', 'wlwmanifest_link'); // Используется блог-клиентами, а вернее лишь одним из них - Windows Live Writer. Не используете WLW - удаляйте.
        remove_action('wp_head', 'rsd_link'); // Используется различными блог-клиентами или веб-сервисами для публикации/изменения записей в блоге.
        remove_action('wp_head', 'pagenavi_css'); // Убирает вывод лишнего css изи плагина WP-PageNavi
        remove_action('wp_head', 'index_rel_link'); // Убирает ссылку на главную страницу
        remove_action('wp_head', 'parent_post_rel_link', 10, 0); // Убирает ссылку на предыдущую запись
        remove_action('wp_head', 'start_post_rel_link', 10, 0);  // Убирает ссылку на первую запись
        remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0); // Убирает связь с родительской записью
        remove_action('wp_head', 'adjacent_posts_rel_link', 10, 0); // Убирает ссылку на следующую запись
        remove_action('wp_head', 'feed_links_extra', 3); // Запрещаем вывод RSS фида для записей, тегов, рубрик и т.д. Таким образом, мы запрещаем создавать такие фиды, но тем не менее, они будут доступны, если добавить /feed в конец урла.
        remove_action('wp_head', 'feed_links', 2); // Формально если запретить данное действие, то в блоге не должны выводиться ссылки на основную ленту RSS и на RSS ленту комментариев. А на практике это работать не будет, так как функция wp_head не выводит эти самые ссылки на RSS ленты записей и комментариев, их вывод должен осуществляться вручную в файле header.php
        //полное отключение Emoji
        remove_action('wp_head', 'print_emoji_detection_script', 7);
        remove_action('wp_print_styles', 'print_emoji_styles');
        remove_action('admin_print_scripts', 'print_emoji_detection_script');
        remove_action('admin_print_styles', 'print_emoji_styles');
        // Код ниже избавляет от wp-json и oembed
        add_filter('rest_enabled', '__return_false'); // Отключаем сам REST API
        // Отключаем фильтры REST API
        remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
        remove_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 );
        remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 );
        remove_action( 'auth_cookie_malformed', 'rest_cookie_collect_status' );
        remove_action( 'auth_cookie_expired', 'rest_cookie_collect_status' );
        remove_action( 'auth_cookie_bad_username', 'rest_cookie_collect_status' );
        remove_action( 'auth_cookie_bad_hash', 'rest_cookie_collect_status' );
        remove_action( 'auth_cookie_valid', 'rest_cookie_collect_status' );
        remove_filter( 'rest_authentication_errors', 'rest_cookie_check_errors', 100 );
        // Отключаем события REST API
        remove_action( 'init', 'rest_api_init' );
        remove_action( 'rest_api_init', 'rest_api_default_filters', 10, 1 );
        remove_action( 'parse_request', 'rest_api_loaded' );
        // Отключаем Embeds связанные с REST API
        remove_action( 'rest_api_init', 'wp_oembed_register_route');
        remove_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10, 4 );
        remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
        remove_filter('oembed_dataparse', 'wp_filter_oembed_result', 10);
        remove_action('wp_head', 'wp_oembed_add_host_js');
        // убираем meta rel='dns-prefetch' href='//s.w.org'
        remove_action( 'wp_head', 'wp_resource_hints', 2 );
     
Статус темы:
Закрыта.