投稿

ラベル(Blogger)が付いた投稿を表示しています

Blender スクリプト レンダリング画像をカメラ名を付けて保存

Quick Edit Pencil
ファイル名にアクティブなコレクション名を追加したスクリプト(3/29追記)

GPT-4o mini
import bpy
import os

# 現在のシーンを取得
scene = bpy.context.scene

# 現在のシーンのカメラを取得
camera = scene.camera

# シーン名を取得
scene_name = scene.name

# カメラ名を取得
camera_name = camera.name

# レンダリング設定を取得
render = bpy.context.scene.render

# render.filepathが設定されているか確認
if not render.filepath:
    print("Error: render.filepath is not set. Aborting.")
else:
    # ファイル名を除いたパスを取得
    directory = os.path.dirname(render.filepath)

    # 新しいパスを設定
    new_filepath = os.path.join(directory, f"{camera_name}_{scene_name}.png")
    render.filepath = new_filepath

    # レンダリングを実行
    bpy.ops.render.render(write_still=True)
GPT-4o mini
import bpy
import os

# 現在のシーンを取得
scene = bpy.context.scene

# 現在のシーンのカメラを取得
camera = scene.camera

# シーン名を取得
scene_name = scene.name

# カメラ名を取得
camera_name = camera.name

# レンダリング設定を取得
render = bpy.context.scene.render

# render.filepathが設定されているか確認
if not render.filepath:
    print("Error: render.filepath is not set. Aborting.")
else:
    # ファイル名を除いたパスを取得
    directory = os.path.dirname(render.filepath)

    # 新しいパスを設定
    new_filepath = os.path.join(directory, f"{camera_name}_{scene_name}.png")
    render.filepath = new_filepath

    # レンダリングを実行
    bpy.ops.render.render(write_still=True)
render.filepathが設定されていない時は中止する。render.filepathが設定されているときはファイル名を除いたパスを取得して新しいパスとして使う設定にしてほしい

.
GPT-4o mini



Blenderのスクリプトを修正して、render.filepathが設定されていない場合は中止し、設定されている場合はファイル名を除いたパスを取得して新しいパスとして使用するようにすることができます。以下のスクリプトを参考にしてください。

python

コードをコピー
import bpy
import os

# 現在のシーンのカメラを取得
camera = bpy.context.scene.camera

# カメラ名を取得
camera_name = camera.name

# レンダリング設定を取得
render = bpy.context.scene.render

# render.filepathが設定されているか確認
if not render.filepath:
    print("Error: render.filepath is not set. Aborting.")
else:
    # ファイル名を除いたパスを取得
    directory = os.path.dirname(render.filepath)

    # 新しいパスを設定
    new_filepath = os.path.join(directory, f"{camera_name}.png")
    render.filepath = new_filepath

    # レンダリングを実行
    bpy.ops.render.render(write_still=True)
スクリプトの説明
カメラの取得: 現在のシーンのカメラを取得します。
render.filepathの確認: render.filepathが設定されていない場合はエラーメッセージを表示して中止します。
パスの取得: os.path.dirname()を使用して、ファイル名を除いたディレクトリパスを取得します。
新しいパスの設定: カメラ名をファイル名として新しいパスを作成し、render.filepathに設定します。
レンダリングの実行: 最後に、レンダリングを実行します。
このスクリプトをBlenderのテキストエディタにコピーして実行することで、指定した条件に従ってレンダリングを行うことができます。
import bpy

# 現在のシーンを取得
scene = bpy.context.scene

# 現在のシーンのカメラを取得
camera = scene.camera

# シーン名を取得
scene_name = scene.name

# カメラ名を取得
camera_name = camera.name

# レンダリング設定を取得
render = bpy.context.scene.render

# 出力パスを設定
render.filepath = f"D:\\Drive - Biz\\プロジェクト\\2025\\レンダリング\\{camera_name}_{scene_name}.png"  # 保存先のパスを指定

# レンダリングを実行
bpy.ops.render.render(write_still=True)
3dソフトのblenderでレンダリングした画像の名前をカメラ名として自動で保存したい時の設定を探して

.
GPT-4o mini



Blenderでレンダリングした画像をカメラ名として自動で保存する設定を行うには、以下の手順を参考にしてください。

スクリプトを使用する:
BlenderのPython APIを利用して、レンダリング時にカメラ名をファイル名として使用するスクリプトを作成します。
スクリプトの例:
以下のスクリプトをBlenderのテキストエディタにコピーして実行することで、レンダリング時にカメラ名をファイル名として保存できます。
python

コードをコピー
import bpy

# 現在のシーンのカメラを取得
camera = bpy.context.scene.camera

# カメラ名を取得
camera_name = camera.name

# レンダリング設定を取得
render = bpy.context.scene.render

# 出力パスを設定
render.filepath = f"/path/to/save/{camera_name}.png"  # 保存先のパスを指定

# レンダリングを実行
bpy.ops.render.render(write_still=True)
上記のスクリプトでは、/path/to/save/を実際の保存先のパスに変更してください。
スクリプトの実行:
スクリプトを実行することで、レンダリングされた画像がカメラ名をファイル名として指定したパスに保存されます。
自動化:
このスクリプトをBlenderの「ハンドラ」や「オペレーター」に組み込むことで、レンダリング時に自動的に実行されるように設定することも可能です。
この方法を使うことで、レンダリングした画像をカメラ名で自動保存することができます。
Gemini
import bpy
import os

# 保存先のパス
output_path = "D:\\Business\\プロジェクト\\2023\\レンダリング\\"

