投稿者: koji

  • フロントページの設定

    フロントページのカスタマイズ

    タイトルと抜粋部分にLOTDを掲載する

    フロントページには固定ページを使い、タイトルと抜粋にLOTD(日替わりリスト)のタイトルとまえがきを表示させています。

    固定ページの抜粋を表示させる

    標準では固定ページの抜粋フィールド (post_excerpt) は使われないので、使うよう設定します。

    add_action( 'init', 'kh_use_excerpt_on_pages' );
    function kh_use_excerpt_on_pages() {
        add_post_type_support( 'page', 'excerpt' );
    }

    タイトルと抜粋を設定する

    記事タイトルの変更は、フィルターフック ‘the_title’ を使うわけですが、このフックはサイト全体を通じて呼ばれまくっています。10記事のタイトル一覧があると10回呼ばれます。できるだけ負荷を減らすために、フロントページを表示させるときのみ登録するようにしてみました。

    ナビゲーションメニューも WP_Queryを使っているので、判定条件には is_main_query() も必要。これがないとナビゲーションメニューが消失してしまいました。

    add_action( 'wp_head', 'kh_wp_head_frontpage' );
    function kh_wp_head_frontpage() {
    
        if ( is_front_page() && is_main_query() ) {
            add_filter( 'the_title', 'kh_frontpage_title', 10, 2 );
        }
    }

    コールバック関数はこちら。フィルターフック ‘the_title’ はフロントページの表示中にも呼ばれまくっており、 is_front_page() では変えるべきタイトルが特定できませんでした。固定ページのIDが get_option( ‘page_on_front’) で取得できるフロントページのIDと同じであるという条件で判定をしています。

    そしてフロントページのタイトルを書き換える場合のみ、抜粋ページを書き換えるフィルターフックを登録します。

    function kh_frontpage_title( $title, $id ) {
        if( $id == get_option( 'page_on_front') ) {
            $lotd = lf_official_lotd();
            $title = '<a href="'.get_permalink( $lotd ).'">'.get_the_title( $lotd ).'</a>';
            add_filter( 'the_excerpt', 'kh_frontpage_excerpt', 10, 1 );
        }
        return $title;
    }
    
    function kh_frontpage_excerpt( $post_excerpt ) {
        $lotd = lf_official_lotd();
        return get_the_excerpt( $lotd );
    }

    Latest Posts ブロックをカスタマイズする

    フロントページの本文先頭にも LOTD を書影と共に表示させます。

    具体的には “Latest Posts” ブロックをカスタマイズしました。このブロックはカテゴリごとに新着投稿を表示できるので、LOTD専用カテゴリを選択すれば絞り込みは完了。

    書影については工夫が必要です。仕様では投稿のアイキャッチ画像を使うのですが、書影はほとんどアフィリエイトサイトからの引用で、アイキャッチ画像に登録しておくことができません。

    そこで、フロントページにLOTDを表示する際には、アイキャッチ画像が登録されているかのように偽装するカスタマイズを施しました。

    アイキャッチ画像の有無は、関数 has_post_thumbnail() によって判定されます。 “Latest Posts” ブロックでは gutenberg_render_block_core_latest_posts() という関数の中で呼ばれています。

    この関数内にあるフィルターフック ‘has_post_thumbnail’ にコールバック関数を登録しました。この関数の中で、さらにアイキャッチ画像のhtmlをレンダリングした後に呼ばれるフィルターフック ‘post_thumbnail_html’ にコールバック関数を登録し、trueを返しておきます。ここが偽装と呼んだ部分。

    add_filter( 'has_post_thumbnail', 'lf_has_post_thumbnail', 10, 3 );
    function lf_has_post_thumbnail( $has_thumbnail, $post, $thumbnail_id ) {
        if ( is_front_page() && has_category( 'lotd', $post ) && ! $has_thumbnail ) {
            add_filter( 'post_thumbnail_html', 'lf_post_thumbnail_html', 10, 5 );
            $has_thumbnail = true;
        }
        return $has_thumbnail;
    }

    html記述部分は次の通り。ひとつの投稿には複数の書籍が付いている場合がありますが、配列の先頭の書籍の書影を使います。 lf_get_asin_meta() は、書籍IDから書影URLなどの関連情報を取得する関数。

    メディアライブラリに登録すると、自動的に決まった大きさのサムネイルが作成・保存されます。しかし書影ファイルはサイズが不定。そこで表示領域をサムネイルのサイズで固定したうえで、CSS の object-fit プロパティを使って書影の中央部分を切り抜いて表示させています。

    function lf_post_thumbnail_html( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
        $asins = get_the_terms( $post_id, 'asin' );
        $res = lf_get_asin_meta( $asins[0]->name );
    
        $thum_w = get_option( 'thumbnail_size_w' );
        $thum_h = get_option( 'thumbnail_size_h' );
        return '<img width="'.$thum_w.'" height="'.$thum_h.'" src="'.$res->img.'" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="width:'.$thum_w.'px;height:'.$thum_h.'px;object-fit:cover;" />';
    }
  • あるカテゴリ内の公開投稿を、付けられたタグの数で並べ替える

    共起タグが表示できるようになったので、タグ数の少ないリストを見直して、必要に応じてタグを増やそうと思います。

    そこで、list カテゴリに属する公開投稿を、投稿に付けられたタグの数が少ない順に並べて取り出そうとしたのですが、用意された関数では(やたらとループさせる以外に)うまい方法を見つけられず、SQL文を書いてみました。

    カテゴリもタグもタクソノミーなので、category タクソノミーの list タームに関連付けられた投稿のそれぞれについて、関連付けられている post_tag タクソノミーのターム数をカウントします。日本語で書いてもSQLで書いてもややこしい。

    SELECT p.ID, COUNT(tt2.term_taxonomy_id) AS count
    FROM wp_posts AS p
    JOIN wp_term_relationships AS r ON p.ID=r.object_id
    JOIN wp_term_taxonomy AS tt ON r.term_taxonomy_id=tt.term_taxonomy_id AND tt.taxonomy='category'
    JOIN wp_terms AS t ON tt.term_id=t.term_id AND t.name='list'
    JOIN wp_term_relationships AS r2 ON p.ID=r2.object_id
    JOIN wp_term_taxonomy AS tt2 ON r2.term_taxonomy_id=tt2.term_taxonomy_id AND tt2.taxonomy='post_tag'
    WHERE p.post_status='publish' AND p.post_type='post'
    GROUP BY p.ID
    ORDER BY count ASC

    5 までで list カテゴリーに関連付けられた投稿を取り出しています。6と7で、その投稿に関連付けられたタグを取り出し、投稿IDごとにカウントします。

  • ポジティブな影響を与える人のタイプ

    まえがき

    『ポジティブな影響を与える人は、いくつかのタイプに分類できます。』

    リスト

    あとがき

    まえがきを含めて、ボブ・トビン 『ポジティブ・インパクト まわりにいい影響をあたえる人がうまくいく』(ディスカヴァー・トゥエンティワン、2018年)より。

    ダブりまくりな感じですが、こういうリストは項目数が多めなほうがいいかも。

    • ビジネス文書で重要な3つの要件

      まえがき

      『書き手が伝えたいことを読み手が正確に、速やかに読み取れるように表現するための要件は3つある。』

      リスト

      あとがき

      まえがきを含めて、照屋 華子『ロジカル・ライティング (BEST SOLUTION―LOGICAL COMMUNICATION SKILL TRAINING)』(東洋経済新報社、2006年)より。

      具体性と簡潔さは両立しがたい要件ですが、おそらくこの順序に意味があるでしょうから、具体性>簡潔さというメッセージかと。

      • 映画の登場人物への感情的参加の3段階

        まえがき

        『ケント大学の映画学教授であるマーレー・スミスは、映画の登場人物への感情的参加の三段階を定義している。』

        リスト

        あとがき

        まえがきを含めて、ポール・ジョセフ・ガリーノ、コニー・シアーズ 『脚本の科学 認知と知覚のプロセスから理解する映画と脚本のしくみ』(フィルムアート社、2021年)より。参考文献(1) からの引用とのこと。

        「感情的参加」という言葉が認知的共感の映画鑑賞版という感じで印象的でした。

        観客はメインキャラクターに同一化しているのではなく、感情移入しているのでさえない。観客が映画で見るキャラクターたちは危険に陥ったり苦しんだりするかもしれないが、観客自身はそうでないことを観客は知っている。しかし、観客はキャラクターが感じていることを十分に理解することができる。

          参考文献

          (1) Carlsten, Jennie. “Black Holes and White Space: Ellipsis and Pause in Steve McQueen’s Hunger.” Projections 9.1 (2015): 43-65.

        • 一緒に付けられることが多いタグ(共起タグ)を可視化する

          リスト投稿には1~5つのタグを付けるようにしています。同じタグが付いたリストは当然ながら性質が似ていて、類義語のようなタグが付くことが多くなります。

          たとえば「選択」というタグが付けられたリスト投稿には「決断」というタグも付けられがち。このような関係にあるタグを「共起タグ」と命名しておきます。

          共起タグを可視化したく、タグページの説明(description)欄に「このタグと共に使われていることが多いタグ」を付けてみました。

          フィルターフックの箇所

          TwentyTwenty テーマでは、タグページの説明は index.php から get_the_archive_description() を呼び出して表示しています。ですので、この関数内に用意されている ‘get_the_archive_description’ フィルターフックが使えます。

          add_filter( 'get_the_archive_description', 'lf_tags_description', 10, 1 );
          function lf_tags_description( $description ) {
          
              if( ! is_tag() ) {
                  return $description;
              }
          
              /* 処理 */
          }

          上記の「処理」部分ではSQL文を使う場合と関数を使う場合の2通りのやり方を考えました。

          SQL文を使う場合

          「公開された」「投稿タイプがpostで」「listカテゴリーに属し」「表示しようとしているタグが付けられた」投稿群に付けられている他のタグを洗い出し、登場回数の多い順に5つを取り出すSQL文を書きました。

          たとえば「選択」タグがつけられた公開リストは19あり、それぞれのリストには「決断」や「意思決定」などのタグも付けられています。それらの共起タグを重複ありで洗い出し、登場回数の多い順に5つ取り出すということ。

          SELECT COUNT(t3.term_id) AS count, t3.term_id, t3.name
          FROM wp_terms AS t
          INNER JOIN wp_term_taxonomy AS tt ON t.term_id=tt.term_id AND taxonomy='post_tag'
          INNER JOIN wp_term_relationships AS r ON tt. term_taxonomy_id=r.term_taxonomy_id
          INNER JOIN wp_posts AS p ON r.object_id=p.ID AND p.post_status='publish' AND p.post_type='post'
          INNER JOIN wp_term_relationships AS r2 ON p.ID=r2.object_id
          INNER JOIN wp_term_taxonomy AS tt2 ON r2.term_taxonomy_id=tt2.term_taxonomy_id AND tt2.taxonomy='category'
          INNER JOIN wp_terms AS t2 ON tt2.term_id=t2.term_id AND t2.name='list'
          INNER JOIN wp_term_relationships AS r3 ON p.ID=r3.object_id
          INNER JOIN wp_term_taxonomy AS tt3 ON r3.term_taxonomy_id=tt3.term_taxonomy_id AND tt3.taxonomy='post_tag'
          INNER JOIN wp_terms AS t3 ON tt3.term_id=t3.term_id AND t3.term_id != (表示タグのID)
          WHERE t.term_id=(表示タグのID)
          GROUP BY t3.term_id
          ORDER BY count DESC
          LIMIT 5

          このSQL文を発行し、得られた結果を下記のようにHTMLに組み立てて返します。

              $coused_tags = $wpdb->get_results( $sql );
              foreach( $coused_tags as $c ) {
                  $desc[] = '<a href="'.get_tag_link( $c->term_id ).'" title="'.$c->count.'">'.$c->name.'</a>';
              }
          
              return 'このタグと共に使われていることが多いタグ<br>'.implode( ' ', $desc );
          

          関数を使う場合

          関数を使う場合はいくつかのステップが必要です。

          1. 表示しようとしているタグが付けられている投稿群を取得する

          $wp_query がタグの付いた投稿群を最初のページ分だけは保持しているので、ページングが無ければ $wp_query から投稿IDの一覧を取得する。ページングがあれば新規にクエリを発行して投稿IDの一覧を取得する。

              $tag_id = get_query_var( 'tag_id' );
          
              global $wp_query;
          
              if( $wp_query->max_num_pages == 1 ) {
                  foreach( $wp_query->posts as $p ) {
                      $post_ids[] = $p->ID;
                  }
              } else {
                  $q = new WP_Query( array(
                      'post_type'      => 'post',
                      'post_status'    => 'public',
                      'category_name'  => 'list',
                      'tag_id'         => $tag_id,
                      'posts_per_page' => -1, // 全行
                      'fields'         => 'ids', // IDのみ
                  ) );
                  $post_ids = $q->posts;
              }
          

          2. それらの投稿群に付いている(当該タグ以外の)タグを「重複ありで」取得する

          共起している回数を数えるため、上記の投稿群に付いているタグを重複ありで取得する必要があります。ここがわからなくてSQL文を書いたのですが、 wp_get_object_terms()関数がそのようなオプションを提供していました。

          もし共起タグが見つからなければここで処理終了。

              $coused_tags_all = wp_get_object_terms( $post_ids, 'post_tag', array(
                  'fields' => 'all_with_object_id',
                  'exclude' => $tag_id,
              ) );
          
              if( ! count( $coused_tags_all ) ) {
                  return $description;
              }

          3. 共起タグの出現回数トップ5を取り出す

          $coused_tags_all は Term オブジェクトの配列で、画面表示に必要なタグ名称を持っています。余計な呼び出しを減らすため、取得済みの Term オブジェクトをできるだけ活用。

          $coused_tags はタグIDをキーとする配列で、登場回数とTermオブジェクトを値に持たせています。

          // タグの出現回数を数える
          $coused_tags = array();
          foreach( $coused_tags_all as $c ) {
              if( ! isset( $coused_tags[$c->term_id] ) ) {
                  $coused_tags[$c->term_id] = array( 'count' => 1, 'obj' => $c );
              } else {
                  $coused_tags[$c->term_id]['count']++;
              }
          }
          
          // 出現回数の降順でソート
          uasort ( $coused_tags , function ($a, $b) {
              return $b['count'] - $a['count'];
          } );
          
          // 最大5つを取り出す
          $coused_tags = array_slice( $coused_tags, 0, 5, true );

          4. 表示するHTMLを作成する

          foreach( $coused_tags as $k => $v ) {
              $desc[] = '<a href="'.get_tag_link( $k ).'" title="'.$v['count'].'">'.$v['obj']->name.'</a>';
          }
          
          return '「'.urldecode( get_query_var( 'tag' ) ).'」と共に使われていることが多いタグ<br>'.implode( ' ', $desc );
        • 「絶望死」の種類

          まえがき

          世界中の富裕国では、中年の死亡率は低下し続けている。しかし近年のアメリカでは、中年の白人の死亡率が上昇している。最も増加率の高い死因がこの三つ。

          リスト

          あとがき

          アン・ケース、アンガス・ディートン 『絶望死のアメリカ』(みすず書房、2021年)より。絶望死は本書が独自に命名した類型です。

          後2者は自殺ではなくカウントされないものの、きっかけがおそらく何らかの絶望によると推察できます。たとえば薬物の過剰摂取による死亡は、意図的なものでないかぎり「事故」に分類されます。しかし、

          「その死は意図したものではなかったかもしれないが、中毒物質の使用を意図していなかったということはまったくない。したがって、致死的な薬物の過剰摂取や作用による結果は本当の意味での事故ではない」

          死因を単純に分解していっても見つけられなかったであろう問題を、ある仮説で括りなおすことによって見出すことができるという好例として収録。

          2017年に絶望死で亡くなったアメリカ人は15万8千人に及ぶとのこと。本書はアメリカで絶望死が増えている原因を広く深く探っていきます。

          • タイトル絶望死のアメリカ
          • 著者: アン・ケース(著)、アンガス・ディートン(著)、松本 裕(翻訳)
          • 出版社: みすず書房
          • 出版日: 2021-01-19
          • 科学的アナロジーの3条件

            まえがき

            『特に科学におけるアナロジーを成立させる重要な性質として、言語学者の瀬戸賢一さんは、以下の3点をあげています。 』

            リスト

            あとがき

            まえがきは、安藤 昭子 『才能をひらく編集工学 世界の見方を変える10の思考法』(ディスカヴァー・トゥエンティワン、2020年)より。

            瀬戸 賢一 『メタファー思考』(講談社、1995年)からの引用とのこと。

            本書だけではややわかりづらい箇所があったので、参考文献(1)の記述も借りて要約・引用しました。

              • タイトルメタファー思考
              • 著者: 瀬戸 賢一(著)
              • 出版社: 講談社
              • 出版日: 1995-04-17

                参考文献

                (1) 轟里香. “言語学における Figure/Ground 概念の考察: 科学的メタファーの観点から.” Osaka Literary Review 34 (1995): 134-146.

              • 感情史の4つのアプローチ

                まえがき

                感情史(歴史学における感情の研究)の四つの方法論とは。

                リスト

                あとがき

                バーバラ・H.ローゼンワイン、リッカルド・クリスティアーニ 『感情史とは何か』(岩波書店、2021年)より。リストは本文をわたしの理解に沿ってまとめました。かなり粗いうえに的を外している部分があるかも。ラベルの次のカッコは、各アプローチの主要な提唱者です。

                感情史という学術領域があるんですね。まったく違った方向からの見立てがあって面白い。

                著者の一人は第三項目の提唱者なので、いきおいその部分の記述が長く、自説を推している雰囲気がにじみ出ていました。

                • タイトル感情史とは何か
                • 著者: バーバラ・H.ローゼンワイン(著)、リッカルド・クリスティアーニ(著)、伊東 剛史(翻訳)、森田 直子(翻訳)、小田原 琳(翻訳)、舘 葉月(翻訳)
                • 出版社: 岩波書店
                • 出版日: 2021-01-12
                • 自殺に至る6ステップ

                  まえがき

                  『彼のモデルでは、自殺する人間は自殺に至るいくつかのステップを順に踏んで移動してゆき、その移動ごとに危険度も増してゆく。(略)自殺思考の段階を行きつ戻りつすることもあるし、原理的にはどの時点でもそこから降りてしまうことも可能である。しかし、段階を進むにつれて、降りるのは難しくなる。』

                  リスト

                  あとがき

                  まえがきを含めて、ジェシー・ベリング 『ヒトはなぜ自殺するのか』(化学同人、2021年)より。リストは本文を要約して作成しました。

                  まえがきの「彼」は、社会心理学者のロイ・バウマイスター (Wikipedia)。著者が彼の「自己逃避としての自殺」(1) という論文を読んで実施した彼へのインタビューにほぼ一章が割かれています。

                  インタビューの終盤では、こういったプロセスを知ることは自分の問題を別の角度から見る助けになると述べています。

                  • タイトルヒトはなぜ自殺するのか
                  • 著者: ジェシー・ベリング(著)、鈴木光太郎(翻訳)
                  • 出版社: 化学同人
                  • 出版日: 2021-01-31

                    参考文献

                    (1) Baumeister, Roy F. “Suicide as escape from self.” Psychological review 97.1 (1990): 90.