header

content

Размещение отдельной записи
Размещение отдельной записи
<?php
$args = array(
    'p' => 59, // ID нужной записи
    'post_type' => 'post', // Тип записи
    'post_status' => 'publish' // Статус
);
$query = new WP_Query($args);
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        the_content();
    }
    wp_reset_postdata();
}                
?>
Размещение записей из рубрики
Размещение записей из рубрики
<?php
    $id=4; // Идентификатор нужной рубрики
    $n=8;  // Количество выводимых записей
    $orderby = 'id'; // Индекс сортировки
    $order = 'ASC'; // Порядок сортировки
      
    $recent = new WP_Query("cat=$id&showposts=$n&orderby=$orderby&order=$order"); //Запрашиваем нужные записи
    while($recent->have_posts()) : $recent->the_post(); //Если они есть, то выводим в цикле
?>

        <?php the_title(); // Заголовок записи ?>
        <?php the_post_thumbnail(); // Изображение записи ?>

<?php endwhile; //Конец цикла вывода ?>
Размещение меню в файл шаблона
Размещение меню в файл шаблона
<?php $args = array('menu'  => '1',); // 1 - id меню ?>
<?php wp_nav_menu( $args ); ?>
Автопостинг в ВК в 2025 году. 3.Применение токенов
vk (vk)
Автопостинг в ВК в 2025 году. 3.Применение токенов
1. Создать текстовый файл для временного хранения получаемых от ВК данных в папке с исполняемыми скриптами автопостинга. К примеру vk_tmp.txt

2. При первом запуске выдаст ошибку о несовпадении ip-адреса, используемого при получении токена с текущим.
Необходимо выполнить рефреш и получить новый токен. Создать php файл следующего содержания:

<?php
$url = 'https://id.vk.com/oauth2/auth';
$data = [
'grant_type' => 'refresh_token',
'refresh_token' => 'vk2.много букв и цифр',
'client_id' => '11111111',
'device_id' => 'много букв и цифр',
'state' => 'XXXRandomZZZ1111111111111111XXXRandomZZZ',
'scope' => 'vkid.personal_info photos wall offline'
];

// Prepare POST data
$options = [
    'http' => [
        'method'  => 'POST',
        'header'  => 'Content-Type: application/x-www-form-urlencoded',
        'content' => http_build_query($data),
    ],
];

// Create stream context
$context  = stream_context_create($options);

// Perform POST request
$response = file_get_contents($url, false, $context);

file_put_contents(__DIR__ . '/vk_tmp.txt', print_r($response, true));
// Display the response
echo $response;
echo '<br>';
$array = json_decode($response, true);
print_r($array);
?>

Для формирования массива исходящих данных использовать параметры, полученные в результате curl-запроса при получении токена.
В результате получим обновленные токены с записью результата в созданный файл.

В дальнейшем перед запуском скрипта автопубликации с сайта в ВК будем брать информацию о рефреш-токене из временного файла, с его помощью получать новые актуальные токены, перезаписывать их во временный файл, полученный access_token использовать в скрипте.

<?
$tmp_access_data = file_get_contents(__DIR__ . '/vk_tmp.txt');

// json to array
$array_access_data = json_decode($tmp_access_data, true);

$refresh_token = $array_access_data['refresh_token'];

// Define the URL and data
$url = 'https://id.vk.com/oauth2/auth';
$data = [
'grant_type' => 'refresh_token',
'refresh_token' => $refresh_token,
'client_id' => '11111111',
'device_id' => 'много букв и цифр',
'state' => 'XXXRandomZZZ1111111111111111XXXRandomZZZ',
'scope' => 'vkid.personal_info photos wall offline'
];

// Prepare POST data
$options = [
    'http' => [
        'method'  => 'POST',
        'header'  => 'Content-Type: application/x-www-form-urlencoded',
        'content' => http_build_query($data),
    ],
];

// Create stream context
$context  = stream_context_create($options);

// Perform POST request
$response = file_get_contents($url, false, $context);

file_put_contents(__DIR__ . '/vk_tmp.txt', print_r($response, true));

// json to array
$array_access_data_new = json_decode($response, true);

$access_token = $array_access_data_new['access_token'];
?>

Автопостинг в ВК в 2025 году. 2.Получение токенов
vk (vk)
Автопостинг в ВК в 2025 году. 2.Получение токенов

