본문 바로가기

IT와 과학/블로그 자동화

[죽어가는 블로그 살려보기] ChatGPT 가 알려주는 티스토리 스킨 커스터마이징 방법

728x90
반응형

안녕하세요 

 

 

블로그 수익 좀 올려보려는데 쉽지가 않네요. 다들 수익이 좀 나시는지요? 

 

구글 서치콘솔에서 막 색인생성이 안된다고 해서 여기 저기 찾다보니 

 

1. 티스토리 스킨 수정해서 아래 처럼 소스를 넣어놓아야 하는게 좋다고 ChatGPT와 몇일간의 상담? 끝에 정리했습니다.

 

특별히 반응형 스킨을 쓰는 분들은 구글 서치콘솔이 /m/번호 붙은거는 색인생성 못한다고 하는거가 있으서 마음이 상했는데 그거도 깔끔하게 잡을 것 같습니다. 

 

만들어 놓은 글은 많은거 같은데 구글에서 색인안만들어주는것 같아서 섭섭하셨던 분들 도움이 되시길 바랍니다. 

 

 

[아래 내용을 바꿔치기 하시면 됩니다. 여기 소유권검증 부분은 본인들 블로그에 맞는부분으로 교체해야 합니다.]

[중간중간 본인 블로그에 해당하는 부분은 교체하세요]

 

