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

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

Статус темы:
Закрыта.
Модераторы: DzSoft, Sorcus
  1. ezh88

    ezh88 Создатель

    Регистр.:
    26 янв 2016
    Сообщения:
    32
    Симпатии:
    6
    ------------------------------------------------------------------------
    Выполнение PHP-кода в виджетах WordPress без плагина
    ------------------------------------------------------------------------
    Код:
    // Выполнение PHP-кода в виджетах WordPress без плагина
    function mayak_widget_php($widget_content) {
    if (strpos($widget_content, '<' . '?') !== false) {
    ob_start();
    eval('?' . '>' . $widget_content);
    $widget_content = ob_get_contents();
    ob_end_clean();
    }
    return $widget_content;
    }
    add_filter('widget_text', 'mayak_widget_php', 99);
     
  2. unnell

    unnell Создатель

    Регистр.:
    28 июл 2013
    Сообщения:
    14
    Симпатии:
    12
    Доп поля при оформлении заказа
    Код:
    
    
    
    
    
    
    
    // Add a new checkout field
    function kia_filter_checkout_fields($fields){
        $fields['extra_fields'] = array(
                'f1' => array('type' => 'text', 'required'      => false, 'label' => 'Название компании'),
                'f2' => array('type' => 'text', 'required'      => false, 'label' => 'Юридический адрес'),
                'f3' => array('type' => 'number', 'required'      => false, 'label' => 'ИНН'),
                'f4' => array('type' => 'number', 'required'      => false, 'label' => 'КПП'),
                'f5' => array('type' => 'text', 'required'      => false, 'label' => 'Контактное лицо'),
                'f6' => array('type' => 'email', 'required'      => false, 'label' => 'E-Mail'),
                'f7' => array('type' => 'text', 'required'      => false, 'label' => 'Телефон'),
                'f8' => array('type' => 'text', 'required'      => false, 'label' => 'Факс'),
                'f9' => array('type' => 'number', 'required'      => false, 'label' => 'Индекс'),
                'f10' => array('type' => 'text', 'required'      => false, 'label' => 'Местоположение'),
                'f11' => array('type' => 'textarea', 'required'      => false, 'label' => 'Адрес доставки'),
        );
        return $fields;
    }
    add_filter( 'woocommerce_checkout_fields', 'kia_filter_checkout_fields' );
    
    // display the extra field on the checkout form
    function kia_extra_checkout_fields(){
    
        $checkout = WC()->checkout(); ?>
    
        <div class="extra-fields">
            <div class="row clicker" ><h3>Юридическим лицам</h3> <i class="fa fa-angle-down"></i><i class="fa fa-angle-up" aria-hidden="true"></i></div>
            <div class="hide09">
                <?php foreach ( $checkout->checkout_fields['extra_fields'] as $key => $field ) : ?>
                    <?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
                <?php endforeach; ?>
            </div>
        </div>
    
    <?php }
    
    
    
    
    
    add_action( 'woocommerce_checkout_after_customer_details' ,'kia_extra_checkout_fields' );
    
    // save the extra field when checkout is processed
    function kia_save_extra_checkout_fields( $order_id, $posted ){
       
        $checkout = WC()->checkout();
       
         foreach ( $checkout->checkout_fields['extra_fields'] as $key => $field ) :
            if( isset( $posted[$key] ) ) { update_post_meta( $order_id, '_'.$key, sanitize_text_field( $posted[$key] ) ); }
        endforeach;
    
    }
    add_action( 'woocommerce_checkout_update_order_meta', 'kia_save_extra_checkout_fields', 10, 2 );
    
    // display the extra data in the order admin panel
    function kia_display_order_data_in_admin( $order ){
    
    $ar = array(1=>'Название компании',  'Юридический адрес', 'ИНН', 'КПП', 'Контактное лицо', 'E-Mail', 'Телефон', 'Факс', 'Индекс', 'Местоположение', 'Адрес доставки');
    
    ?>
        <div class="order_data_column">
            <h4>Юридическим лицам</h4>
            <?php
            for($i = 1;$i <= 11; $i++){
                echo '<p><strong>' .$ar[$i] . ':</strong>' . get_post_meta( $order->id, '_f'.$i, true ) . '</p>';
            } ?>
        </div>
    <?php }
    add_action( 'woocommerce_admin_order_data_after_order_details', 'kia_display_order_data_in_admin' );
    
     
    dana77 нравится это.
  3. ezh88

    ezh88 Создатель

    Регистр.:
    26 янв 2016
    Сообщения:
    32
    Симпатии:
    6
    ------------------------------------------------------------------------
    Как открывать все внешние ссылки в новом окне
    ------------------------------------------------------------------------
    // Открывать внешние ссылки в новом окне
    function autoblank($text) {
    $return = str_replace('href=', 'target="_blank" href=', $text);
    $return = str_replace('target="_blank" href="Перейти по ссылке', $return);
    $return = str_replace('target="_blank" href="/', 'href="/', $return);
    $return = str_replace('target="_blank" href="#', 'href="#', $return);
    $return = str_replace(' target = "_blank">', '>', $return);
    return $return;
    }
    add_filter('the_content', 'autoblank');
    add_filter('comment_text', 'autoblank');
     
  4. _Elena_

    _Elena_ Писатель

    Регистр.:
    22 ноя 2016
    Сообщения:
    7
    Симпатии:
    1
    Нашла в инете - как добавить миниатюру в админку к записям:
    ## Добавляет миниатюры записи в таблицу записей в админке
    if(1){
    add_action('init', 'add_post_thumbs_in_post_list_table', 20 );
    function add_post_thumbs_in_post_list_table(){
    // проверим какие записи поддерживают миниатюры
    $supports = get_theme_support('post-thumbnails');

    // $ptype_names = array('post','page'); // указывает типы для которых нужна колонка отдельно

    // Определяем типы записей автоматически
    if( ! isset($ptype_names) ){
    if( $supports === true ){
    $ptype_names = get_post_types(array( 'public'=>true ), 'names');
    $ptype_names = array_diff( $ptype_names, array('attachment') );
    }
    // для отдельных типов записей
    elseif( is_array($supports) ){
    $ptype_names = $supports[0];
    }
    }

    // добавляем фильтры для всех найденных типов записей
    foreach( $ptype_names as $ptype ){
    add_filter( "manage_{$ptype}_posts_columns", 'add_thumb_column' );
    add_action( "manage_{$ptype}_posts_custom_column", 'add_thumb_value', 10, 2 );
    }
    }

    // добавим колонку
    function add_thumb_column( $columns ){
    // подправим ширину колонки через css
    add_action('admin_notices', function(){
    echo '
    <style>
    .column-thumbnail{ width:80px; text-align:center; }
    </style>';
    });

    $num = 1; // после какой по счету колонки вставлять новые

    $new_columns = array( 'thumbnail' => __('Thumbnail') );

    return array_slice( $columns, 0, $num ) + $new_columns + array_slice( $columns, $num );
    }

    // заполним колонку
    function add_thumb_value( $colname, $post_id ){
    if( 'thumbnail' == $colname ){
    $width = $height = 45;

    // миниатюра
    if( $thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true ) ){
    $thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true );
    }
    // из галереи...
    elseif( $attachments = get_children( array(
    'post_parent' => $post_id,
    'post_mime_type' => 'image',
    'post_type' => 'attachment',
    'numberposts' => 1,
    'order' => 'DESC',
    ) ) ){
    $attach = array_shift( $attachments );
    $thumb = wp_get_attachment_image( $attach->ID, array($width, $height), true );
    }

    echo empty($thumb) ? ' ' : $thumb;
    }
    }
    }

    Чтоб другим пользователям не мешало в админке:

    ## удаляет сообщение о новой версии WordPress у всех пользователей кроме администратора
    if( is_admin() && ! current_user_can('manage_options') ){
    add_action('init', function(){ remove_action( 'init', 'wp_version_check' ); }, 2 );
    add_filter('pre_option_update_core', '__return_null');
    }

    В Вордпресс в админке есть страница всех настроек. Чтоб ее включить нужно добавить такой текст в function

    ## Добавляет ссылку на страницу всех настроек в пункт меню админки "Настройки"
    add_action('admin_menu', 'all_settings_link');
    function all_settings_link(){
    add_options_page( __('All Settings'), __('All Settings'), 'manage_options', 'options.php');
    }

    Для настроек Woocommerce удобно когда изображения в div

    // Оборачивание в div изображений в списках товаров
    add_action( 'woocommerce_before_shop_loop_item_title', create_function('', 'echo "<div class=\"img-wrap-product-list-parent\"><div class=\"img-wrap-product-list-child\">";'), 5, 2);
    add_action( 'woocommerce_before_shop_loop_item_title', create_function('', 'echo "</div></div>";'), 12, 2);

    $show_in_nav_menus = apply_filters('woocommerce_attribute_show_in_nav_menus', TRUE, $name);
    add_filter('woocommerce_attribute_show_in_nav_menus', 'wc_reg_for_menus', 1, 2);
     
    Последнее редактирование модератором: 3 апр 2017
  5. SmileNet

    SmileNet Постоялец

    Регистр.:
    6 окт 2012
    Сообщения:
    62
    Симпатии:
    16
    Создает миниатюру large по размерам указанным в настройках и заменяет ей оригинал. В итоге и размер оптимальный, лишних (не нужных дублей нет), и "оригинал" всегда на месте. Проверено.
    PHP:
    function replace_uploaded_image($image_data) {
          
    // if there is no large image : return
      
    if (!isset($image_data['sizes']['large'])) return $image_data;

      
    // paths to the uploaded image and the large image
      
    $upload_dir wp_upload_dir();
      
    $uploaded_image_location $upload_dir['basedir'] . '/' .$image_data['file'];
      
    // $large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file']; // ** This only works for new image uploads - fixed for older images below.
      
    $current_subdir substr($image_data['file'],0,strrpos($image_data['file'],"/"));
      
    $large_image_location $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

      
    // delete the uploaded image
      
    unlink($uploaded_image_location);

      
    // rename the large image
      
    rename($large_image_location,$uploaded_image_location);

      
    // update image metadata and return them
      
    $image_data['width'] = $image_data['sizes']['large']['width'];
      
    $image_data['height'] = $image_data['sizes']['large']['height'];
      unset(
    $image_data['sizes']['large']);

      return 
    $image_data;
    }

    add_filter('wp_generate_attachment_metadata','replace_uploaded_image');
    Взято Перейти по ссылке
     
    R... и нарада нравится это.
  6. moredemons

    moredemons Создатель

    Регистр.:
    24 мар 2017
    Сообщения:
    13
    Симпатии:
    4
    Такой сниппет можно использовать
    Код:
    add_filter('woocommerce_get_availability_text', function($text, $product) {
    if (!$product->is_in_stock()) {
        $text = 'N кол-во дней под заказ';
    }
    return $text;
    }, 10, 2);
     
    cart13 нравится это.
  7. SmileNet

    SmileNet Постоялец

    Регистр.:
    6 окт 2012
    Сообщения:
    62
    Симпатии:
    16
    Однако здравствуйте :crazy:
    Двое суток почти пытался решить проблему. Есть в WP нехорошая дыра, не знаю о чем думают разработчики. При создании пользователя в таблице users у пользователя создается автоматом user_nicename (не путайте с nickname из таблицы usermeta, который редактируется в профиле пользователя). Доступа к редактированию user_nicename кроме как из БД нет. user_nicename используется как уникальный идентификатор при просмотре страниц авторов (если навести курсор на автора в ссылке мы увидим именно его). Самое гадкое в этом то, что user_nicename при регистрации устанавливается равным user_login, т.е. начинает светить логины пользователей. Светит даже тех кто не является автором, это можно проверить введя в адресную строку сайт.ru/?author=1 (последняя цифра ID пользователя, в данном случае администратора) после перехода по ссылке адрес страницы будет иметь вид сайт.ru/author/admin/ (адрес будет отличаться в зависимости от настройки ЧПУ), admin в данном случае это и есть user_nicename пользователя с ID1. В итоге пол дела для взлома мы сделали сами, остается подобрать пароль.
    Долго думал и искал как решить проблему (знал бы php сделал бы быстрей :D). На запросы гугл отвечал какой то хренью, пришлось ковырять самому. В итоге нашел где в user.php устанавливается user_nicename и Правильно (а как известно правильно заданный вопрос уже содержит ответ) спросил гугл:D. В итоге был найден хук который при регистрации пользователя меняет user_nicename на user_id Менять надо именно на user_id т.к. при создании пользователя это единственная уникальная переменная. Теперь перейдя по ссылке сайт.ru/?author=1 адрес будет выглядеть сайт.ru/author/1/. В итоге логин не светится ни где (я по крайней мере пока не нашел) и сохранена уникальность ников для отображения страниц авторов. Если вам хочется что б ваша страница была не цифрой, а словом, поменяйте ник через БД, но не забывайте про уникальность. Я сделал себе ник admin.... не спроста:) У меня установлен плагин ithemes security a нем есть опция немедленной блокировки хоста с которого пытаются войти с логином admin, т.е. провоцируем и в бан :D

    Ну и сам хук

    PHP:
    // Заменяем user_nicename на user_id
    add_action('user_register','write_new_nicename',10);
    function 
    write_new_nicename($user_id){
    global 
    $wpdb;
    $wpdb->update(
    $wpdb->prefix 'users',
    array(
    'user_nicename' => $user_id),
    array(
    'ID' => $user_id)
    );
    }
    Проверено, работает.
     
    Последнее редактирование: 22 май 2017
    нарада, latteo и magicrobot нравится это.
  8. SmileNet

    SmileNet Постоялец

    Регистр.:
    6 окт 2012
    Сообщения:
    62
    Симпатии:
    16
    Раз пятый пытаюсь описАть, опишу лаконично.
    Хук может заполнять автоматом поля при добавлении изображения через редактор, кнопка "Добавить медиафайл"
    1 и 2 переменные: получает адрес сайта без слеша на конце и удаляет его из ссылки, вставляемая ссылка имеет вид : "\uplodad\......." (в зависимости какая директория для загрузки). Дает плюс при переезде на другой домен (все ссылки относительно корня)
    3 переменная: добавляет класс к изображению
    4 переменная: добавляет класс к сылке
    3 и 4 актуальны когда для всех изображений используется один класс, например 4 я использую для открытия всех изображений в лайтбокс. 3 я не использую, но можно использовать для добавления ко всем изображениям класса рамок.
    Не нужное можно за комментировать или удалить.

    PHP:
    // Добавление class=" " к изображениям, обрезка домена у ссылок (редактор медиа)
    add_filter'image_send_to_editor''filter_class_media_editor'10);
    function 
    filter_class_media_editor $html){
        
    $site_url get_site_url();                                                   // получаем адрес блога
        
    $html str_replace$site_url''$html );                               // удалим домен без слеша на конце
        
    $html str_replace('class="''class="Имя_Класса'$html );      // добавим класс изображения
        
    $html str_replace('<a','<a class="Имя_Класса"',$html);         // добавим класс ссылки
        
    return $html;
    }
    Так же замечено, что при добавлении изображения не добавляется поле title, забирается только alt. В исходном коде на месте переменной $title установлено 'пустое_значение '. У меня alt и title одинаковы, по этому ковырять глубоко не стал изменил в
    /wp-admin/includes/media.php:122
    PHP:
    $html get_image_tag$id''$alt$align$size );
    на
    PHP:
    $html get_image_tag$id$alt$alt$align$size );
    При очередном обновлении движка изменения могут пропасть, хотя при добавлении изображения это будет видно и можно поправить опять.
     
    leoNeo нравится это.
  9. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    25
    Симпатии:
    6
    PHP:
    //удаляет H2 из шаблона пагинации
    add_filter('navigation_markup_template''my_navigation_template'10);
    function 
    my_navigation_template$template$class ){
        return 
    '
        <nav class="page-navigation %1$s" role="navigation">
            <div class="nav-links">%3$s</div>
        </nav>  
        '
    ;
    }
     
    Последнее редактирование: 6 июн 2017
  10. t.voskanyan

    t.voskanyan Писатель

    Регистр.:
    21 июн 2017
    Сообщения:
    1
    Симпатии:
    0
    Тема Storefront от Woocommerce

    // Показать наименования товара над фото, на странице магазина

    PHP:
    remove_action'woocommerce_shop_loop_item_title''woocommerce_template_loop_product_title'10 );
    add_action'woocommerce_before_shop_loop_item''woocommerce_template_loop_product_title'10 );
    // Показать категории товаров под наименованием, на странице магазина

    PHP:
    add_action'woocommerce_before_shop_loop_item_title''avia_add_product_cat'1);
    add_action'woocommerce_single_product_summary''avia_add_product_cat'5);
    function 
    avia_add_product_cat()
    {
        global 
    $product;
        
    $product_cats wp_get_post_terms($product->id'product_cat');
        
    $count count($product_cats);
        foreach(
    $product_cats as $key => $cat)
        {
            echo 
    '<span class="category-under-title">'.$cat->name.'</span>';
            if(
    $key < ($count-1))
            {
                echo 
    ', ';
            }
            else
            {
                echo 
    '<br/>';
            }
        }
    }
     
Статус темы:
Закрыта.