1. Подготовка. На сервисе https://tonyxu-io.github.io/pkce-generator/ в первом окне сгенерировать Code Verifier по кнопке "Generate Code Verifier". На его основе создать Code Challenge во втором окне, нажав кнопку "Generate Code Challenge".
Сохранить оба кода для дальнейшего использования при получении токенов.

Снимок1.JPG
2. Подготовить параметры для авторизации:
https://id.vk.com/authorize?
response_type=code
&client_id=11111111
&scope=offline%20wall%20photos
&redirect_uri=https://site.ru
&state=XXXRandomZZZ1111111111111111XXXRandomZZZ
&code_challenge=6c7ZD9kujPJSeTMQ8LKzER1LUI1P6DFNHkINCJCtGrA
&code_challenge_method=S256

client_id - id приложения, полученный при его создании.
scope - разрешения для приложения. В примере из документации в качестве разделителя используется последовательность "%20"
redirect_uri - свой сайт, указанный в настройках приложения
state - Строка состояния в виде случайной строки, состоящей из символов: a-z, A-Z, 0-9, _, -, длиной не менее 32 символа.
code_challenge - полученная в первом пункте последовательность символов.

Собрать все это в одну строку и вставить в адресную строку браузера. Убедиться, что пользователь авторизован как администратор приложения в ВК. Отправить запрос.

3. Произойдет переход на ваш сайт с формированием в адресной строке ссылки такого содержания:
https://site.ru/?
code=vk2.много букв и цифр
&expires_in=600
&device_id=много букв и цифр
&state=XXXRandomZZZ1111111111111111XXXRandomZZZ
&ext_id=много букв и цифр
&type=code_v2

4. Получение Access Token
Формируем curl-запрос:

curl "https://id.vk.com/oauth2/auth" -d "
client_id=11111111
&grant_type=authorization_code
&code_verifier=S7yz7Uw_d4B68xGmpVLNqKSCHvGDL9YXuq6Nf1rEi4w
&device_id=много букв и цифр
&code=vk2.много букв и цифр
&redirect_uri=https://site.ru
&state=XXXRandomZZZ1111111111111111XXXRandomZZZ
"