<head>
  <!-- 기본 세팅 -->
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, minimum-scale=1.0, maximum-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />

  <!-- 소유권/검증 -->
  <meta name="google-site-verification" content="****************************" />
  <meta name="naver-site-verification" content="*******************************" />
  <meta name="msvalidate.01" content="**************************" />

  <!-- 기본 SEO -->
  <title>[죽어가는 블로그 살려보기] ChatGPT 가 알려주는 티스토리 스킨 커스터마이징 방법</title>
  <meta name="title" content="[죽어가는 블로그 살려보기] ChatGPT 가 알려주는 티스토리 스킨 커스터마이징 방법 :: TechOracle - 코드와 AI로 분석하고 예측하는 시장과 세상" />
  <meta name="robots" content="index,follow,max-snippet:-1,max-image-preview:large,max-video-preview:-1" />
  <meta name="author" content="신고해석자 | Signal of My Life" />
  <meta name="description" content="일상 신호를 읽어주는 마음 컨설팅 블로그" />
  <meta name="keywords" content="신호해석, 마음컨설팅, 일상심리, 스트레스관리" />

  <!-- Canonical(초기값) + RSS -->
  <link id="canonical" rel="canonical" href="https://iotnbigdata.tistory.com//808" />
  <link rel="alternate" type="application/rss+xml" title="TechOracle - 코드와 AI로 분석하고 예측하는 시장과 세상" href="https://iotnbigdata.tistory.com/rss" />

  <!-- Open Graph -->
  <meta property="og:site_name" content="Signal of My Life" />
  <meta property="og:type" content="website" />
  <meta property="og:title" content="[죽어가는 블로그 살려보기] ChatGPT 가 알려주는 티스토리 스킨 커스터마이징 방법" />
  <meta property="og:description" content="일상 신호를 읽어주는 마음 컨설팅" />
  <meta property="og:url" content="https://iotnbigdata.tistory.com//808" />

  <!-- Twitter -->
  <meta name="twitter:card" content="summary_large_image" />
  <meta name="twitter:title" content="[죽어가는 블로그 살려보기] ChatGPT 가 알려주는 티스토리 스킨 커스터마이징 방법" />
  <meta name="twitter:description" content="일상 신호를 읽어주는 마음 컨설팅" />

  <!-- Assets -->
  <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/xeicon@2.3.3/xeicon.min.css">
  <link rel="stylesheet" href="./style.css" />
  <script src="//t1.daumcdn.net/tistory_admin/lib/jquery/jquery-1.12.4.min.js"></script>
  <script src="//t1.daumcdn.net/tistory_admin/assets/skin/common/vh-check.min.js"></script>
  <script src="./images/common.js" defer></script>
  <script>(function(){ try{ vhCheck(); }catch(e){} }());</script>

  <!-- URL/모바일 정규화 + Canonical/OG/Robots 보정 (모바일 동적 수정 대응판) -->
  <script>
  (function () {
    function compute() {
      var loc = location;
      var path = loc.pathname || "/";
      var isMobile = /^\/m(?:\/|$)/.test(path);
      var cleanPath = path.replace(/^\/m(\/?)/, "/") || "/";

      // 홈/카테고리/태그(목록) 페이지만 일부 쿼리 보존
      var isHome = cleanPath === "/";
      var isCategory = /^\/category\//.test(cleanPath);
      var isTag = /^\/tag\//.test(cleanPath);
      var isListing = isHome || isCategory || isTag;

      var sp = new URLSearchParams(loc.search);
      var keep = new URLSearchParams();
      if (sp.has("page")) keep.set("page", sp.get("page"));
      if (isListing) ["category","tag"].forEach(function(k){ if (sp.has(k)) keep.set(k, sp.get(k)); });

      var canonicalAbs = loc.origin + cleanPath + (keep.toString() ? ("?" + keep.toString()) : "");
      return { canonicalAbs: canonicalAbs, isMobile: isMobile };
    }

    function apply() {
      try {
        var cfg = compute();

        // canonical (하나만 유지)
        var links = document.querySelectorAll('link[rel="canonical"]');
        var link = links[0];
        if (!link) {
          link = document.createElement("link");
          link.rel = "canonical";
          document.head.appendChild(link);
        }
        link.href = cfg.canonicalAbs;
        for (var i = 1; i < links.length; i++) {
          links[i].parentNode && links[i].parentNode.removeChild(links[i]);
        }

        // robots (모바일은 noindex)
        var robots = document.querySelector('meta[name="robots"]');
        if (!robots) {
          robots = document.createElement("meta");
          robots.name = "robots";
          document.head.appendChild(robots);
        }
        robots.setAttribute("content",
          cfg.isMobile
            ? "noindex,follow"
            : "index,follow,max-snippet:-1,max-image-preview:large,max-video-preview:-1"
        );

        // og:url 갱신
        var ogUrls = document.querySelectorAll('meta[property="og:url"], meta[name="og:url"]');
        if (ogUrls.length === 0) {
          var m = document.createElement("meta");
          m.setAttribute("property", "og:url");
          document.head.appendChild(m);
          ogUrls = [m];
        }
        ogUrls.forEach(function (m) { m.setAttribute("content", cfg.canonicalAbs); });

        // og:type — 글 상세면 article
        var ogType = document.querySelector('meta[property="og:type"]');
        if (!ogType) {
          ogType = document.createElement("meta");
          ogType.setAttribute("property", "og:type");
          document.head.appendChild(ogType);
        }
        var isArticle =
          (window.T && window.T.entryInfo && window.T.entryInfo.entryId) ||
          /(entry|article|post|page|tt-body-(?:page|article|entry))/i.test((document.body && document.body.id) || "");
        ogType.setAttribute("content", isArticle ? "article" : "website");

        // description 중복 제거
        var descs = document.querySelectorAll('meta[name="description"]');
        for (var j = 1; j < descs.length; j++) {
          descs[j].parentNode && descs[j].parentNode.removeChild(descs[j]);
        }

        // JSON-LD 내부 URL 정규화
        function toCanon(u) {
          try {
            var a = new URL(u, location.origin);
            a.pathname = (a.pathname || "/").replace(/^\/m(\/?)/, "/") || "/";
            var q = new URLSearchParams(a.search);
            var keep = new URLSearchParams();
            if (q.has("page")) keep.set("page", q.get("page"));
            var p = a.pathname;
            var listing = (p === "/" || /^\/category\//.test(p) || /^\/tag\//.test(p));
            if (listing) ["category","tag"].forEach(function(k){ if(q.has(k)) keep.set(k, q.get(k)); });
            a.search = keep.toString() ? ("?" + keep.toString()) : "";
            a.hash = "";
            return a.href;
          } catch (e) { return u; }
        }
        document.querySelectorAll('script[type="application/ld+json"]').forEach(function (s) {
          try {
            var d = JSON.parse(s.textContent);
            (function walk(o) {
              if (!o || typeof o !== "object") return;
              if (typeof o.url === "string") o.url = toCanon(o.url);
              if (typeof o["@id"] === "string") o["@id"] = toCanon(o["@id"]);
              if (o.mainEntityOfPage) {
                if (typeof o.mainEntityOfPage === "string") o.mainEntityOfPage = toCanon(o.mainEntityOfPage);
                else if (typeof o.mainEntityOfPage === "object" && typeof o.mainEntityOfPage["@id"] === "string") {
                  o.mainEntityOfPage["@id"] = toCanon(o.mainEntityOfPage["@id"]);
                }
              }
              Object.keys(o).forEach(function (k) { walk(o[k]); });
            })(d);
            s.textContent = JSON.stringify(d);
          } catch (e) {}
        });
      } catch (e) {}
    }

    // 1회 적용
    if (document.readyState === "loading") {
      document.addEventListener("DOMContentLoaded", apply);
    } else {
      apply();
    }

    // head 변동 감지(모바일 번들 주입 대응)
    var mo = new MutationObserver(function (muts) {
      for (var i = 0; i < muts.length; i++) {
        var m = muts[i];
        if (m.type === "childList" || m.type === "attributes") {
          clearTimeout(apply._t);
          apply._t = setTimeout(apply, 50);
          break;
        }
      }
    });
    try {
      mo.observe(document.head, {
        subtree: true,
        childList: true,
        attributes: true,
        attributeFilter: ["content", "href", "property", "name"]
      });
    } catch (e) {}
  })();
  </script>
</head>

 

 

2. 그리고 반응형 스킨은 기본적으로 모바일에도 최적화 해서 보이기 때문에 꾸미기-모바일에서 설정을 사용하지 않는 것으로 하는게 좋다고 합니다. 

 

 

도움되시기를 바랍니다.

궁금하신 사항이 있으시면 문의주시면 답변드리겠습니다. 

728x90
반응형