Собственно понадобилось мне добавить расширение .php для статей WordPress под управлением Webinoly, сделать это, как выяснилось, достаточно просто.

Итак напомню, Webinoly у меня стоит в конфигурации NGINX+PHP-FPM и как выяснилось, NGINX считает что расширение .php у статей — это прям вообще ненужное дело, и даже вредное, и всячески сопротивляется, но…

Действие первое. Админка

Итак для начала убедимся, что просто так ничего не работает — для этого идем в админке WordPress в Настройки > Постоянные ссылки и вводим в поле Произвольно  значение /%postname%.php, сохраняем, и… На сайте ничего не работает — все статьи ведут на 404.

Добавить расширение .php для статей WordPress под управлением Webinoly 01

Ну  что же, ставим плагин .PHP on PAGES (не обязательно его, выбор тут достаточно большой — гугл в помощь).

Добавить расширение .php для статей WordPress под управлением Webinoly 02

И все также ничего не работает. Но мы этого ожидали и лезем ковырять конфиг (предупреждаю, возможно есть более изящные решения, буду рад если вы предложите своё).

Действие второе. Конфиги

Для этого лезем на сервер (я использую WinSCP) в папку /etc/nginx/sites-available  и редактируем конфиг нужного сайта.  Комментируем строку include common/wpfc.conf; поставив перед ней #.

# include common/wpfc.conf;
include common/wpcommon.conf;
include common/locations.conf;
include common/headers-http.conf;
include common/headers-html.conf;

А затем вставляем содержимое файла wpfc.conf; перед этим блоком (после строки index index.php index.html index.htm;). 

# WPFC NGINX CONFIGURATION
# DO NOT MODIFY, ALL CHANGES LOST AFTER UPDATE Webinoly

set $skip_cache 0;
# POST requests and URL with a query string should always go to php
if ($request_method = POST) {
	set $skip_cache 1;
}
if ($query_string != "") {
	set $skip_cache 1;
}

# Don't cache URL containing the following segments
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*.php|index.php|/feed/|.*sitemap.*\.xml)") {
	set $skip_cache 1;
}

# Don't use the cache for logged in users or recent commenter or customer with items in cart
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|[a-z0-9]+_items_in_cart|[a-z0-9]+_cart_hash") {
	set $skip_cache 1;
}

# Use cached or actual file if they exists, Otherwise pass request to WordPress
location / {
	try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
	try_files $uri =404;
	include fastcgi_params;
	fastcgi_pass php;
	fastcgi_cache_bypass $skip_cache;
	fastcgi_no_cache $skip_cache;
	fastcgi_cache WORDPRESS;
}

И заменяем в нем выделенную строку try_files $uri =404; на try_files $uri /index.php?$args; получаем в итоге:

# WebinolyNginxServerStart
server {
	listen 80;
	listen [::]:80;

	server_name yoursite.ru www.yoursite.ru;

	access_log /var/log/nginx/yoursite.ru.access.log we_log; 
	error_log /var/log/nginx/yoursite.ru.error.log;

	root /var/www/yoursite.ru/htdocs;
		
	index  index.php index.html index.htm;

# WPFC NGINX CONFIGURATION
# DO NOT MODIFY, ALL CHANGES LOST AFTER UPDATE Webinoly

set $skip_cache 0;
# POST requests and URL with a query string should always go to php
if ($request_method = POST) {
	set $skip_cache 1;
}
if ($query_string != "") {
	set $skip_cache 1;
}

# Don't cache URL containing the following segments
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*.php|index.php|/feed/|.*sitemap.*\.xml)") {
	set $skip_cache 1;
}

# Don't use the cache for logged in users or recent commenter or customer with items in cart
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|[a-z0-9]+_items_in_cart|[a-z0-9]+_cart_hash") {
	set $skip_cache 1;
}

# Use cached or actual file if they exists, Otherwise pass request to WordPress
location / {
	try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
	try_files $uri /index.php?$args;
	include fastcgi_params;
	fastcgi_pass php;
	fastcgi_cache_bypass $skip_cache;
	fastcgi_no_cache $skip_cache;
	fastcgi_cache WORDPRESS;
}

	# include common/wpfc.conf;
	include common/wpcommon.conf;
	include common/locations.conf;
	include common/headers-http.conf;
	include common/headers-html.conf;
	include /var/www/yoursite.ru/*-nginx.conf;
}
# WebinolyNginxServerEnd

Естественно необходимо поменять yoursite.ru на имя вашего сайта.

Проверяем правильность конфига и перезагружаем NGINX введя в консоли:

user@server:~# sudo nginx -t
user@server:~# sudo service nginx restart

Итак проверяем что расширение .php для статей теперь добавляется и работает нормально. В результате этих манипуляций мы получим работающий сайт все материалы которого будут иметь адрес вида yoursite.ru/my-cool-post.php