# アクティブなカメラの取得
camera = bpy.context.scene.camera

# カメラ名を取得
camera_name = camera.name

# シーン名を取得
scene_name = bpy.context.scene.name

# ファイル名を生成(カメラ名_シーン名.png)
file_name = camera_name + "_" + scene_name + ".png"

# 保存先のパスとファイル名を結合
file_path = os.path.join(output_path, file_name)

# レンダリング設定
bpy.context.scene.render.filepath = file_path
bpy.context.scene.render.image_settings.file_format = 'PNG'

# レンダリング実行
bpy.ops.render.render(write_still=True)

print("レンダリング完了: " + file_path)
3dソフトのblenderでレンダリングした画像の名前をカメラ名として自動で保存したい時のPythonスクリプトを書いて。保存するパスは「D:\レンダリング\」です。


はい、Blenderでレンダリングした画像の名前をカメラ名として自動で保存するPythonスクリプトは以下のようになります。

Python

import bpy
import os

# 保存先のパス
output_path = "D:\\レンダリング\\"

# アクティブなカメラの取得
camera = bpy.context.scene.camera

# カメラ名を取得
camera_name = camera.name

# ファイル名を生成
file_name = camera_name + ".png"

# 保存先のパスとファイル名を結合
file_path = os.path.join(output_path, file_name)

# レンダリング設定
bpy.context.scene.render.filepath = file_path
bpy.context.scene.render.image_settings.file_format = 'PNG'

# レンダリング実行
bpy.ops.render.render(write_still=True)

print("レンダリング完了: " + file_path)
スクリプトの使い方:

Blenderを開き、スクリプトを実行したい.blendファイルを開きます。
スクリプトエディタを開きます(画面上部の「スクリプト」タブをクリック)。
上記のPythonスクリプトをスクリプトエディタに貼り付けます。
スクリプトエディタの実行ボタン(▶)をクリックしてスクリプトを実行します。
注意点:

スクリプト内の output_path 変数を、実際の保存先のパスに変更してください。
スクリプトはアクティブなカメラを使用してレンダリングします。複数のカメラがある場合は、アクティブなカメラを切り替えてからスクリプトを実行してください。
スクリプトはPNG形式で画像を保存します。他の形式で保存したい場合は、 bpy.context.scene.render.image_settings.file_format の値を変更してください。例:JPEG形式で保存する場合は 'JPEG' に変更します。
保存先のフォルダが存在しない場合は、スクリプトを実行する前に作成してください。

Google Bloggerブログの robot.txt と metarobots について

Quick Edit Pencil

カスタム robots.txt を有効にする

ちゃんと効いているのか確認するツール

robots.txt テスターで robots.txt をテストする - Search Console ヘルプ
 

カスタム ロボット ヘッダー タグを有効にする


メタrobotタグはhttpヘッダーに付く X-Robotsタグ となっているのでソースからだと見えない

ので クロムでF12を押して開発者ツールでネットワークで最初のんを展開する

ネットワークにしてリロードしないと項目は出ないので注意

参考

 X-Robots-Tagについて知っておくべきことすべて - Affde Marketing

Bloggr (Use /re/ syntax for regexp search) 

Quick Edit Pencil

HTMLビューの検索オプション

Blogger HTML編集モード で使える 【検索】 【検索置換】 【検索オプション】

  • C + F 検索
  • C + SHIFT + F 検索置換
  • 検索オプション(正規表現/後方参照も可能)
    (Use /re/ syntax for regexp search)


検索オプションで 正規表現 が使える

検索オプション Use /re/ syntax for regexp search の使い方

検索するキーワードを正規表現で指定できる。指定は /正規表現キーワード/ のように正規表現をスラッシュで囲む。正規表現について理解したい方は適宜ググってください。

/<a.*?\/a>/

Aタグで囲まれた文字列を検索する。\/ は / をエスケープ処理した一文字として見る。


置換でも正規表現が使える 後方参照

/<a href="(.*?)".*?>(.*?)<\/a>/
正規表現の () で囲まれた部分は 後から(置換文字列として) 参照利用する事ができる。\/ は / をエスケープ処理した一文字として見る。
  • 一つ目の()は、リンク先
  • 二つ目の()は、リンク文字
  • $番号で参照する

/リンク先は$1、リンク文字は$2/

  • リンク先を $1 で参照
  • リンク文字を $2 で参照

PowerShell 配列を順次 クリップボードへ 

Quick Edit Pencil
ステップ
  1. HTMLソースのimgタグのalt属性値を配列に格納
  2. 順次クリップボードにセットする

肝として
  1. 一時中断してクリップボードの値を使う方法
    • $in = Read-Host "Press ENTER KEY, then next"
  2. クリップボードユーティリティの履歴にため込む方法
    • Start-Sleep -s 1

#Windows PowerShell
#Investigating template tags in Blogger theme XML

##テンプレート捜査フィールド
$path = "D:\WindowsPowerShell Scripts\Bloggerポスト画像ALT走査"

#XMLを捜査対象サブフォルダも対象(ブロガーテーマ)
$targets = Get-ChildItem $path -recurse -Include 捜索ソース.html | Select-Object | Where-Object {-not $_.PSIsContainer}

#捜査対象ファイルをリスト
$targets

#対象タグを格納
$tags = @()
$targets | ForEach-Object {
  $tags += [regex]::Matches((Get-Content $_),"img (alt="".*?"")")  | foreach{$_.Groups[1].Value.TrimEnd()}
}

#重複を削除し並べ替え
#$tags | Select-Object –Unique | Sort-Object

#クリップボードに代入
$tags | ForEach-Object {
  $_  
  $_  | clip
  Start-Sleep -s 1
  #$in = Read-Host "Press ENTER KEY, then next"

}

参考にしたサイト様

JavaScript: 要素内のHタグをリストし目次を自動生成 ページ内リンクを作成する

Quick Edit Pencil
Bloggerで見出しを自動インデックス

今ならもっとスマートなコードを書けると思います。これは2007年頃に書いたコード。2019年に手直ししてますがコードはグダグダです。が動きます。

投稿へ設置


<script>midashi_generator();</script>

レイアウトでガジェットのHTMLをヘッダエリアに追加


//<script type="text/javascript">

function midashi_generator(undefined) {

    // ▼------ 設定項目 ここから ------▼
    
    // --- 以下必須指定 ---

    // 見出しリスト(目次)生成する文字列の親要素を指定(Bloggerで使用する場合は変更不要)
    var midasi_generation_element = "div[id^='post-body-']";
    /* Bloggerテンプレートの場合はポスト本文のコンテナ要素 div#post-body-{postId} 
       セレクターの指定方法は下記URLを参照
       Document.querySelectorAll() https://developer.mozilla.org/ja/docs/Web/API/Document/querySelectorAll
       属性セレクタ https://developer.mozilla.org/ja/docs/Web/CSS/Attribute_selectors */
    
    // --- 以下オプション指定 ---

    // 目次を出すページタイプを指定
    var pageType = new RegExp("item|static_page|index|archive");
    // アイテムページとスタティックページの時に動く

    // 目次のタイトル
    var title = "目次";

    // 見出しタグの目次化の指定
    /* 半角数値で指定
       指定がない時は全部の見出しタグをリスト
       "2-4" とした時は タイトル (H2) と 大見出し (H3) と 小見出し (H4) をリスト
       "1|3" とした時は ページタイトル (H1) と 大見出し (H3) をリスト */
    var choiceHtags = "";

    // 目次のリストスタイル指定
    /* 半角数値で指定 */
    var style1 = ""; // 第一階層(親)
    var style2 = ""; // 第二階層(子)
    var style3 = ""; // 第三階層(孫)
    var style4 = ""; // 第四階層(ひ孫)
    // 半角英数で指定
    // 指定がない時はデフォルトのリストスタイルが適用されます。
    // 下記【】内を指定するとリストスタイル(ulタグ又はolタグ)が適用されます
    // マークなし【none】ul
    // ・ 記号【disc】ul
    // 1 2 3…【decimal】ol
    // A B C…【alpha1】ol
    // a b c…【alpha2】ol
    // Ⅰ Ⅱ Ⅲ... 【roman1】ol
    // ⅰ ⅱ ⅲ... 【roman2】ol
    // 上記【】内文字に続き半角空白の後に任意の文字列class名を指定することができます。

    // ▲------ 設定項目 ここまで ------▲

    // STEP0 必須設定項目の確認
    if (!midasi_generation_element) {
        info("設定変数の midasi_generation_element が指定されていません。");
        return;
    }

    // 目次を出すページタイプを検証(ボディクラスをチェック)
        //console.log("body.className = " + document.body.className + " /ボディCLASS属性");
    if (!pageType.test(document.body.className)) {
        //console.log("midashi-generator.js: 指定したページタイプ以外なのでスクリプトを中止しました。");
        return;
    }

    // 当スクリプトを変数にセット
    var scpt = document.getElementsByTagName("script");
    scpt = scpt[scpt.length - 1];

    // post-body-postIdを取得
    var postBody = getClosestElement(scpt, midasi_generation_element);  //console.log(postBody);
    if (!postBody) {
        info("見出し生成の範囲を特定できませんでした。見出し生成の範囲の指定を確認してください。");
        return;
    }
    var postid = postBody.id.split('-')[2]; /* postIdを取得 */
        //console.log('postid '+postid);
    var uniqueness = postid; /* 識別子を調整 */
        //console.log("uniquenessの完成 " + uniqueness);
    function getClosestElement(elem, selector) { /* 条件に合う最も近い祖先要素を取得関数 */
        var matchElems = document.querySelectorAll(selector);
        if(!matchElems.length){return null;}
        //console.log("bingo");
        var ancestorNode = elem.parentNode;
        while (ancestorNode) {
            for (var i = 0; i < matchElems.length; i++) {
                if (matchElems[i] === ancestorNode) return ancestorNode;
            }
            ancestorNode = ancestorNode.parentNode;
        }
        return null;
    };

    // ページの構築が完了したらloadを呼び出す
    (function() {
        if (document.addEventListener) { // opera,safari,mozilla向け
            document.addEventListener("DOMContentLoaded", load, false);
            //console.log("addEventListenerでloadをコールした");
        } else if (/msie/.test(userAgent)) { // IE向け
            try {
                document.documentElement.doScroll("left");
            } catch (error) {
                setTimeout(arguments.callee, 0);
                return;
            }
            load();
        } else { // その他
            window.onload = load;
        }
    })();

    // 中断メッセージ
    function info(message) {
        var el = document.createElement('span');
        el.setAttribute("style", "background-color: yellow;");
        el.innerHTML = "midashi-generator.js: Check the error details on the console.";
        scpt.parentNode.insertBefore(el, scpt.nextSibling);
        console.error('midashi-generator.js: '+message);
    }
    
    // ロードファンクション
    function load() {
        //console.log("loadを開始した");
        // STEP1

        //対象記事の読み込みを確認する
        if (!postBody) {
            var tID1 = null;
            var tID1i = 0;
            var tID1 = setInterval(function() {
                if (!postBody || typeof postBody == "undefined") {
                    if (postBody && postBody.lastChild) {
                        //console.log('被メニュー要素の中に何か表示されました');
                        core(); // ナビゲーションメニューの作成
                        clearInterval(tID1);
                    } else {
                        tID1i++;
                        if (tID1i > 10) {
                            ul1.innerHTML = "<li>設定された要素のid属性名【" + postBody.id + "】が存在しません。</li><li>要素のid属性名を再確認してください。</li>";
                            clearInterval(tID1);
                        }
                    }
                }
            }, 300);
        } else {
            core(); // ナビゲーションメニューの作成
        }

        // STEP2

        function core() {

                // STEP3

                // アーカイブページで次のページが設定されている場合は中止する
                if (/index|archive/.test(document.body.className)) {
                    //console.log("midashi-generator.js: アーカイブページで jump-link があるのでスクリプトを中止しました。");
                    var postOuter = getClosestElement(postBody, '.post-outer'); 
                    if(postOuter.querySelector(".jump-link")){
                        //console.log(postOuter.querySelector(".jump-link"));
                        return;
                    }
                }

                // ナビゲーションメニューを展開する要素を作る/一階層
                // メニューを展開する第一階層のul要素をクリエイト
                // class属性を設定
                if (!style1 || typeof style1 == "undefined") {
                    var navlist = document.createElement('ul');
                    //navlist.setAttribute("class", "default");
                } else if (/none|disc/.test(style1)) {
                    var navlist = document.createElement('ul');
                    navlist.setAttribute("class", style1);
                } else if (/decimal|alpha[1-2]|roman[1-2]/.test(style1)) {
                    var navlist = document.createElement('ol');
                    navlist.setAttribute("class", style1);
                } else {
                    var navlist = document.createElement('ul');
                    navlist.setAttribute("class", style1);
                }

                // メニューを展開する第一階層のul要素を変数にセット
                var ul1 = navlist;

                // 結果:<ul class="default" />
                // 被メニュー要素のリスト
                //console.log("postBody.id " + postBody.id);
                // 収集見出しの指定
                if (!choiceHtags || typeof choiceHtags == "undefined") {
                    choiceHtags = "1-4";
                }
                // セレクターで見出しタグを集める
                var headings = postBody.querySelectorAll("h1,h2,h3,h4");
                // 一階層リストと二階層以降
                var style, currentHtag, depth, lastHtag, a, li1, ul2, li2, ul3, li3, ul4, li4;
                lastHtag = 0;
                depth = 1;
                for (var i = 0; i < headings.length; i++) {
                    if (RegExp("h[" + choiceHtags + "]").test(headings[i].tagName.toLowerCase())) {
                        //console.log("Core for Hタグ検出");
                        // カレントの見出しタグ番号を取得
                        currentHtag = headings[i].tagName.toLowerCase().replace("h", "");
                        //console.log("currentHtag " + currentHtag);
                        // アンカー処理:見出しタグにidを追加
                        headings[i].id = "mg_" + postid + "_" + i;
                        // アンカー処理:メニューリンク要素追加
                        a = document.createElement('a');
                        a.setAttribute("href", "#mg_" + postid + "_" + i);
                        //a.setAttribute("onclick", "mg_SmoothScroll(this, '#mg_" + postid+i+"');return false;")
                        a.textContent = headings[i].textContent;
                        // 深度(二回以降)
                        //console.log("lastHtag " + lastHtag);
                        if (lastHtag > 0) {
                            depth = depth + (currentHtag - lastHtag);
                        }
                        if(depth == 0){
                            // 構造階層が壊れているときエラーメッセージを出す
                            info("見出しタグのツリー構造が成立しませんでした。見出し「"+ headings[i].innerText + "」は<" + headings[i].tagName.toLowerCase() + ">ですが、<h" + lastHtag + ">であるべきです。");
                            headings[i].setAttribute("style", "background-color: deepskyblue!important;");
                            headings[i].innerHTML = "<span style='color: white!important; background: black;display: block!important;'>midashi-generator.js: !!! You need to set &lt" + headings[i].tagName.toLowerCase() + "&gt to &lth" + lastHtag + "&gt.</span><br />" + headings[i].textContent;
                            return;
                        }
                        //console.log("depth " + depth);
                        // カレントの指定スタイルをセット
                        eval("style=style" + depth + ";");
                        if (depth == 1) {
                            // 第一階層のリストをセット
                            //console.log("第一階層 depth " + depth);
                            li1 = document.createElement('li');
                            li1.appendChild(a);
                            //console.log("lastHtag " + lastHtag);
                            //if (lastHtag == 0) {
                                ul1.appendChild(li1);
                            //}
                        } else {
                            // 二階層目以降のカレントul/olをセット
                            //console.log("二階層目以降 depth " + depth);
                            if ((currentHtag - lastHtag) == 1 || (currentHtag - lastHtag) <= 0) {
                                if (!style || typeof style == "undefined") {
                                    eval("ul" + depth + "=document.createElement('ul');");
                                } else if (/none|disc/.test(style)) {
                                    eval("ul" + depth + "=document.createElement('ul');");
                                    eval("ul" + depth + ".setAttribute('class', '" + style + "');");
                                } else if (/decimal|alpha[1-2]|roman[1-2]/.test(style)) {
                                    eval("ul" + depth + "=document.createElement('ol');");
                                    eval("ul" + depth + ".setAttribute('class', '" + style + "');");
                                } else {
                                    eval("ul" + depth + "=document.createElement('ul');");
                                    eval("ul" + depth + ".setAttribute('class', '" + style + "');");
                                }
                            }else{
                                // 構造階層が壊れているときエラーメッセージを出す
                                info("見出しタグのツリー構造が成立しませんでした。見出し「"+ headings[i].innerText + "」は<" + headings[i].tagName.toLowerCase() + ">ですが、<h" + depth + ">であるべきです。");
                                headings[i].setAttribute("style", "background-color: lightpink!important;");
                                headings[i].innerHTML = "<span style='color: white!important; background: black;display: block!important;'>midashi-generator.js: !!! You need to set &lt" + headings[i].tagName.toLowerCase() + "&gt to &lth" + depth + "&gt.</span><br />" + headings[i].textContent;
                                return;
                            } // カレントliをセット
                            eval("li" + depth + "=document.createElement('li');");
                            eval("li" + depth + ".appendChild(a);");
                            eval("ul" + depth + ".appendChild(li" + depth + ");");
                            // 親要素へ追加
                            eval("li" + (depth - 1) + ".appendChild(ul" + depth + ");");
                            eval("ul" + (depth - 1) + ".appendChild(li" + (depth - 1) + ");");
                        }
                        lastHtag = currentHtag;
                    }
                } // for
                // 第一階層へリストを追加
                ul1.appendChild(li1);

                // コンテナ書き出し
                var container;
                (function() {
                    container = document.createElement('div');
                    container.setAttribute("class", "midasi-index-container");
                    // id属性を設定
                    var setIdName = uniqueness + "-index";
                    var matchId = postBody.querySelectorAll('ul[id^="'+setIdName+'"]');
                    container.setAttribute("id", setIdName +'-'+ matchId.length);
                    postBody.insertBefore(container, scpt.nextSibling);
                })();

                // 目次を書き出し
                container.insertBefore(navlist, container.firstChild);

                // タイトルを書き出し
                if(title)writeTitle(title);
                function writeTitle(write) {
                    var el = document.createElement('div');
                    el.setAttribute("class", "midasi-index-title");
                    el.innerHTML = title;
                    container.insertBefore(el, container.firstChild);
                }

            } //sub core

    }; //sub load

}

//</script>

参考リンク


WP: サイドバー カスタム分類タクソノミーを表示するコード

Quick Edit Pencil

PHP Code Widgetで追加したウィジェットに書く

<?php 
// 指定されたタクソノミーに含まれるタームを wp_list_categories を使ってリストする。
// (PHP コードを有効にするプラグインを併用すると、ウィジェットの中でも使える。)

$taxonomy     = '表示するタクソノミー';
$orderby      = 'name'; 
$show_count   = 0;      // 表示するなら 1、しないなら 0
$pad_counts   = 0;      // 子孫のカウントも合計するなら 1、しないなら 0
$hierarchical = 1;      // 階層表示するなら 1、しないなら 0
$title        = '';

$args = array(
  'taxonomy'     => $taxonomy,
  'orderby'      => $orderby,
  'show_count'   => $show_count,
  'pad_counts'   => $pad_counts,
  'hierarchical' => $hierarchical,
  'title_li'     => $title
);
?>

<ul>
<?php wp_list_categories( $args ); ?>
</ul>
出力結果の一部を除外したり含めたりするには、wp_list_categories関数の引数(プロパティ)にexclude(除外する)、include(含める)の項目があるので詳しいことは次のwp_list_categories関数リファレンスを参照のこと。
テンプレートタグ/wp list categories - WordPress Codex 日本語版

テーマの functions.php に記述するフック関数

<?php
function custom_wp_generate_tag_cloud_data($tags_data) {
    foreach ( $tags_data as $key => $value ) {
        if ($tags_data[$key]['real_count'] <= 1) {
            unset($tags_data[$key]);
        }
    }
    return $tags_data;
}
add_filter('wp_generate_tag_cloud_data', 'custom_wp_generate_tag_cloud_data');
?>
関数に渡される引数 $tags_data を受け取る自作関数内では、$tags_data に入っているタグの配列のうち、投稿件数が1以下のものを unset() で除去し、表示したいタグだけを残した配列を return で返しています。
ワードプレスのタグクラウドをカスタマイズ(上級者向け)

上記のコードを少し改変
<?php
function custom_wp_generate_tag_cloud_data($tags_data) {
    foreach ( $tags_data as $key => $value ) {
        //if ($tags_data[$key]['slug'] <= 1) {
        if ( 0 === preg_match( '/utagawa/', $tags_data[$key]['slug'] ) ) {
            unset($tags_data[$key]);
        }
    }
    return $tags_data;
}
add_filter('wp_generate_tag_cloud_data', 'custom_wp_generate_tag_cloud_data');
?>

PHP Code Widgetで追加したウィジェットに書く

<ul class="category-list">
<?php
// パラメータを指定
$args = array(
 // カテゴリー内の記事数順で指定
    'orderby' => 'count',
    // 降順で指定
    'order' => 'DSC'
);
$categories = get_categories( $args );

foreach( $categories as $category ){
 echo '<li><a href="' . get_category_link( $category->term_id ) . '">' . $category->name . '</a> </li> ';
}
?>
</ul>
関数リファレンス/get categories - WordPress Codex 日本語版

Blogger ページ内リンクの正しい設定方法

Quick Edit Pencil
Google Blogger ブログで

ページ内リンクが正常に働かない状態を JavaScript で解決する


<!--ページ内リンク改善スクリプト-->
<script>
(function () {
    var el=document.querySelectorAll("div.post-body a[href*='#']");
    el.forEach(function(link) {
      if(/http:\/.*?#|blogID=\d+#/.test(link.href)){
        link.href = "#"+link.href.split(/blogID=\d+#|http:\/.*?#/)[1];
      }
    });
}());
</script>

管理ページの レイアウト footer-1 へ 「 HTML/JavaScript 」 ガジェットを追加し JavaScript をコピペして保存する。

これでブログ内のリンク内ページのリンクが自動修正され正常に動作する。

目次




症状

ページ内リンク(アンカーリンク)を正しく設定しても、編集モードを切り替えたり、再編集を行うとページ内リンクに余計な情報が付加され、リンク先がブログ管理ページへのと代わってしまう。



対処方

ページ内リンクに対して行われる余計なリンク情報を掃除する Javascript を仕込むことで正常なページ内リンクに戻す。



アンカー名の重複を防ぎ、ページ内リンクをより健全にするために

投稿記事の単体ページではアンカー名が重複しなくても、複数の投稿が1ページに表示されるアーカイブページでは、アンカー名(ID)が重複する可能性があります。

これを防ぐためにアンカー名を一意とする必要があります。



アンカー名の命名規則



アンカー名(ジャンプ先の名前)命名規則

アーカイブページでのアンカー名重複を防ぐための命名規則として

postID+アンカー名

<div id="アンカー名+postID"></div>

postIDは記事の編集画面のアドレスバーで確認できます。この記事のpostIDは3265737230123688960となっているので、アンカー名は次となります。これでブログ内で一意のアンカー名となります。

<div id="footer-3265737230123688960"></div>

※idの先頭文字はアルファベットとしてください。







Google Bloggerのプレビュー画面のオーバーラップを外すCSS指定

Quick Edit Pencil
次のCSSを投稿の最後にHTMLで記述する。
<style type="text/css">
.singleton-element,
section.subscribe-section-container {
display:none!important;
}
</style>

Google Blogger template テンプレート ウィジェットの現出コンディション例

Quick Edit Pencil
<b:widget cond='!data:mobile and (data:blog.pageType == &quot;static_page&quot; or data:blog.canonicalUrl in {&quot;http://xxx.blogspot.com/search?q=B.TEMPLATE&quot;})' />

ページタイプdata:blog.pageType
--------------------------
インデックス ページ: index
個々の投稿記事: item
アーカイブ: archive
ページ: static_page

<b:widget cond='data:blog.pageType in {&quot;static_page&quot;,&quot;item&quot;}'/>
<b:widget cond='not data:view.isHomepage'/>
<b:widget cond='data:view.isLayoutMode'/>
<b:widget cond='data:view.isSingleItem and data:widget.type == &quot;Blog&quot;'/>
<b:widget expr='data:view.isSearch ? data:messages.noResultsFound : data:messages.theresNothingHere'/>
<b:widget cond='data:post.includeAd and data:post.adNumber lt (data:view.isHomepage ? 2 : 3)'/>
<b:widget cond='data:view.isMultipleItems and data:post.featuredImage'/>
<b:widget cond='data:view.isMultipleItems and not data:post.featuredImage'/>

<body>にクラスを与えます
<body>
<b:class cond='data:view.isPreview' name='preview'/>
<b:class cond='data:view.isHomepage' name='homepage-view'/>
<b:class cond='data:view.isArchive' name='archive-view'/>
<b:class cond='data:view.isLabelSearch' name='label-view'/>
<b:class cond='data:view.isSearch and !data:view.isLabelSearch' name='search-view'/>
<b:class cond='data:view.isPost' name='post-view'/>
<b:class cond='data:view.isPage' name='page-view'/>
<b:class cond='data:view.isMultipleItems' name='feed-view'/>
<b:class cond='data:view.isSingleItem' name='item-view'/>
<b:class cond='data:view.isSearch and data:view.search.query' name='search-focused'/>
<b:if cond='data:blog.pageType == &quot;error_page&quot;'>

レイアウト用のデータタグ - Blogger ヘルプ


Bloggerのページタイプ別にスタイルを適用したい

Quick Edit Pencil

Bloggerのページタイプ別にCSSスタイルを適用したい時


三項演算子を使ってテンプレートのbodyタグをいじります。

bodyタグのclassに class="pagetype" とページタイプを付け、CSSで body.pagetype .post{...}  という具合にページタイプ別にスタイルを適用できる。

下記のようにclass名をふれますので、かなりスタイルの幅が広がります。

class = "index | item | archive | static_page , mobile | desktop , home-page , xxx"

CSSサンプル
.post{...}
body.index .post{...}
body.item .post{...}
body.archive .post{...}
body.static_page .post{...}

テンプレートの変更

変更個所
<body expr:class='&quot;loading&quot; + data:blog.mobileClass'>
出力結果
<body class='loading'>
↓ ページタイプのクラス名を追加する場合
<body expr:class="&quot;loading&quot; + (data:blog.isMobile         ? data:blog.mobileClass         : &quot; desktop&quot;) + &quot; &quot; + data:blog.pageType">
出力結果
<body class='loading desktop index'> 

ページタイプ

インデックス ページ index
個々の投稿記事 item
アーカイブ archive
ページ static_page

更に、ホームページと特定のページのclass名を追加する
<body expr:class='&quot;loading&quot; + (data:blog.isMobile         ? data:blog.mobileClass         : &quot; desktop&quot;) + (data:blog.url==data:blog.homepageUrl         ? &quot; home-page&quot;         : (data:blog.canonicalUrl in {"http://wed@.blogspot.com/p/my-page.html"}         ? &quot; about-us&quot;         : &quot;&quot;)) + &quot; &quot; + data:blog.pageType'>
出力結果
ホームページの場合
<body class='loading desktop home-page index'> 
指定したページの場合
<body class='loading desktop about-us static_page'> 
data:blog.canonicalUrlは、必ず http://xxx.blogspot.com/xxx で表示されるので、海外から閲覧した場合でも、https で閲覧した場合でも結果が保証されるはず。指定する場合は、アドレスバーに表示されているURLを http://xxx.blogspot.com/xxx  にして指定する事。

JavaScript:: クリックで表示と非表示をコントロール(クリックイベント追加) < BloggerTemplate

Quick Edit Pencil
(function() {

/* コメント投稿のテキスト(要素)を取得 */
var comment_post_message = document.getElementById('comment-post-message');
var comment_editor = document.getElementById('comment-editor');

/* コメント投稿のテキストにクリックイベントを付与 */
if(comment_post_message){
 //alert(comment_post_message);
 comment_editor.style.display="none";
 comment_post_message.addEventListener("click", function(){if(comment_editor.style.display=="none"){comment_editor.style.display="";}else{comment_editor.style.display="none";}}, false);
}

})();

[Blogger]ブロッガーの日本語ヘルプ

Quick Edit Pencil
日本語化されている人がいてはりました。


stoned soul
Blogger Help の和訳

Bloggerにプチトラを仕込む [Blogger]

Quick Edit Pencil
iBlog用トラックバックシステム【Petit -Tra:プチトラ】をBloggerで使える様に改造し、設置するまでを記録。



プチトラ ダウンロード


iBlog用トラックバックシステム【Petit-Tra:プチトラ】の設置ガイドです。


1.上記のリンクからプチトラをダウンロードします。


2.プチトラ ダウンロード&設置ガイドのサーバ設置方法までを行います。


3.Bloggerで動作するように以下のファイルを改造します。


entry-tb.cgi
tb-js.cgi
tb.cgi

entry-tb.cgiを改造


46行目当りの


die("No TrackBack ID (tb_id)") unless $tb_id;
my $me = url();


print header(-charset => 'utf-8'), ;
print <<"URL";



die("No TrackBack ID (tb_id)") unless $tb_id;
my $me = url();

use File::Spec::Functions;
$data = load_data($tb_id);
$count = @$data;
sub load_data {
my($tb_id) = @_;
my $tb_file = catfile($DataDir, $tb_id . '.stor');
require Storable;
scalar eval { Storable::retrieve($tb_file) } || [];
}

print header(-charset => 'utf-8'), ;
print <<"URL";


に置き換え、続いてすぐ下当りの


document.write('TrackBack URL for this entry:');
document.write('<div class="tb-url">$TrackbackUrl/$tb_id&$cate_id</div>');



document.write('TrackBack URL for this entry:');
document.write('<div class="tb-url">$TrackbackUrl/$tb_id</div>');


に置き換えます。


tb-js.cgiを改造


12行目当りの


if($count == 0){print"document.write(\'TrackBack &gt;&gt;\')";}
if($count == 1){print"document.write(\'TrackBack($count)\')";}
if($count > 1){print"document.write(\'TrackBack($count)\')";}



if($count == 0){print"document.write(\'0&nbsp;TrackBack\')";}
if($count == 1){print"document.write(\'$count&nbsp;TrackBack\')";}
if($count > 1){print"document.write(\'$count&nbsp;TrackBack\')";}


に置き換えます。


tb.cgiを改造


105行当りの


TrackBack URL for this entry:
<div class="trackback-url">$TrackbackUrl/$tb_id&$cate_id</div>
URL



TrackBack URL for this entry:
<div class="trackback-url">$TrackbackUrl/$tb_id</div>
URL


に置き換えます。続いて306行当りの


if($entryURL =~ /$Blog_url/){
if ($entryURL !~ /\/E/){print header(-charset => 'utf-8'), error_entry("エントリページじゃないですよ。");exit;}
%tb_cookies = fetch CGI::Cookie;



if($entryURL =~ /$Blog_url/){
if ($entryURL !~ /html$/){print header(-charset => 'utf-8'), error_entry("エントリページじゃないですよ。");exit;}
%tb_cookies = fetch CGI::Cookie;


に置き換えます。


4.Blogger設置方法 テンプレートを編集


以下の部分を探して


<a class="comment-link" href="<$BlogItemCommentCreate$>"<$BlogItemCommentFormOnclick$>><$BlogItemCommentCount$> comments</a>

次に


<a class="comment-link" href="http://www.example.com/blogger/tba/tb.cgi?__mode=list&tb_id=<$BlogItemNumber$>" onclick="window.open(this.href,'trackb', 'width=430,height=400,resizable=yes,scrollbars=yes'); return false"><script type="text/javascript" src="http://www.example.com/blogger/tba/tb-js.cgi?<$BlogItemNumber$>"></script></a>
<a class="comment-link" href="<$BlogItemCommentCreate$>"<$BlogItemCommentFormOnclick$>><$BlogItemCommentCount$> comments</a>


に置き換えます。
テンプレートにより異なるようなので、必要であれば上記の部分を<MainOrArchivePage></MainOrArchivePage>でくくると良いでしょう。
続いて、すぐ下当りの


<!-- Begin #comments -->
<ItemPage>
<div id="comments">


を、次に置き換え、プチトラを置いているサーバーを指定します。


<!-- Begin #comments -->
<ItemPage>
<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="<$BlogItemPermalinkUrl$>"
trackback:ping="http://your.com/tb/tb.cgi/<$BlogItemNumber$>"
↑ ※プチトラを置いているサーバーをフルパスで指定する
dc:title="<PostSubject><$BlogItemSubject$></PostSubject>"
dc:identifier="<$BlogItemPermalinkUrl$>" />
</rdf:RDF>
-->
<div id="comments">
<script language="JavaScript" src="http://www.example.com/blogger/tba/entry-tb.cgi?__mode=list&tb_id=<$BlogItemNumber$>"></script>


続いて、コメントのリスト表示もプチ化したいのであれば


<BlogItemCommentsEnabled><a name="comments"></a>
<h4><$BlogItemCommentCount$> Comments:</h4>
<dl id="comments-block">
<BlogItemComments>
<dt class="comment-data" id="c<$BlogCommentNumber$>"><a name="c<$BlogCommentNumber$>"></a>
At <a href="#c<$BlogCommentNumber$>" title="comment permalink"><$BlogCommentDateTime$></a>,
<$BlogCommentAuthor$> said...
</dt>
<dd class="comment-body">
<p><$BlogCommentBody$></p>
<$BlogCommentDeleteIcon$>
</dd>
</BlogItemComments>
</dl>
<p class="comment-timestamp">
<$BlogItemCreate$>
</p>
</BlogItemCommentsEnabled>
<p style="padding-left:20px;">
<a href="<$BlogURL$>">&lt;&lt; Home</a>
</p>
</div>
</ItemPage>
<!-- End #comments -->



<BlogItemCommentsEnabled><a name="comments"></a>
<div id="tb-title"><$BlogItemCommentCount$> Comments</div>
<BlogItemComments>
<div class="tb-box">
<dt class="tb-name"><a name="c<$BlogCommentNumber$>"></a>
<$BlogCommentAuthor$> said...
</dt>
<div class="tb-mess">
<p><$BlogCommentBody$></p>
</div>
<div class="tb-time"><a href="#<$BlogCommentNumber$>" title="comment permalink"><$BlogCommentDateTime$></a>
<$BlogCommentDeleteIcon$>
</div>
</div>
</BlogItemComments>
<p class="comment-timestamp">
<$BlogItemCreate$>
</p>
</BlogItemCommentsEnabled>
<p class="comment-timestamp">
<a href="<$BlogURL$>">&lt;&lt; Home</a>
</p>
</div>
</ItemPage>
<!-- End #comments -->


に置き換えます。


以上で設置完了です。
リセット後プレビューで動作確認してください。


entry-style.cssのスタイルを調整してお好みのデザインでお使い下さい。
ちなみにokteiの、entry-style.cssは以下の通りです。
/*コメントエリア全体の設定*/
#tb-all { background-color: #ffffff; margin: 10px auto; width: 100% }


/*タイトルの設定*/
#tb-title { font-size: 78%; font-family: "Trebuchet MS", Trebuchet, Arial, Verdana, Sans-serif; background: #ffffff url(images/title_bar.jpg); text-align: center; text-transform: uppercase; letter-spacing: 0.2em; margin-top: 1em; margin-bottom: 0.5em; padding-top: 0.2em; padding-bottom: 0.2em; border: solid 1px #cccccc }


/*各TBごとの設定*/
.tb-box {
width:85%; /*幅の設定*/
margin-left:auto;
margin-right:auto;
margin-bottom:10px;
margin-top:15px;
text-align:left;
border: 1px solid #cccccc;
}
/*This Entryの設定*/
.tb-url-account { font: 86%/1.4em "Trebuchet MS", Trebuchet, Arial, Verdana, Sans-serif; letter-spacing: 0.1em }
.tb-url { color: #0063dc; font: 86%/1.4em "Trebuchet MS", Trebuchet, Arial, Verdana, Sans-serif; letter-spacing: 0.1em }
/*エントリタイトルの設定*/
.tb-entrytitle { color: #006699; font-weight: normal; padding: 2px; border-bottom: 1px dotted #cccccc }
/*エントリBlog名の設定*/
.tb-name { color: #996600; font-weight: normal; padding: 5px }
/*エントリ要約の設定*/
.tb-mess { font-weight: normal; padding-right: 5px; padding-bottom: 10px; padding-left: 5px }
/*タイムスタンプの設定*/
.tb-time { font-size: 78%; font-family: "Trebuchet MS", Trebuchet, Arial, Verdana, Sans-serif; letter-spacing: 0.2em; padding-bottom: 3px; padding-left: 5px }

ブロガーでAdSenseの表示 [Blogger]

Quick Edit Pencil
メモ

AdSenseはエントリページだけで良いので、トップページでは表示しない様にする方法

<script type="text/javascript"><!--

str=window.location.href;

if(str == "http://yourblog.blogspot.com/index.html" || str == "http://yourblog.blogspot.com/"){}else{

設定コード

}

//--></script>

もっと上手い条件式が組めるんやろけど、動けば良し!

ブロガーはエントリのカテゴリー分けはできない??? [Blogger]

Quick Edit Pencil
iBlog、MT、yaplogといろいろ試してみたけど、結局どれも自分には合わんかった。

で、ブロガーに手を出した訳ですが、これが簡単で使いやすい。

でも今までの流れでエントリをカテゴリで分けてみたいのでいろいろと調べる。


Google 検索: blogger カテゴリー表示




なるほどなるほど


九十九式: [site] サイト内カテゴリ検索方法


Googleの検索機能を使えば擬似的にカテゴリ表示をすることも可能


で、サイドバーのcategory searchが出来上がり。