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

Статус
В этой теме нельзя размещать новые ответы.

ezh88

Постоялец
Регистрация
26 Янв 2016
Сообщения
111
Реакции
15
------------------------------------------------------------------------
Выполнение 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);
 

unnell

Создатель
Регистрация
28 Июл 2013
Сообщения
15
Реакции
14
Доп поля при оформлении заказа
Код:
// 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' );
 

ezh88

Постоялец
Регистрация
26 Янв 2016
Сообщения
111
Реакции
15
------------------------------------------------------------------------
Как открывать все внешние ссылки в новом окне
------------------------------------------------------------------------
// Открывать внешние ссылки в новом окне
function autoblank($text) {
$return = str_replace('href=', 'target="_blank" href=', $text);
$return = str_replace('target="_blank" href="Для просмотра ссылки Войди или Зарегистрируйся', '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');
 

SmileNet

Постоялец
Регистрация
6 Окт 2012
Сообщения
77
Реакции
24
Создает миниатюру 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');
Взято Для просмотра ссылки Войди или Зарегистрируйся
 

moredemons

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

SmileNet

Постоялец
Регистрация
6 Окт 2012
Сообщения
77
Реакции
24
Однако здравствуйте :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)
);
}
Проверено, работает.
 
Последнее редактирование:

SmileNet

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

PHP:
// Добавление class=" " к изображениям, обрезка домена у ссылок (редактор медиа)
add_filter( 'image_send_to_editor', 'filter_class_media_editor', 10, 1 );
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 );
При очередном обновлении движка изменения могут пропасть, хотя при добавлении изображения это будет видно и можно поправить опять.
 

fuxilazo

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

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

DzSoft

3T
Регистрация
13 Сен 2007
Сообщения
357
Реакции
293
Думаю старые функции уже можно закрывать. Ибо, что-то не работает уже с изменением и усовершенствованием WordPress (хорошо сказал :D).
новая тема Для просмотра ссылки Войди или Зарегистрируйся, но эту тему не стану удалять возможно кому-то и пригодится + тут есть относительно новые функции.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху