Page 2 of 4
Re: Tags Custom Vars
Posted: Tue Jul 29, 2025 8:51 pm
by Semen_ssr
Я конечно могу обложить Смарт плагинами)))
Code: Select all
<?php
// 🐞 Дебаг
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// 🔧 База
$config["db_server"] = 'localhost';
$config["db_username"] = 'iam_user';
$config["db_password"] = 'password';
$config["db_database"] = 'mysite_base';
$mysqli = new mysqli(
$config["db_server"],
$config["db_username"],
$config["db_password"],
$config["db_database"]
);
$mysqli->set_charset("utf8mb4");
if ($mysqli->connect_error) {
die("<b class='text-red-600'>Ошибка подключения к базе данных:</b> " . $mysqli->connect_error);
}
// 🪵 Лог
$log_messages = [];
// 📦 Создание таблицы
$mysqli->query("
CREATE TABLE IF NOT EXISTS custom_tag (
tag_id INT PRIMARY KEY,
tag_name VARCHAR(255) NOT NULL,
tag_title VARCHAR(255),
tag_description TEXT
)
");
// 💾 Обработка сохранения одного тега
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['tag_id'])) {
$tag_id = (int) $_POST['tag_id'];
$tag_name = $mysqli->real_escape_string($_POST['tag_name']);
$tag_title = $mysqli->real_escape_string($_POST['tag_title']);
$tag_description = $mysqli->real_escape_string($_POST['tag_description']);
$sql = "
INSERT INTO custom_tag (tag_id, tag_name, tag_title, tag_description)
VALUES ($tag_id, '$tag_name', '$tag_title', '$tag_description')
ON DUPLICATE KEY UPDATE
tag_title = VALUES(tag_title),
tag_description = VALUES(tag_description)
";
if ($mysqli->query($sql)) {
$log_messages[] = ['ok', "✅ Обновлено: <strong>$tag_name</strong> (ID: $tag_id)"];
} else {
$log_messages[] = ['error', "❌ Ошибка при сохранении <strong>$tag_name</strong>: " . $mysqli->error];
}
}
// 📥 Загрузка тегов
$result = $mysqli->query("
SELECT r.tag_id, r.tag_name,
c.tag_title, c.tag_description
FROM rot_tags r
LEFT JOIN custom_tag c ON r.tag_id = c.tag_id
WHERE r.status = 'active'
ORDER BY r.tag_name ASC
");
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Редактор тегов</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 text-gray-800 p-6">
<h2 class="text-2xl font-bold mb-4">Редактирование Title и Description для активных тегов</h2>
<?php foreach ($log_messages as $log): ?>
<?php $type = $log[0]; $msg = $log[1]; ?>
<div class="mb-2 p-3 rounded <?= $type === 'ok' ? 'bg-green-100 border-l-4 border-green-500' : 'bg-red-100 border-l-4 border-red-500' ?>">
<?= $msg ?>
</div>
<?php endforeach; ?>
<div class="grid grid-cols-1 gap-4">
<?php while ($row = $result->fetch_assoc()): ?>
<form method="post" class="bg-white shadow rounded p-4 border border-gray-200">
<input type="hidden" name="tag_id" value="<?= $row['tag_id'] ?>">
<input type="hidden" name="tag_name" value="<?= htmlspecialchars($row['tag_name']) ?>">
<div class="mb-2">
<label class="block text-sm font-medium text-gray-600">Tag name</label>
<div class="mt-1 text-blue-800 font-semibold"><?= htmlspecialchars($row['tag_name']) ?></div>
</div>
<div class="mb-2">
<label class="block text-sm font-medium text-gray-600" for="title_<?= $row['tag_id'] ?>">Title</label>
<input type="text" name="tag_title" id="title_<?= $row['tag_id'] ?>" value="<?= htmlspecialchars($row['tag_title'] ?? '') ?>"
class="mt-1 block w-full border border-gray-300 rounded p-2 shadow-sm focus:ring-blue-500 focus:border-blue-500 text-sm">
</div>
<div class="mb-3">
<label class="block text-sm font-medium text-gray-600" for="desc_<?= $row['tag_id'] ?>">Description</label>
<textarea name="tag_description" id="desc_<?= $row['tag_id'] ?>" rows="3"
class="mt-1 block w-full border border-gray-300 rounded p-2 shadow-sm focus:ring-blue-500 focus:border-blue-500 text-sm"><?= htmlspecialchars($row['tag_description'] ?? '') ?></textarea>
</div>
<button type="submit" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-1.5 rounded text-sm font-medium">Сохранить</button>
</form>
<?php endwhile; ?>
</div>
</body>
</html>
Но я могу не остановится и написать CMS, а это не хорошо, я буду скучать )))
ЗЫ: и это уже работает )
ЗЫЫ: и с апдейтами это никак не скажется, не думаю что rot_tags за столько лет изменится или id, или структура name, как порешаем ?))))
Re: Tags Custom Vars
Posted: Tue Jul 29, 2025 9:52 pm
by Ling
Semen_ssr wrote: Tue Jul 29, 2025 8:51 pm
Я конечно могу обложить Смарт плагинами)))
Code: Select all
<?php
// 🐞 Дебаг
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// 🔧 База
$config["db_server"] = 'localhost';
$config["db_username"] = 'iam_user';
$config["db_password"] = 'password';
$config["db_database"] = 'mysite_base';
$mysqli = new mysqli(
$config["db_server"],
$config["db_username"],
$config["db_password"],
$config["db_database"]
);
$mysqli->set_charset("utf8mb4");
if ($mysqli->connect_error) {
die("<b class='text-red-600'>Ошибка подключения к базе данных:</b> " . $mysqli->connect_error);
}
// 🪵 Лог
$log_messages = [];
// 📦 Создание таблицы
$mysqli->query("
CREATE TABLE IF NOT EXISTS custom_tag (
tag_id INT PRIMARY KEY,
tag_name VARCHAR(255) NOT NULL,
tag_title VARCHAR(255),
tag_description TEXT
)
");
// 💾 Обработка сохранения одного тега
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['tag_id'])) {
$tag_id = (int) $_POST['tag_id'];
$tag_name = $mysqli->real_escape_string($_POST['tag_name']);
$tag_title = $mysqli->real_escape_string($_POST['tag_title']);
$tag_description = $mysqli->real_escape_string($_POST['tag_description']);
$sql = "
INSERT INTO custom_tag (tag_id, tag_name, tag_title, tag_description)
VALUES ($tag_id, '$tag_name', '$tag_title', '$tag_description')
ON DUPLICATE KEY UPDATE
tag_title = VALUES(tag_title),
tag_description = VALUES(tag_description)
";
if ($mysqli->query($sql)) {
$log_messages[] = ['ok', "✅ Обновлено: <strong>$tag_name</strong> (ID: $tag_id)"];
} else {
$log_messages[] = ['error', "❌ Ошибка при сохранении <strong>$tag_name</strong>: " . $mysqli->error];
}
}
// 📥 Загрузка тегов
$result = $mysqli->query("
SELECT r.tag_id, r.tag_name,
c.tag_title, c.tag_description
FROM rot_tags r
LEFT JOIN custom_tag c ON r.tag_id = c.tag_id
WHERE r.status = 'active'
ORDER BY r.tag_name ASC
");
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Редактор тегов</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 text-gray-800 p-6">
<h2 class="text-2xl font-bold mb-4">Редактирование Title и Description для активных тегов</h2>
<?php foreach ($log_messages as $log): ?>
<?php $type = $log[0]; $msg = $log[1]; ?>
<div class="mb-2 p-3 rounded <?= $type === 'ok' ? 'bg-green-100 border-l-4 border-green-500' : 'bg-red-100 border-l-4 border-red-500' ?>">
<?= $msg ?>
</div>
<?php endforeach; ?>
<div class="grid grid-cols-1 gap-4">
<?php while ($row = $result->fetch_assoc()): ?>
<form method="post" class="bg-white shadow rounded p-4 border border-gray-200">
<input type="hidden" name="tag_id" value="<?= $row['tag_id'] ?>">
<input type="hidden" name="tag_name" value="<?= htmlspecialchars($row['tag_name']) ?>">
<div class="mb-2">
<label class="block text-sm font-medium text-gray-600">Tag name</label>
<div class="mt-1 text-blue-800 font-semibold"><?= htmlspecialchars($row['tag_name']) ?></div>
</div>
<div class="mb-2">
<label class="block text-sm font-medium text-gray-600" for="title_<?= $row['tag_id'] ?>">Title</label>
<input type="text" name="tag_title" id="title_<?= $row['tag_id'] ?>" value="<?= htmlspecialchars($row['tag_title'] ?? '') ?>"
class="mt-1 block w-full border border-gray-300 rounded p-2 shadow-sm focus:ring-blue-500 focus:border-blue-500 text-sm">
</div>
<div class="mb-3">
<label class="block text-sm font-medium text-gray-600" for="desc_<?= $row['tag_id'] ?>">Description</label>
<textarea name="tag_description" id="desc_<?= $row['tag_id'] ?>" rows="3"
class="mt-1 block w-full border border-gray-300 rounded p-2 shadow-sm focus:ring-blue-500 focus:border-blue-500 text-sm"><?= htmlspecialchars($row['tag_description'] ?? '') ?></textarea>
</div>
<button type="submit" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-1.5 rounded text-sm font-medium">Сохранить</button>
</form>
<?php endwhile; ?>
</div>
</body>
</html>
Но я могу не остановится и написать CMS, а это не хорошо, я буду скучать )))
ЗЫ: и это уже работает )
ЗЫЫ: и с апдейтами это никак не скажется, не думаю что rot_tags за столько лет изменится или id, или структура name, как порешаем ?))))
Донт пуш зэ хорсес )))
Костыли нам не надо
-----------------------------
Для Админа:
Категории - это , условно, ВЧ запросы
там используются все поля для заполнения, плюс 10-20 переменных
-----------
Теги - это СЧ или НЧ запросы .. там можно слегка (2-3 переменных) заморочиться, добавивив пару уникальных предложений, и уже это для Гугла не шаблонно выглядит
Понятно, что для этого, скорее всего, придётся внедрять новую таблицу
Ждем
Re: Tags Custom Vars
Posted: Wed Jul 30, 2025 3:30 pm
by Semen_ssr
Re: Tags Custom Vars
Posted: Thu Jul 31, 2025 8:54 am
by Semen_ssr
Точно не надо?
Code: Select all
<?php
// 🤞 Дебаг
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$config = [
"db_server" => 'localhost',
"db_username" => 'user',
"db_password" => 'pass',
"db_database" => 'db'
];
$mysqli = new mysqli(
$config["db_server"],
$config["db_username"],
$config["db_password"],
$config["db_database"]
);
$mysqli->set_charset("utf8mb4");
if ($mysqli->connect_error) {
die("<b class='text-red-600'>Ошибка подключения к базе данных:</b> " . $mysqli->connect_error);
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['tag_id'])) {
$tag_id = (int) $_POST['tag_id'];
$tag_name = $mysqli->real_escape_string($_POST['tag_name']);
$tag_title = $mysqli->real_escape_string($_POST['tag_title']);
$tag_description = $mysqli->real_escape_string($_POST['tag_description']);
$tag_h1 = $mysqli->real_escape_string($_POST['tag_h1']);
$sql = "
INSERT INTO custom_tag (tag_id, tag_name, tag_title, tag_description, tag_h1)
VALUES ($tag_id, '$tag_name', '$tag_title', '$tag_description', '$tag_h1')
ON DUPLICATE KEY UPDATE
tag_title = VALUES(tag_title),
tag_description = VALUES(tag_description),
tag_h1 = VALUES(tag_h1)
";
if (!$mysqli->query($sql)) {
file_put_contents(__DIR__ . '/debug_error.log', date("Y-m-d H:i:s") . " | Ошибка: " . $mysqli->error . "\n", FILE_APPEND);
http_response_code(500);
echo "Ошибка: " . $mysqli->error;
exit;
} else {
echo "OK";
exit;
}
}
$result = $mysqli->query("SELECT r.tag_id, r.tag_name, c.tag_title, c.tag_description, c.tag_h1 FROM rot_tags r LEFT JOIN custom_tag c ON r.tag_id = c.tag_id WHERE r.status = 'active' ORDER BY r.tag_name ASC");
?><!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Редактор тегов — Custom Tag Manager</title>
<meta name="robots" content="noindex, nofollow">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://cdn.tailwindcss.com"></script>
<style>
.tag-form[data-filled="no"] { border-color: #f87171 !important; background-color: #fef2f2; }
.tag-form[data-filled="yes"] { border-color: #4ade80 !important; background-color: #f0fdf4; }
.input-field { width: 100%; padding: 0.5rem; font-size: 0.875rem; border-radius: 0.375rem; border: 1px solid #ccc; margin-top: 0.25rem; }
textarea.input-field { height: 5rem; resize: none; }
.status-msg { font-size: 0.8rem; margin-top: 4px; }
</style>
</head>
<body class="bg-gray-100 text-gray-800 p-6">
<h1 class="text-3xl font-bold text-gray-900 mb-6">Редактор мета-тегов для активных тегов</h1>
<div class="mb-4 flex flex-wrap gap-2 items-center">
<button onclick="filterTags('all')" class="px-3 py-1 bg-gray-300 rounded text-sm">Все</button>
<button onclick="filterTags('empty')" class="px-3 py-1 bg-red-300 rounded text-sm">Пустые</button>
<button onclick="filterTags('filled')" class="px-3 py-1 bg-green-300 rounded text-sm">Заполненные</button>
<button onclick="clearAllFields()" class="px-3 py-1 bg-yellow-200 rounded text-sm">Очистить всё</button>
<div id="counter" class="ml-auto text-sm text-gray-600"></div>
<input type="search" id="tagSearch" placeholder="Поиск по названию…" class="px-3 py-1.5 border rounded text-sm w-64 focus:ring-2 focus:ring-blue-400">
</div>
<div class="grid grid-cols-1 gap-4" id="formContainer">
<?php while ($row = $result->fetch_assoc()):
$is_filled = trim((string)($row['tag_title'] ?? '')) !== '' && trim((string)($row['tag_description'] ?? '')) !== '' && trim((string)($row['tag_h1'] ?? '')) !== '';
$filled_status = $is_filled ? 'yes' : 'no';
?>
<form class="tag-form bg-white shadow rounded p-4 border border-gray-200" data-filled="<?= $filled_status ?>" data-name="<?= htmlspecialchars($row['tag_name']) ?>">
<input type="hidden" name="tag_id" value="<?= $row['tag_id'] ?>">
<input type="hidden" name="tag_name" value="<?= htmlspecialchars($row['tag_name']) ?>">
<div class="mb-2">
<label class="block text-sm font-medium text-gray-600">Tag name</label>
<div class="mt-1 text-blue-800 font-semibold"><?= htmlspecialchars($row['tag_name']) ?></div>
</div>
<div class="mb-2">
<label class="block text-sm font-medium text-gray-600">Title</label>
<input type="text" name="tag_title" value="<?= htmlspecialchars($row['tag_title'] ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8', false) ?>" class="input-field">
</div>
<div class="mb-2">
<label class="block text-sm font-medium text-gray-600">Description</label>
<textarea name="tag_description" class="input-field"><?= htmlspecialchars($row['tag_description'] ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8', false) ?></textarea>
</div>
<div class="mb-2">
<label class="block text-sm font-medium text-gray-600">H1</label>
<input type="text" name="tag_h1" value="<?= htmlspecialchars($row['tag_h1'] ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8', false) ?>" class="input-field">
</div>
<div class="flex items-center gap-2">
<button type="submit" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-1.5 rounded text-sm font-medium">Сохранить</button>
<button type="button" onclick="previewSnippet(this)" class="bg-gray-200 text-gray-800 px-3 py-1 rounded text-xs">👁 Предпросмотр</button>
<div class="status-msg text-gray-500"></div>
</div>
</form>
<?php endwhile; ?>
</div>
<div id="previewModal" class="fixed inset-0 bg-black bg-opacity-50 hidden items-center justify-center z-50">
<div class="bg-white rounded p-6 max-w-xl w-full relative">
<button onclick="closePreview()" class="absolute top-2 right-2 text-gray-500">✖</button>
<h2 class="text-lg font-bold mb-2 text-gray-700">Google Snippet Preview</h2>
<div class="border-t pt-3">
<a class="text-blue-700 text-sm mb-1 underline block" id="preview-url" href="#" target="_blank" rel="noopener noreferrer">https://manfloat.com/tags/example/</a>
<div class="text-xl text-green-800 font-semibold leading-tight" id="preview-title">Title</div>
<div class="text-sm text-gray-700 mt-1" id="preview-desc">Description…</div>
</div>
</div>
</div>
<script>
function updateCounter() {
const all = document.querySelectorAll('.tag-form').length;
const filled = [...document.querySelectorAll('.tag-form')].filter(f => f.dataset.filled === 'yes').length;
const empty = all - filled;
document.getElementById('counter').textContent = `Всего: ${all} | Заполнено: ${filled} | Пустые: ${empty}`;
}
function filterTags(type) {
document.querySelectorAll(".tag-form").forEach(form => {
const filled = form.dataset.filled;
form.style.display = (type === "all" || (type === "filled" && filled === "yes") || (type === "empty" && filled === "no")) ? "block" : "none";
});
updateCounter();
}
function clearAllFields() {
if (!confirm('Очистить все поля во всех тегах?')) return;
document.querySelectorAll(".tag-form").forEach(form => {
form.querySelectorAll("input[type='text'], textarea").forEach(el => el.value = '');
form.dataset.filled = 'no';
});
updateCounter();
}
document.getElementById("tagSearch").addEventListener("input", function () {
const val = this.value.toLowerCase();
document.querySelectorAll(".tag-form").forEach(form => {
const name = form.dataset.name.toLowerCase();
form.style.display = name.includes(val) ? "block" : "none";
});
updateCounter();
});
document.querySelectorAll(".tag-form").forEach(form => {
form.addEventListener("submit", function (e) {
e.preventDefault();
const msg = form.querySelector(".status-msg");
const fd = new FormData(form);
msg.textContent = "Сохраняется...";
fetch(location.href, { method: "POST", body: fd })
.then(res => res.ok ? res.text() : Promise.reject(res.status))
.then(() => {
msg.textContent = "✔ Сохранено";
const filled = form.querySelector("input[name='tag_title']").value.trim() !== '' &&
form.querySelector("textarea[name='tag_description']").value.trim() !== '' &&
form.querySelector("input[name='tag_h1']").value.trim() !== '';
form.dataset.filled = filled ? 'yes' : 'no';
updateCounter();
})
.catch(() => msg.textContent = "⚠ Ошибка при сохранении");
});
});
function previewSnippet(button) {
const form = button.closest("form");
const title = form.querySelector("input[name='tag_title']").value || '—';
const desc = form.querySelector("textarea[name='tag_description']").value || '—';
let rawSlug = form.querySelector("input[name='tag_name']").value || 'example';
let slug = rawSlug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '');
const url = `https://manfloat.com/tags/${slug}/`;
const link = document.getElementById("preview-url");
link.textContent = url;
link.href = url;
document.getElementById("preview-title").textContent = title;
document.getElementById("preview-desc").textContent = desc;
document.getElementById("previewModal").classList.remove("hidden");
}
function closePreview() {
document.getElementById("previewModal").classList.add("hidden");
}
updateCounter();
</script>
</body>
</html>
А если так?

Re: Tags Custom Vars
Posted: Thu Jul 31, 2025 10:56 am
by admin
это не будет кешить и как заполнять поля? прямо в базе? )
Re: Tags Custom Vars
Posted: Thu Jul 31, 2025 1:39 pm
by Semen_ssr
admin wrote: Thu Jul 31, 2025 10:56 am
это не будет кешить и как заполнять поля? прямо в базе? )
От Вас я такого не ожидал)))
Нужно сохранить в файлик, положить в любую папку, дальше файл все расскажет и покажет сам ) Може даже будешь удивлен )
А вообще я просто ветку апаю, пока меня не пошлют
По поводу кеша, можно отдельно кэшировать PHP-части и подрубать preload/priority hints
Code: Select all
<?php
if (!$admin_is_convinced) {
echo "Posting again...\n";
keep_posting();
}
Re: Tags Custom Vars
Posted: Fri Aug 01, 2025 10:52 am
by Ling
Semen_ssr, нужно учитывать, как выглядит таблица rot_tags, когда внедрены языковые переводы... там сразу прибавляется N полей, в которых содержатся языковые (переведённые) версии названий тегов, где N - это количество внедренных языков (около 20-30)
Если мы внедрим, допустим, 3 переменные для тегов, то это будет дополнительно + 3N (60-90) поля... Таблица rot_tags получится очень раздутая по структуре (условно - очень много столбиков будет)
Скорее всего, надо будет дополнительную таблицу внедрять со значениями переменных.. хотя разработчику виднее, как эти данные будут храниться
-----------------
Админ, подумайте как это возможно реализовать
Тема, всё-таки, очень интересная... и дает огромнейшую возможность уникализации контента
Заранее спасибо
Re: Tags Custom Vars
Posted: Fri Aug 01, 2025 12:39 pm
by admin
да, суть ясна
я доделаю на днях
Re: Tags Custom Vars
Posted: Fri Aug 01, 2025 1:17 pm
by Semen_ssr
Ling, я своего добился, ты не вычитал example, он вообще другую таблицу создает
Сказано же - ждите.

Re: Tags Custom Vars
Posted: Wed Aug 06, 2025 4:08 pm
by admin
ок, давайте смотреть первую версию
добавил в ?operation=rotation&sub=rot_tube&subsub=rot_cms_custom_vars&
тестировал в темплейтах как
Code: Select all
name: <!--TAG_NAME--> <br>
name af <!--TAG_NAME::af--> <br>
custom: <!--TAG_CUSTOM_VAR_TEST--> <br>
custom2: <!--TAG_CUSTOM_VAR_TEST2-->