• DONATE to NULLED!
    Вы можете помочь Форуму и команде, поддержать финансово.
    starwanderer - модератор этого раздела будет Вам благодарен!

Информация Wordpress: плюшки файла functions.PHP ))

Статус
В этой теме нельзя размещать новые ответы.
Убрать артикул только с карточек товара, оставив артикул в админке.
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;
}
 
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], 9, 3) !== "404") {
        return true;
    } else {
        return false;
    }
}

далее уже на странице вывода видео вызывается функция yt_exist с указанием id видео (работает для ютуб)
 
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', 10, 3);
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;
}
 
и еще один блок для хлебных крошек, если используется плагин 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( $links, 1, 0, $breadcrumb ); //указываем то, куда добавляем ссылку, здесь добавляется после первоо элемента
    }

    return $links;
}
 
удаление авторедактирования кода, порой при переключении вкладок "текст" и "визуально" удаляет нужные тэги, чтоб избежать код ниже

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');
 
//Добавление пункта в админ-панель на странице товаров выбора продуктов "в наличии" и "нет в наличии"
//оч удобно

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'];
    }
}
 
Создание дополнительных колонок в админке для нужных нам типов записей

везде вместо <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( $columns, 0, $num ) + $new_columns + array_slice( $columns, $num );
}

// заполняем колонку данными
add_filter('manage_<post_type>_posts_custom_column', 'fill_new_column', 5, 2);
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');  

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

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 );
 
Очень долго искать код который скроет записи, изображения и комментарии от других аккаунтов пользователей.

Код:
//Скрываем изображения от других пользователей
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');}
 
Конечно будут ) Сегодня вот добавил отключение emoji. Можно тестировать.
А можно в плагин еще добавить удаление 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 );
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху