Tags Custom Vars

Semen_ssr
Posts: 867
Joined: Sun Apr 25, 2010 7:59 pm

Re: Tags Custom Vars

Post 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, как порешаем ?))))
Ling
Posts: 335
Joined: Wed Mar 16, 2016 12:27 pm

Re: Tags Custom Vars

Post 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 переменных) заморочиться, добавивив пару уникальных предложений, и уже это для Гугла не шаблонно выглядит
Понятно, что для этого, скорее всего, придётся внедрять новую таблицу
Ждем
Semen_ssr
Posts: 867
Joined: Sun Apr 25, 2010 7:59 pm

Re: Tags Custom Vars

Post by Semen_ssr »

quote: Донт пуш зэ хорсес )))

:lol: :lol: :lol:
Semen_ssr
Posts: 867
Joined: Sun Apr 25, 2010 7:59 pm

Re: Tags Custom Vars

Post 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>
А если так? :lol: :lol: :lol:
admin
Site Admin
Posts: 37977
Joined: Wed Sep 10, 2008 11:43 am

Re: Tags Custom Vars

Post by admin »

это не будет кешить и как заполнять поля? прямо в базе? )
Don't forget to run script update
Semen_ssr
Posts: 867
Joined: Sun Apr 25, 2010 7:59 pm

Re: Tags Custom Vars

Post by Semen_ssr »

admin wrote: Thu Jul 31, 2025 10:56 am это не будет кешить и как заполнять поля? прямо в базе? )
От Вас я такого не ожидал)))

Нужно сохранить в файлик, положить в любую папку, дальше файл все расскажет и покажет сам ) Може даже будешь удивлен )
А вообще я просто ветку апаю, пока меня не пошлют :D

По поводу кеша, можно отдельно кэшировать PHP-части и подрубать preload/priority hints

Code: Select all

<?php
if (!$admin_is_convinced) {
    echo "Posting again...\n";
    keep_posting();
}
Ling
Posts: 335
Joined: Wed Mar 16, 2016 12:27 pm

Re: Tags Custom Vars

Post by Ling »

Semen_ssr, нужно учитывать, как выглядит таблица rot_tags, когда внедрены языковые переводы... там сразу прибавляется N полей, в которых содержатся языковые (переведённые) версии названий тегов, где N - это количество внедренных языков (около 20-30)
Если мы внедрим, допустим, 3 переменные для тегов, то это будет дополнительно + 3N (60-90) поля... Таблица rot_tags получится очень раздутая по структуре (условно - очень много столбиков будет)

Скорее всего, надо будет дополнительную таблицу внедрять со значениями переменных.. хотя разработчику виднее, как эти данные будут храниться
-----------------
Админ, подумайте как это возможно реализовать

Тема, всё-таки, очень интересная... и дает огромнейшую возможность уникализации контента

Заранее спасибо
admin
Site Admin
Posts: 37977
Joined: Wed Sep 10, 2008 11:43 am

Re: Tags Custom Vars

Post by admin »

да, суть ясна

я доделаю на днях
Don't forget to run script update
Semen_ssr
Posts: 867
Joined: Sun Apr 25, 2010 7:59 pm

Re: Tags Custom Vars

Post by Semen_ssr »

Ling, я своего добился, ты не вычитал example, он вообще другую таблицу создает :D
Сказано же - ждите. ;)
admin
Site Admin
Posts: 37977
Joined: Wed Sep 10, 2008 11:43 am

Re: Tags Custom Vars

Post 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-->
Don't forget to run script update
Post Reply