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

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

Модераторы: DzSoft, Sorcus
  1. gls

    gls Комбат

    Регистр.:
    11 янв 2007
    Сообщения:
    568
    Симпатии:
    282
    Зачем повторяться, если такое есть в заголовке поста
     
  2. yurylisenko2

    yurylisenko2 Писатель

    Регистр.:
    19 май 2016
    Сообщения:
    1
    Симпатии:
    0
    Подскажите, нужно временно отключить категорию товаров в woocommerce, как это сделать? в админке категорию можно только удалить
     
  3. areshin71

    areshin71 Создатель

    Регистр.:
    19 сен 2015
    Сообщения:
    31
    Симпатии:
    3
    Убрать артикул только с карточек товара, оставив артикул в админке.
    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;
    }
     
    нарада нравится это.
  4. Varrcan

    Varrcan Создатель

    Регистр.:
    7 апр 2012
    Сообщения:
    27
    Симпатии:
    22
    Конечно будут ) Сегодня вот добавил отключение emoji. Можно тестировать.
    Логотип видел, буду работать над исправлением
     
    ezh88 и xprocessorx нравится это.
  5. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    21
    Симпатии:
    5
    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 видео (работает для ютуб)
     
  6. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    21
    Симпатии:
    5
    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;
    }
     
  7. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    21
    Симпатии:
    5
    и еще один блок для хлебных крошек, если используется плагин 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;
    }
     
  8. fuxilazo

    fuxilazo Создатель

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

    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 нравится это.
  9. fuxilazo

    fuxilazo Создатель

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

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

     
  10. fuxilazo

    fuxilazo Создатель

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

    везде вместо <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');  

      }
    }