client_id - id приложения, полученный при его создании. 
code_verifier - сгенерированная в первом пункте последовательность символов (не путать с code_challenge, используемым ранее.
device_id - параметр, полученный в пункте 3.
code - параметр, полученный в пункте 3.
state - параметр, полученный в пункте 3.

Объединить все в одну строку:
curl "https://id.vk.com/oauth2/auth" -d "client_id=11111111&grant_type=authorization_code&code_verifier=S7yz7Uw_d4B68xGmpVLNqKSCHvGDL9YXuq6Nf1rEi4w&device_id=много букв и цифр&code=vk2.много букв и цифр&redirect_uri=https://site.ru&state=XXXRandomZZZ1111111111111111XXXRandomZZZ"

и, используя командную строку Windows, отправить запрос.

Снимок1.JPG

В результате получим: 
access_token - персональный токен для работы с API.
refresh_token - для обновления access_token, после окончания срока его жизни.
expires_in:3600 - время жизни access_token
и другую полезную информацию
Автопостинг в ВК в 2025 году. 1.Создание приложения
vk (vk)
Автопостинг в ВК в 2025 году. 1.Создание приложения
1. Зарегистрироваться в сервисе https://id.vk.com/about/business/go. Подтвердить персональные данные. Получить права на управление доступами приложения.

2. Создать новое приложение.
Во вкладке "Приложение" указать базовый домен (site.ru) и Доверенный Redirect URL (https://site.ru). site.ru - свой сайт - источник экспортируемых статей.
Для дальнейшей интеграции потребуются id созданного приложения и Доверенный Redirect URL.

3. Во вкладке "Доступы" после подтверждения персональных данных необходимо выставить разрешения. Для новостей: стена, фотографии. Дальше на свое усмотрение.
Снимок1.JPG
Вкладка Modes (Place Actors) в UE5
Вкладка Modes (Place Actors) в UE5 Вкладка Modes (Place Actors) в UE5

Вызов окна Place Actors через пункт меню Window
Modes (UE4) -> Place Actors (UE5)
Trigger Volume (UE4) -> Trigger Box (UE5)
Ошибки Битрикс на php8 (частные случаи)
Ошибки Битрикс на php8 (частные случаи)
[Error] Call to undefined function each() (0) /***/bitrix/modules/statistic/classes/general/statistic.php:782

При обновлении не обновился системный модуль "statistic".

В указанном файле 782-ю строку:

list(,$value) = each($arrADV);

заменить на:

$value = reset($arrADV);

************************************************************************************************************************************************


Скрытие части текста фоновым градиентом
Скрытие части текста фоновым градиентом

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

.div_text{position:relative;height:150px;width:100%;overflow:hidden;}
.div_text:after{position:absolute;height:120px;left:0;right:0;bottom:0;width:100%;z-index:2;content:'';background-image: linear-gradient(transparent, white);}
Убрать эмодзи из текста
php (php)
Убрать эмодзи из текста
$text = preg_replace('~[\x{10000}-\x{10FFFF}]~u', '', $text);
Добавить номер страницы в заголовки страниц при постраничной навигации (другой вариант)
Добавить номер страницы в заголовки страниц при постраничной навигации (другой вариант)
Данные - из настроек физических разделов и страниц или прописать прямым текстом в component_epilog.php. Компонент "Список новостей". 

Если значения get-параметра PAGEN_1 не совпадают с нумерацией страниц в меню постраничной навигации
В шаблоне компонента в файле result_modifier.php получаем данные по навигации из общего массива данных.
Вычисляем порядковый номер страницы.
Пишем его в один из элементов массива, передаваемых в component_epilog.php.
В component_epilog.php формируем шаблон для заголовков страниц.

Если в PAGEN_1 и в меню постраничной навигации одно и то же число
Работаем сразу с component_epilog.php и формируем шаблон для заголовков страниц, используя PAGEN_1
result_modifier.php
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

if(isset($_GET['PAGEN_1']) && $_GET['PAGEN_1']){
    $arNav = $arResult['NAV_RESULT'];
    $arNav = get_object_vars($arNav);
    $nav_count = (int)$arNav['NavPageCount'];
    $nav_page = (int)$arNav['NavPageNomer'];
    $current_page = $nav_count - $nav_page +1;
// допишем свои данные в $arResult['NAV_CACHED_DATA']
    $arResult['NAV_CACHED_DATA']['current_page'] = $current_page;
}
?>


component_epilog.php
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
global $APPLICATION;

if(isset($_GET['PAGEN_1']) && $_GET['PAGEN_1']){

    $current_page = $_GET['PAGEN_1'];

    if(isset($arResult['NAV_CACHED_DATA']['current_page']) && $arResult['NAV_CACHED_DATA']['current_page']){
        $current_page = $arResult['NAV_CACHED_DATA']['current_page'];
    }

$APPLICATION->SetPageProperty("title", 'Тайтл страницы - Страница ' . $current_page);
$APPLICATION->SetPageProperty("description", 'Описание страницы - Страница ' . $current_page);
}
?>
Добавить номер страницы в заголовки страниц при постраничной навигации (для разделов инфоблока)
Добавить номер страницы в заголовки страниц при постраничной навигации (для разделов инфоблока)
Данные - из настроек раздела (вкладка "SEO")
Компонент "Список новостей". В шаблоне создать (если отсутствует) файл result_modifier.php.
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

if(isset($_GET['PAGEN_1']) && $_GET['PAGEN_1']){

    $arNav = $arResult['NAV_RESULT'];
    $arNav = get_object_vars($arNav);
    $nav_count = (int)$arNav['NavPageCount'];
    $nav_page = (int)$arNav['NavPageNomer'];
    $current_page = $nav_count - $nav_page +1;

    $meta_title = $arResult['IPROPERTY_VALUES']['SECTION_META_TITLE'];
    $arResult['IPROPERTY_VALUES']['SECTION_META_TITLE'] = $meta_title . ' - Страница ' . $current_page;
    $meta_description = $arResult['IPROPERTY_VALUES']['SECTION_META_DESCRIPTION'];
    $arResult['IPROPERTY_VALUES']['SECTION_META_DESCRIPTION'] = $meta_description . ' - Страница ' . $current_page;
    //$page_title = $arResult['IPROPERTY_VALUES']['SECTION_PAGE_TITLE'];
    //$arResult['IPROPERTY_VALUES']['SECTION_PAGE_TITLE'] = $page_title . ' - Страница ' . $current_page;
}

?>
Перевести текст в транслит
php (php)
Перевести текст в транслит
$text = 'бла-бла-бла :)';

$tr = array(
        "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G","Д"=>"D",
        "Е"=>"E","Ё"=>"YO","Ж"=>"J","З"=>"Z","И"=>"I",
        "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
        "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
        "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"C","Ч"=>"CH",
        "Ш"=>"SH","Щ"=>"SCH","Ъ"=>"","Ы"=>"YI","Ь"=>"",
        "Э"=>"E","Ю"=>"YU","Я"=>"YA","а"=>"a","б"=>"b",
        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"yo","ж"=>"j",
        "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
        "ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
        "ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
    );
$text_tmp = strtr($text,$tr); // в транслит
$text_tmp = preg_replace('/[^A-Za-z0-9_\-]/', '', $text_tmp); // удаляем мусор
$text = strtolower(trim($text_tmp, '-')); // преобразуем в нижний регистр

echo $text;
Обрезать строку по словам
php (php)
Обрезать строку по словам
/**
* Обрезает строку до определённого количества символов не разбивая слова.
* Поддерживает многобайтовые кодировки.
* @param string $str строка
* @param int $length длина, до скольки символов обрезать
* @param string $postfix постфикс, который добавляется к строке
* @param string $encoding кодировка, по-умолчанию 'UTF-8'
* @return string обрезанная строка
*/
function mbCutString($str, $length, $postfix='...', $encoding='UTF-8')
{
    if (mb_strlen($str, $encoding) <= $length) {
        return $str;
    }
  
    $tmp = mb_substr($str, 0, $length, $encoding);
    return mb_substr($tmp, 0, mb_strripos($tmp, ' ', 0, $encoding), $encoding) . $postfix;
}
Сделать первую букву заглавной
php (php)
Сделать первую букву заглавной
function upFirstLetter($str, $encoding = 'UTF-8')
{
    return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding)
    . mb_substr($str, 1, null, $encoding);
}

echo upFirstLetter('дом'); // выведет "Дом"
console.log и php
php (php)
console.log и php
function debug_to_console($data) {
    $output = $data;
    if (is_array($output))
        $output = implode(',', $output);
    echo "<script>console.log('Debug Objects: " . $output . "' );</script>";
}
Оставить только цифры
php (php)
Оставить только цифры
$str = '{"10":"OK"}';
$strWithoutChars = preg_replace('/[^0-9]/', '', $str);
echo $strWithoutChars;
Убрать двойные пробелы
php (php)
Убрать двойные пробелы
$text = preg_replace('/[^\S\r\n]+/', ' ', $text);
Убрать нули в начале числа
php (php)
Убрать нули в начале числа
$y = '000000011';
echo (int)$y;

или

$y = '000000011';
print ltrim($y,'0');
Ошибки Битрикс на php8
Ошибки Битрикс на php8
1. [Ux11] Ошибка описания модуля "название.модуля".
Не установлено соединение с сервером обновлений. [Ux11] Ошибка описания модуля "название.модуля"

При возникновении данной ошибки нужно либо обновить модуль до последней версии, либо в файле /bitrix/modules/название.модуля/install/index.php заменить название функции function название_модуля() на function __construct() После этого ошибка должна уйти

2. call_user_func_array(): Argument #1 ($function) must be a valid callback, non-static method НазваниеМодуля::МетодКласса() cannot be called statically (0)

Необходимо найти код данного модуля по следующему пути (/bitrix/modules/название.модуля), определиться с классом в котором возникает данная ошибка и к данному классу приписать служебное слово static, примерно так:

static function МетодКласса()

3. Argument #1 ($value) must be of type Countable|array, null given (0)

Данная ошибка характерна, например, для функций count(), sort(), ksort() и подобных.

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

if (count($arResult["ITEMS"]) > 0) {}
или
if (count($arResult["ITEMS"])) {}

Ранее данная конструкция нам возвращала false и в случае если $arResult["ITEMS"] === Array(), и в случае если $arResult["ITEMS"] неопределен. Теперь же возникнет ошибка, если $arResult["ITEMS"] не определен или его значение не может быть "посчитано", например если значение типа Integer

Быстро исправить данную ошибку можно следующим образом:

if (is_countable($arResult["ITEMS"]) && count($arResult["ITEMS"]) > 0)
Или
if (is_array($arResult["ITEMS"]) && count($arResult["ITEMS"]) > 0)

Главная суть в том, что переменная, передаваемая в функцию count() должна существовать, быть определена и иметь тип, который может быть "посчитан", например Array

Для быстрого решения этой ошибки в функциях сортировки sort(), ksort() и т.д. можно использовать следующий код:

if (is_array($arResult["ITEMS"])) sort($arResult["ITEMS"]);

А так же возможен вариант явного приведения переменной к необходимому типу:

$arResult["ITEMS"] = (array)$arResult["ITEMS"];
Или
sort((array)$arResult["ITEMS"]);

Но в данном случае нужно понимать, что изначальное значение типа null, boolean, integer будет приведено к типу Array, что не всегда правильно для дальнейшего выполнения кода



Даты в Битриксе
Даты в Битриксе
Форматы дат

для полей: dd.mm.YYYY hh:ii:ss
DATE_ACTIVE_FROM

для свойств: YY-mm-dd hh:ii:ss
PROPERTY_*

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// текущая дата
$date_this = date('d.m.Y');  // дата сегодня
$datetime_this = date('d.m.Y H:i:s'); // дата и время сейчас

$date_next = date('d.m.Y H:i:s', strtotime(date('d.m.Y') . ' +1 day')); // дата на завтра
$datetime_next = date('d.m.Y H:i:s', strtotime(date('d.m.Y') . ' +1 day')); // дата и время на завтра с 0 часов

$date_nextnext = date('d.m.Y H:i:s', strtotime(date('d.m.Y') . ' +2 days')); // дата на послезавтра

$date_next = date('d.m.Y H:i:s', strtotime(date('d.m.Y H:i:s') . ' +1 hour')); // дата и время через час

$date_this_f = date('Y-m-d');  // дата сегодня в формате год-месяц-день
$datetime_this_f = date('Y-m-d H:i:s'); // дата и время сейчас

$year = date('Y'); // год
$month = date('m'); // месяц
$day = date('d'); // день

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

ФИЛЬТРЫ

Из полей

из поля даты начала публикации (с 1 числа месяца)
    ">=DATE_ACTIVE_FROM" => '01.' .$month. '.' . $year. ' 00:00:00',

из поля даты начала публикации (за весь текущий день)
    ">=DATE_ACTIVE_FROM" => $date_this.' 00:00:00',
    "<=DATE_ACTIVE_FROM" => $date_this.' 23:59:59',

из поля даты начала публикации (за весь текущий день) или если дата начала уже прошла, а дата окончания еще не наступила (для календаря событий)
       array(
           "LOGIC" => "OR",
           array(">=DATE_ACTIVE_FROM" => $date_this . " 00:00:00", "<=DATE_ACTIVE_FROM" => $date_this . " 23:59:59"),
           array("<=DATE_ACTIVE_FROM" => $date_this . " 23:59:59", ">=DATE_ACTIVE_TO" => $date_this . " 23:59:59"),
       ),

Из свойств

из пользовательского свойства "Дата" с кодом START (с сегодняшнего дня и далее)
    ">=PROPERTY_START" => $year . '-' . $month . '-' . $day . ' 00:00:00',

по дате за месяц
    ">=PROPERTY_START" => $year . '-' . $month . '-01',
    "<=PROPERTY_START" => $year . '-' . $month . '-31',



404
Настройка компонента и страницы 404

Во первых перейдите к настройкам вашего компонента (обычно это bitrix.catalog или bitrix.news), блоке «настройки 404 ошибки» отметьте галочку «Устанавливать статус 404».

Затем в файл /bitrix/php_interface/init.php добавьте следующий код:
    
AddEventHandler("main", "OnEpilog", "error_page");
function error_page()
{
    $page_404 = "/404.php";
    GLOBAL $APPLICATION;
    if(strpos($APPLICATION->GetCurPage(), $page_404) === false && defined("ERROR_404") && ERROR_404 == "Y")
    {
        $APPLICATION->RestartBuffer();
        CHTTP::SetStatus("404 Not Found");
        include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/header.php");
        include($_SERVER["DOCUMENT_ROOT"].$page_404);
        include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/footer.php");
        die();
    }
}

в файле /404.php

$APPLICATION->SetTitle("404 Not Found");
$APPLICATION->SetPageProperty("title", "404 Страница не найдена");
$APPLICATION->SetPageProperty("description", "404 Нет такой страницы :(");


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Текст для разных языковых версий сайта (русский - в корне, английский - в папке /en/)

<? if (substr($APPLICATION->GetCurDir(), 0, 4) == '/en/') { ?>
    <div style="margin:25px 0;">
        404 Page not found
    </div>
    <div>
        The page you requested may have been deleted or moved. <a href="/en/">Go back to the main page?</a>
    </div>
<? } else { ?>
    <div style="margin:25px 0;">
        404 Страница не найдена
    </div>
    <div>
        Возможно запрашиваемая вами страница была удалена или перемещена. <a href="/">Вернуться на главную?</a>
    </div>
<? } ?>


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Для компонента news.list, если в несуществующем разделе вываливается весь список новостей без фильтрации

В настройках выставить параметр «Строгая проверка раздела».
Или в коде вызова компонента:
"STRICT_SECTION_CHECK" => "Y",


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Настройка часового пояса
Настройка часового пояса
В админке: 
Настройка
- Настройки продукта
-- Настройка модулей 
--- Главный модуль
Вкладка "Настройки", секция "Часовые пояса". Выбрать свой часовой пояс, например Pacific/Samoa

Если есть расхождения при редактировании и при отображении на сайте:
в файл /bitrix/php_interface/dbconn.php добавить строку:
date_default_timezone_set('Pacific/Samoa');
часовой пояс указать свой.

Страница с блоком фотографий в fancybox. В шаблон компонента news.detail
Страница с блоком фотографий в fancybox. В шаблон компонента news.detail
Подключить jquery в шаблоне сайта.
Загрузить fancybox из архива на сервер.
В шаблоне компонента news.detail подправить пути до расположения библиотеки fancybox
<?
// локальные настройки
$field_photos_code = 'PHOTOS'; // код пользовательского поля для фотографий (тип "файл" множественное)
$tmb_width = 250;  // ширина превью
$tmb_height = 250; // высота превью
$img_width = 800;  // ширина фото
$img_height = 600; // высота фото
?>

<link rel="stylesheet" type="text/css" href="/fancybox/jquery.fancybox.min.css">
<script src="/fancybox/jquery.fancybox.min.js"></script>
<script src="/fancybox/custom.js"></script>

<? if(isset($arResult["PROPERTIES"][$field_photos_code]["VALUE"]) && $arResult["PROPERTIES"][$field_photos_code]["VALUE"]) { // вывод данных из свойства PHOTOS ?>
    <?
    $arPhotos = array();
    foreach($arResult["PROPERTIES"][$field_photos_code]["VALUE"] as $key=>$value) {
        $arPhotos[$key]['ID'] = $value;
    }

    // если используются описания для изображений - добавляем их в общий массив по ключу
    if(isset($arResult["PROPERTIES"][$field_photos_code]["DESCRIPTION"]) && $arResult["PROPERTIES"][$field_photos_code]["DESCRIPTION"]) {
        foreach($arResult["PROPERTIES"][$field_photos_code]["DESCRIPTION"] as $key=>$value) {
            $arPhotos[$key]['DESCRIPTION'] = $value;
        }
    }
    ?>

    <?
    /* Задаем размеры для миниатюры */
    $arrTmbSizes = array();
    $arrTmbSizes['width'] = $tmb_width;
    $arrTmbSizes['height'] = $tmb_height;

    /* Задаем размеры для фото */
    $arrPictureSizes = array();
    $arrPictureSizes['width'] = $img_width;
    $arrPictureSizes['height'] = $img_height;
    ?>

    <div class="news_item_photos_wrapper">
        <? foreach($arPhotos as $photos_item) { ?>
            <?
            $tmb = CFile::ResizeImageGet($photos_item['ID'], $arrTmbSizes, BX_RESIZE_IMAGE_EXACT );
            $img = CFile::ResizeImageGet($photos_item['ID'], $arrPictureSizes, BX_RESIZE_IMAGE_PROPORTIONAL_ALT );

            if(isset($photos_item['DESCRIPTION']) && $photos_item['DESCRIPTION']) {
                $img_desrciption = $photos_item['DESCRIPTION'];
            } else {
                $img_desrciption = $arResult["NAME"];
            }
            ?>
            <a href="<? echo $img['src']; ?>" data-fancybox="group" data-caption="<? echo $img_desrciption;?>">
                <img src="<? echo $tmb['src']; ?>" alt="<? echo $img_desrciption; ?>" title="<? echo $img_desrciption; ?>">
            </a>
        <? } ?>
    </div>
<? } ?>
.news_item_photos_wrapper{display:flex;flex-wrap:wrap;justify-content:center;}
.news_item_photos_wrapper a{display:block;margin:2px;}