Skip to content

Instantly share code, notes, and snippets.

@Exieros
Last active September 21, 2025 16:09
Show Gist options
  • Select an option

  • Save Exieros/2159e50aa8c5ef53c749f0b916544b75 to your computer and use it in GitHub Desktop.

Select an option

Save Exieros/2159e50aa8c5ef53c749f0b916544b75 to your computer and use it in GitHub Desktop.
<?php
/*
* Класс позволяет массово добавлять мультиязыковые публикации в wordpress и автоматически связывает их.
* Требуется наличие плагина Polylang(разумеется)
* Код скорее всего нужно исправить под нужды пользователя, но работает из коробки если отправлять данные методом POST
* Время добавления поста(исполнения скрипта) ~ 0.05с
*/
namespace Exieros\Scripts;
use DateInterval;
use DateTime;
use DateTimeZone;
use Exception;
/*
* Легкая версия wp-load
*/
define('SHORTINIT', true);
const USER_PASSWORD_LENGTH = 16;
const USER_EMAIL_DOMAIN = 'fakedomain.fd';
const SITE_DOMAIN = 'http://127.0.0.1';
const SECRET = 'megasuperpass';
/*
* Завершаем работу скрипта если пароль не указан или не соответствует
*/
if(empty($_POST['pw']) || $_POST['pw'] !== SECRET ){
die('Неверный пароль');
}
/*
* Подгружаем минимальную обвязку для работы с бд wp
*/
require_once __DIR__ . '/wp-load.php';
class PolylangManuallyPostAdd{
private array $langs;
private string $table_terms;
private string $table_users;
private string $table_post_meta;
private string $table_options;
private string $table_posts;
private string $table_term_relationships;
private string $table_usermeta;
private string $table_term_taxonomy;
function __construct(){
global $wpdb;
$this->wpdb = $wpdb;
$this->table_terms = $this->wpdb->terms;
$this->table_users = $this->wpdb->users;
$this->table_post_meta = $this->wpdb->postmeta;
$this->table_options = $this->wpdb->options;
$this->table_posts = $this->wpdb->posts;
$this->table_term_relationships = $this->wpdb->term_relationships;
$this->table_usermeta = $this->wpdb->usermeta;
$this->table_term_taxonomy = $this->wpdb->term_taxonomy;
$this->langs = include_once __DIR__ . '/wp-content/plugins/polylang/settings/languages.php';
}
/*
* Функция проверяет наличие пользователя по username
* Возвращает id пользователя или 0 если пользователь не найден
*/
public function getUserId($user): ?int{
$prepare = $this->wpdb->prepare("SELECT id FROM `$this->table_users` WHERE user_login='%s'", $user);
return $this->wpdb->get_var($prepare);
}
/*
* Создание пользователя
*/
public function addUser($username): int{
$password = md5( $this->generatePassword(USER_PASSWORD_LENGTH) );
$user_info = [
'user_login' => $username,
'user_pass' => $password,
'user_nicename' => $username,
'user_email' => $username . '@' . USER_EMAIL_DOMAIN,
'user_url' => '',
'display_name' => $username
];
$this->wpdb->insert( $this->table_users, $user_info);
$id = $this->wpdb->insert_id;
$user_meta = [
'nickname' => $username,
'first_name' => '',
'last_name' => '',
'description' => '',
'rich_editing' => 'true',
'syntax_highlighting' => 'true',
'comment_shortcuts' => 'false',
'admin_color' => 'fresh',
'use_ssl' => '0',
'show_admin_bar_front' => 'true',
'locale' => '',
'wp_capabilities' => 'a:1:{s:10:"subscriber";b:1;}',
'wp_user_level' => '0'
];
$user_meta_query_array = [];
foreach($user_meta as $key => $value) {
$user_meta_query_array[] = "( $id, '$key', '$value' )";
}
$user_meta_query_array = implode(',', $user_meta_query_array);
$user_meta_query = "INSERT INTO `$this->table_usermeta` (user_id, meta_key, meta_value) VALUES $user_meta_query_array";
$this->wpdb->query($user_meta_query);
return $id;
}
/*
* Генерация пароля с заданным количеством знаков. Символы и цифры.
*/
public function generatePassword(int $length = 8): string{
$alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
$pass = array();
$alphaLength = strlen($alphabet) - 1;
for ($i = 0; $i <= $length; $i++) {
$n = rand(0, $alphaLength);
$pass[] = $alphabet[$n];
}
return implode($pass);
}
/*
* Функция добавляет пост в базу данных
*/
public function addPost(array $data, bool $comments_open = false, string $post_status = 'publish'): int{
$comments_open = $comments_open ? 'open' : 'closed';
$post_data = $data;
$post_data['post_excerpt'] = '';
$post_data['post_date_gmt'] = '0000-00-00 00:00:00';
$post_data['post_modified_gmt'] = '0000-00-00 00:00:00';
$post_data['post_status'] = $post_status;
$post_data['comment_status'] = $comments_open;
$post_data['ping_status'] = 'closed';
$post_data['post_password'] = '';
$post_data['post_content_filtered'] = '';
$post_data['post_parent'] = 0;
$post_data['menu_order'] = 0;
$post_data['post_mime_type'] = '';
$post_data['comment_count'] = 0;
$post_data['to_ping'] = '';
$post_data['post_name'] = self::slugify($data['post_title']);
$this->wpdb->insert( $this->table_posts, $post_data);
return $this->wpdb->insert_id;
}
/*
* Функция нормализует дату к формату WP
*/
public static function normalizeDate(string $_date): string{
$from_format = 'Y-m-d_H:i';
$to_format = 'Y-m-d H:i:s';
if(empty($_date)){
$date = (new DateTime())->format($to_format);
}else{
$date = DateTime::createFromFormat($from_format, $_date)->setTimezone(new DateTimeZone('GMT'))->format($to_format);
}
return $date;
}
/*
* Добавление случайного кол-ва часов к дате в формате Y-m-d H:i:s
*/
/**
* @throws \Exception
*/
public function addHours(string $date, int $min = 1, int $max = 7): string{
$rnd = random_int($min , $max);
return DateTime::createFromFormat('Y-m-d H:i:s', $date)->add(new DateInterval("PT{$rnd}H"))->format('Y-m-d H:i:s');
}
/*
* Функция проверяет наличие категории по ее имени
* Возвращает id категории или 0 если она не найдена
*/
public function getCatId(string $name): int{
$prepare = $this->wpdb->prepare(<<<SQL
SELECT *
FROM `$this->table_terms` LEFT JOIN `$this->table_term_taxonomy`
ON $this->table_term_taxonomy.term_id = $this->table_terms.term_id
WHERE name='%s'
SQL, $name);
return $this->wpdb->get_results($prepare);
}
/*
* Функция возвращает полное название языко по ее коду или NULL
*/
public function getLang(string $lang): ?array{
$filter_func = function($val) use ($lang){
return !empty($val['code']) && $val['code'] === $lang;
};
$result = array_filter($this->langs, $filter_func );
return !empty($result) ? array_shift($result) : NULL;
}
/*
* Функция проверяет наличие языка в polylang
*/
public function getLangId(string $lang_code, bool $_pll = false): ?int{
$lang = $this->getLang($lang_code);
if(is_null($lang)){
die('Переданный язык не найден');
}
$code = $lang_code;
if($_pll){
$code = 'pll_' . $code;
}
$prepare = $this->wpdb->prepare("SELECT term_id FROM `$this->table_terms` WHERE name='%s' AND slug='%s'", $lang['name'], $code);
return $this->wpdb->get_var($prepare);
}
/*
* Функция добавляет язык в список языков и возвращает ее id в таблице
*/
public function addLang(string $lang_code): int{
$lang = $this->getLang($lang_code);
if(is_null($lang)){
die('Переданный код языка не найден в таблице языков polylang!');
}
$this->wpdb->insert( $this->table_terms, [
'name' => $lang['name'],
'slug' => $lang_code,
'term_group' => 0
]);
$lang_id = $this->wpdb->insert_id;
$this->wpdb->insert( $this->table_term_taxonomy, [
'term_taxonomy_id' => $lang_id,
'term_id' => $lang_id,
'taxonomy' => 'language',
'description' => 'a:3:{s:6:"locale";s:'. strlen($lang['locale']) .':"' . $lang['locale'] .'";s:'. strlen($lang['dir']) .':"' . $lang['dir'] .'";i:0;s:9:"flag_code";s:'. strlen($lang['flag']) .':"' . $lang['flag'] .'";}',
'parent' => 0,
'count' => 0
]);
$this->wpdb->insert( $this->table_terms, [
'name' => $lang['name'],
'slug' => 'pll_' . $lang_code,
'term_group' => 0
]);
$this->wpdb->insert( $this->table_term_taxonomy, [
'term_taxonomy_id' => $this->wpdb->insert_id,
'term_id' => $this->wpdb->insert_id,
'taxonomy' => 'term_language',
'description' => '',
'parent' => 0,
'count' => 0
]);
$date = (new DateTime())->format('Y-m-d H:i:s');
$this->wpdb->insert( $this->table_posts, [
'post_author' => 1,
'post_date' => $date,
'post_date_gmt' => $date,
'post_content' => '',
'post_title' => 'polylang_mo_' . $lang_id,
'post_excerpt' => '',
'post_status' => 'private',
'comment_status' => 'closed',
'ping_status' => 'closed',
'post_password' => '',
'post_name' => 'polylang_mo_' . $lang_id,
'to_ping' => '',
'pinged' => '',
'post_modified' => $date,
'post_modified_gmt' => $date,
'post_content_filtered' => '',
'post_parent' => 0,
'guid' => '',
'menu_order' => 0,
'post_type' => 'polylang_mo',
'post_mime_type' => '',
'comment_count' => 0,
]);
$this->wpdb->insert( $this->table_post_meta, [
'post_id' => $this->wpdb->insert_id,
'meta_key' => '_pll_strings_translations',
'meta_value' => 'a:0:{}',
]);
$this->wpdb->delete( $this->table_options, [ 'option_name' => '_transient_pll_languages_list' ] );
return $lang_id;
}
/*
* Установить язык для публикации
*/
public function setLang(int $lang_id, int $post_id, $src){
$this->wpdb->insert( $this->table_term_relationships, [
'object_id' => $post_id,
'term_taxonomy_id' => $lang_id,
'term_order' => 0,
]);
$src_md5 = md5($src);
$prepare = $this->wpdb->prepare("SELECT term_id FROM `$this->table_terms` WHERE name='%s' AND slug='%s'", 'pll_' . $src_md5, 'pll_' . $src_md5);
$lang_group_id = $this->wpdb->get_var($prepare);
if(!$lang_group_id){
$this->wpdb->insert( $this->table_terms, [
'name' => 'pll_' . $src_md5,
'slug' => 'pll_' . $src_md5,
'term_group' => 0,
]);
$lang_group_id = $this->wpdb->insert_id;
}
$this->wpdb->insert( $this->table_term_relationships, [
'object_id' => $post_id,
'term_taxonomy_id' => $lang_group_id,
'term_order' => 0,
]);
$prepare = $this->wpdb->prepare(<<<SQL
SELECT DISTINCT slug, ID FROM `$this->table_posts`
INNER JOIN `$this->table_term_relationships` ON $this->table_posts.ID = $this->table_term_relationships.object_id
INNER JOIN `$this->table_term_taxonomy` ON $this->table_term_relationships.term_taxonomy_id = $this->table_term_taxonomy.term_taxonomy_id
INNER JOIN `$this->table_terms` ON $this->table_term_taxonomy.term_taxonomy_id = $this->table_terms.term_id
WHERE pinged='%s' AND post_status != 'trash' AND taxonomy = 'language'
SQL, $src);
$langs_and_posts = $this->wpdb->get_results($prepare);
$serialize = array_map(function($el){
return 's:'. strlen($el->slug) .':"'. $el->slug .'";i:'. $el->ID;
}, $langs_and_posts);
$serialize_str = 'a:' . count($serialize) . ':{' . implode(';', $serialize) . ';}';
$this->wpdb->replace( $this->table_term_taxonomy, [
'term_taxonomy_id' => $lang_group_id,
'term_id' => $lang_group_id,
'taxonomy' => 'post_translations',
'description' => $serialize_str,
'parent' => 0,
'count' => count($langs_and_posts)
] );
}
/*
* Проверка наличия категорий для указанной локали, создание при отсутствии.
* Возвращает массив term_id категорий
*/
public function checkAndCreateCats(string $cats, string $lang_code): array{
$cats_a = explode('|', $cats);
$pll_lang = $this->getLangId($lang_code, true);
$cats = [];
$prev = 0;
foreach ($cats_a as $value) {
$slug = self::slugify($value);
$prepare = $this->wpdb->prepare("SELECT term_id FROM `$this->table_terms` WHERE name='%s' AND slug='%s'", $value, $slug . '-' . $lang_code);
$cat_id = $this->wpdb->get_var($prepare);
if(!$cat_id){
$this->wpdb->insert( $this->table_terms, [
'name' => $value,
'slug' => $slug . '-' . $lang_code,
'term_group' => 0,
]);
$cat_id = $this->wpdb->insert_id;
$this->wpdb->insert( $this->table_term_relationships, [
'object_id' => $cat_id,
'term_taxonomy_id' => $pll_lang,
'term_order' => 0,
]);
$this->wpdb->insert( $this->table_term_taxonomy, [
'term_taxonomy_id' => $cat_id,
'term_id' => $cat_id,
'taxonomy' => 'category',
'description' => '',
'parent' => $prev,
'count' => 0
]);
$prev = $cat_id;
}
$cats[] = $cat_id;
}
return $cats;
}
/*
* Добавить соответствие пост - категория
*/
public function applyPostCat(int $post_id, int $cat_id){
$this->wpdb->insert( $this->table_term_relationships, [
'object_id' => $post_id,
'term_taxonomy_id' => $cat_id,
'term_order' => 0,
]);
}
/*
* Проверка наличия публикации с указанным заголовком
*/
public function checkPostExist($title): bool{
$prepare = $this->wpdb->prepare("SELECT count(ID) FROM `$this->table_posts` WHERE post_title='%s'", $title);
$count = $this->wpdb->get_var($prepare);
return (int) $count > 0;
}
/*
* Загрузка изображения в медиатеку если его нет в наличии
* Возвращает id изображения в медиатеке
*/
public function loadImage($image_url, $author_id): int{
$prepare = $this->wpdb->prepare("SELECT ID FROM `$this->table_posts` WHERE pinged='%s' AND post_type='attachment'", $image_url);
$id = $this->wpdb->get_var($prepare);
if($id){
return $id;
}
$count = 0;
$info = pathinfo(basename($image_url));
$file_name = rtrim($info['filename'], '_') . '_' . $count . '.' . $info['extension'];
$destination_path = __DIR__ . '/wp-content/uploads/publication_images/' . $file_name;
if(!is_dir(__DIR__ . '/wp-content/uploads/publication_images/')) {
mkdir(__DIR__ . '/wp-content/uploads/publication_images/');
}
while(file_exists( $destination_path )){
$file_name = rtrim($info['filename'], '_') . '_' . ++$count . '.' . $info['extension'];
$destination_path = __DIR__ . '/wp-content/uploads/publication_images/' . $file_name;
}
copy($image_url, $destination_path);
$this->wpdb->insert( $this->table_posts, [
'post_author' => $author_id,
'post_date' => PolylangManuallyPostAdd::normalizeDate(''),
'post_date_gmt' => PolylangManuallyPostAdd::normalizeDate(''),
'post_content' => '',
'post_title' => $info['filename'],
'post_excerpt' => '',
'post_status' => 'inherit',
'comment_status' => 'closed',
'ping_status' => 'closed',
'post_password' => '',
'post_name' => self::slugify($info['filename']),
'to_ping' => '',
'pinged' => $image_url,
'post_modified' => PolylangManuallyPostAdd::normalizeDate(''),
'post_modified_gmt' => PolylangManuallyPostAdd::normalizeDate(''),
'post_content_filtered' => '',
'post_parent' => 0,
'guid' => SITE_DOMAIN . '/wp-content/uploads/publication_images/' . $file_name,
'menu_order' => 0,
'post_type' => 'attachment',
'post_mime_type' => mime_content_type($destination_path),
'comment_count' => 0,
]);
$id = $this->wpdb->insert_id;
$this->wpdb->insert( $this->table_post_meta, [
'post_id' => $id,
'meta_key' => '_wp_attached_file',
'meta_value' => 'publication_images/' . $file_name
]);
return $id;
}
/*
* Функция устанавливает изображение как обложку поста
*/
public function applyPostCover($post_id, $image_id){
$this->wpdb->replace( $this->table_post_meta, [
'post_id' => $post_id,
'meta_key' => '_thumbnail_id',
'meta_value' => $image_id
] );
}
/*
* Функция возвращает настройки полиленга
*/
public function getPolylangSettings(){
$prepare = $this->wpdb->prepare("SELECT option_value FROM `$this->table_options` WHERE option_name = 'polylang'");
return unserialize($this->wpdb->get_var($prepare));
}
/*
* Создание Слага
* https://stackoverflow.com/a/38066136
*/
public static function slugify (string $text): string{
$replace = [
'&lt;' => '', '&gt;' => '', '&#039;' => '', '&amp;' => '',
'&quot;' => '', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä'=> 'Ae',
'&Auml;' => 'A', 'Å' => 'A', 'Ā' => 'A', 'Ą' => 'A', 'Ă' => 'A', 'Æ' => 'Ae',
'Ç' => 'C', 'Ć' => 'C', 'Č' => 'C', 'Ĉ' => 'C', 'Ċ' => 'C', 'Ď' => 'D', 'Đ' => 'D',
'Ð' => 'D', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ē' => 'E',
'Ę' => 'E', 'Ě' => 'E', 'Ĕ' => 'E', 'Ė' => 'E', 'Ĝ' => 'G', 'Ğ' => 'G',
'Ġ' => 'G', 'Ģ' => 'G', 'Ĥ' => 'H', 'Ħ' => 'H', 'Ì' => 'I', 'Í' => 'I',
'Î' => 'I', 'Ï' => 'I', 'Ī' => 'I', 'Ĩ' => 'I', 'Ĭ' => 'I', 'Į' => 'I',
'İ' => 'I', 'IJ' => 'IJ', 'Ĵ' => 'J', 'Ķ' => 'K', 'Ł' => 'K', 'Ľ' => 'K',
'Ĺ' => 'K', 'Ļ' => 'K', 'Ŀ' => 'K', 'Ñ' => 'N', 'Ń' => 'N', 'Ň' => 'N',
'Ņ' => 'N', 'Ŋ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O',
'Ö' => 'Oe', '&Ouml;' => 'Oe', 'Ø' => 'O', 'Ō' => 'O', 'Ő' => 'O', 'Ŏ' => 'O',
'Œ' => 'OE', 'Ŕ' => 'R', 'Ř' => 'R', 'Ŗ' => 'R', 'Ś' => 'S', 'Š' => 'S',
'Ş' => 'S', 'Ŝ' => 'S', 'Ș' => 'S', 'Ť' => 'T', 'Ţ' => 'T', 'Ŧ' => 'T',
'Ț' => 'T', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'Ue', 'Ū' => 'U',
'&Uuml;' => 'Ue', 'Ů' => 'U', 'Ű' => 'U', 'Ŭ' => 'U', 'Ũ' => 'U', 'Ų' => 'U',
'Ŵ' => 'W', 'Ý' => 'Y', 'Ŷ' => 'Y', 'Ÿ' => 'Y', 'Ź' => 'Z', 'Ž' => 'Z',
'Ż' => 'Z', 'Þ' => 'T', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a',
'ä' => 'ae', '&auml;' => 'ae', 'å' => 'a', 'ā' => 'a', 'ą' => 'a', 'ă' => 'a',
'æ' => 'ae', 'ç' => 'c', 'ć' => 'c', 'č' => 'c', 'ĉ' => 'c', 'ċ' => 'c',
'ď' => 'd', 'đ' => 'd', 'ð' => 'd', 'è' => 'e', 'é' => 'e', 'ê' => 'e',
'ë' => 'e', 'ē' => 'e', 'ę' => 'e', 'ě' => 'e', 'ĕ' => 'e', 'ė' => 'e',
'ƒ' => 'f', 'ĝ' => 'g', 'ğ' => 'g', 'ġ' => 'g', 'ģ' => 'g', 'ĥ' => 'h',
'ħ' => 'h', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ī' => 'i',
'ĩ' => 'i', 'ĭ' => 'i', 'į' => 'i', 'ı' => 'i', 'ij' => 'ij', 'ĵ' => 'j',
'ķ' => 'k', 'ĸ' => 'k', 'ł' => 'l', 'ľ' => 'l', 'ĺ' => 'l', 'ļ' => 'l',
'ŀ' => 'l', 'ñ' => 'n', 'ń' => 'n', 'ň' => 'n', 'ņ' => 'n', 'ʼn' => 'n',
'ŋ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'oe',
'&ouml;' => 'oe', 'ø' => 'o', 'ō' => 'o', 'ő' => 'o', 'ŏ' => 'o', 'œ' => 'oe',
'ŕ' => 'r', 'ř' => 'r', 'ŗ' => 'r', 'š' => 's', 'ù' => 'u', 'ú' => 'u',
'û' => 'u', 'ü' => 'ue', 'ū' => 'u', '&uuml;' => 'ue', 'ů' => 'u', 'ű' => 'u',
'ŭ' => 'u', 'ũ' => 'u', 'ų' => 'u', 'ŵ' => 'w', 'ý' => 'y', 'ÿ' => 'y',
'ŷ' => 'y', 'ž' => 'z', 'ż' => 'z', 'ź' => 'z', 'þ' => 't', 'ß' => 'ss',
'ſ' => 'ss', 'ый' => 'iy', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G',
'Д' => 'D', 'Е' => 'E', 'Ё' => 'YO', 'Ж' => 'ZH', 'З' => 'Z', 'И' => 'I',
'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',
'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F',
'Х' => 'H', 'Ц' => 'C', 'Ч' => 'CH', 'Ш' => 'SH', 'Щ' => 'SCH', 'Ъ' => '',
'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'YU', 'Я' => 'YA', 'а' => 'a',
'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo',
'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l',
'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's',
'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch',
'ш' => 'sh', 'щ' => 'sch', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e',
'ю' => 'yu', 'я' => 'ya'
];
$text = strtr($text, $replace);
$text = preg_replace('~[^\\pL\d.]+~u', '-', $text);
$text = trim($text, '-');
$text = preg_replace('~[^-\w.]+~', '', $text);
return strtolower($text);
}
/*
* Основной метод
*/
/**
* @throws \Exception
*/
public function run(){
//Получение дефолтного языка polylang
if(empty($_POST['lang'])){
$opts = $this->getPolylangSettings();
if(!$opts){
die('Не удалось получить настройки плагина Polylang');
}
$lang = !empty($opts['default_lang']) ? $opts['default_lang'] : 'en';
}else{
$lang = $_POST['lang'];
}
if(empty($_POST['title'])) {
die('Отсутствует заголовок у записи');
}
//Проверка дубликатов по заголовку поста
if( $this->checkPostExist($_POST['title']) ){
die('Публикация с таким заголовком уже присутствует');
}
/*
* Проверяем наличие языка по его коду. Если языке нет, то добавляем и обнуляем transient _transient_pll_languages_list
*/
$author = 'admin';
if(!empty($_POST['author'])){
$author = $_POST['author'];
}
//Добавляем язык на случае если его нет
$lang_id = $this->getLangId($lang);
if(!$lang_id){
$lang_id = $this->addLang($lang);
}
//Проверяем наличие юзера и создаем если не найден
$user_id = $this->getUserId($author);
if(!$user_id){
$user_id = $this->addUser($author);
}
//Проверяем даты. Приводим к стандартному формату.
$date = $modified = '';
if(!empty($_POST['date'])){
$date = $_POST['date'];
}
if(!empty($_POST['modified'])){
$modified = $_POST['modified'];
}
$date = PolylangManuallyPostAdd::normalizeDate($date);
$modified = empty($modified) ? $this->addHours($date) : PolylangManuallyPostAdd::normalizeDate($modified);
if( empty($_POST['content']) ){
die('Не передан параметр `content`');
}
if( empty($_POST['src']) ){
die('Не передан параметр `src`');
}
$type = 'post';
if(!empty($_POST['type']) || ($_POST['type'] === 'post' || $_POST['type'] === 'page') ){
$type = $_POST['type'];
}
$cate = '';
if(!empty($_POST['cate'])){
$cate = $_POST['cate'];
}
$img = '';
if(!empty($_POST['img'])){
$img = $_POST['img'];
}
$arr = [
'post_author' => $user_id,
'post_date' => $date,
'post_content' => $_POST['content'],
'post_title' => $_POST['title'],
'pinged' => $_POST['src'],
'post_modified' => $modified,
'guid' => '',
'post_type' => $type === 'page' ? 'page' : 'post',
];
$post_id = $this->addPost($arr);
$this->setLang($lang_id, $post_id, $_POST['src']);
//if(!empty($img)) {
// $image_id = $this->loadImage($img, $user_id);
// $this->applyPostCover($post_id, $image_id);
//}
if(!empty($cate)) {
$cats = $this->checkAndCreateCats($cate, $lang);
foreach ($cats as $cat) {
$this->applyPostCat($post_id, $cat);
}
}
echo 'success';
}
}
$class = new PolylangManuallyPostAdd();
try {
$class->run();
} catch (Exception $e) {
die($e);
}
/*
$lang = "ru"; // для теста в Polylang добавьте 5 языков основной en и далее de, pl, es, cz, pt и при тест импорте чередуйте эти коды языка
$title = "Was ist Lorem Ipsum - ru?";
$cate = "Test cate|Sub cate|Sub sub cate";
$author = "Bob";
$date = "2022-05-21_16:36"; // для каждого языка в будущем время будет отличаться в пару минут
$modified = "2022-05-21_17:39";
$content = "<p><strong>Lorem Ipsum</strong> ist ein einfacher Demo-Text für die Print- und Schriftindustrie. Lorem Ipsum ist in der Industrie bereits der Standard Demo-Text seit 1500, als ein unbekannter Schriftsteller eine Hand voll Wörter nahm und diese durcheinander warf um ein Musterbuch zu erstellen. Es hat nicht nur 5 Jahrhunderte überlebt, sondern auch in Spruch in die elektronische Schriftbearbeitung geschafft (bemerke, nahezu unverändert). Bekannt wurde es 1960, mit dem erscheinen von \"Letraset\", welches Passagen von Lorem Ipsum enhielt, so wie Desktop Software wie Aldus PageMaker - ebenfalls mit Lorem Ipsum.</p>";
$type = "post"; // можно и page
$pw = "megasuperpass";
$src = "contabo.com/blog/plesk-backup-manager/";
$img = "http://127.0.0.1/wp-content/uploads/2022/05/photo_2021-09-19_16-01-07.jpg"; // для теста любую картинку из своей папки сайта укажите
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment