WordPressでコードを変更箇所まとめ

テーマを更新した際にさくっと元に戻せるように、Wordpressでコードを変更しているところをこれまでブログでメモ記事にしているものをまとめる。

そして、テーマ更新→復旧としてみた。慎重にローカル環境で練習した後に本番修正。コピペといえ、ミスったら表示できなくなってパニくるので注意してやろう。ローカル環境での練習は一発でうまく行ったが、本番環境では実際、コメントアウトの「//」最初の「/」がコピーされてなかったり、全角になっているのかうまく「true」とかけてなかったり、で何度か失敗した。

過去記事リンクリスト

過去記事の中からコードを変更している記事を列挙する。

--------

変更内容

「前の記事」「次の記事」を同じカテゴリのものだけに

wp-content/themes/lightning/_g3/template-parts/next-prev.php

<?php
global $bootstrap;
//$in_same_term   = apply_filters( 'lightning_prev_next_post_in_same_term', false );
$in_same_term   = apply_filters( 'lightning_prev_next_post_in_same_term', true ); //ここかな?
$excluded_terms = apply_filters( 'lightning_prev_next_post_excluded_terms', '' );
$taxonomy       = apply_filters( 'lightning_prev_next_post_taxonomy', 'category' );
?>

上から3行目にget_previous_post( )とget_next_post()への引数の定義$in_same_term をfalseからtrueにします。

投稿ページの「最近の投稿」に同じカテゴリのものだけを表示

wordpress/wp-content/themes/lightning/_g3/template-parts/sidebar-contents-post.php

//same categoryのため新規変数を追加する
$cats   = get_the_category(); //categoryは配列で入る
$cat_id = $cats[0]->term_id;  //一つ目のcategory ID

$post_loop = new WP_Query(
	array(
		'post_type'              => 'post',
	        'cat'                    => $cat_id,//add for restruct same category
		'posts_per_page'         => 10,
		'no_found_rows'          => true,
		'update_post_meta_cache' => false,
		'update_post_term_cache' => false,
	)
);
?>

カテゴリートップにカテゴリーのイメージ絵を表示

過去記事の構成が複雑ですが、

概要

  1. プラグインのCategory Imagesを利用してカテゴリーごとの画像を登録可能とする。
  2. 上記で登録した画像をカテゴリートップページに表示するためにコードを修正する
    • 要求
      • カテゴリーの画像があれば画像を表示
      • 画像がなければ今までどおりそのカテゴリの背景色でテキストを表示
      • 小さい絵は中央寄せする
      • 絵を表示した上にカテゴリー名を重ねて表示
    • コードの修正
      1. lightningの表示部分の処理を修正
      2. Category Imagesの関数の修正

コードの修正

コードの修正箇所1

wordpress/wp-content/themes/lightning/_g3/template-parts/page-header.php
の一番下に下記コードを追加する

追加コード、青いところが元のコード。

<!-- //カテゴリー独立プロジェクトのための修正、プラグインのCategory Imagesを利用している
<!-- //categoryだったらの条件はz_taxonomy_image()に入っていたのでそこもいじる -->
<?php
if (function_exists('z_taxonomy_image')){
  echo '<div style="text-align: center;">';
  echo '<div style="position: relative; display:inline-block;">';
  $taximage = z_taxonomy_image(); //これで画像表示のecho、成功時にもhtmlコードを返すようにした
  if(!empty($taximage)){           //画像があったらカテゴリー名を表示
    echo '<div style="position: absolute; top: 50%; left: 50%; max-width: 100%; max-height: 100%; color:white;transform:translate(-50%,-50%)">';
    echo '<p>';
    echo wp_kses( apply_filters( 'lightning_page_header_title_html', $page_header_title_html ), $allowed_html ); //カテゴリー名
    echo '</p>';
    echo '</div>';
  }
  echo '</div>';
  echo '</div>';
 }
?>

<!-- //edit 青い枠 -->
<?php
if (empty($taximage)){ //画像がなかったらこれまで通りの青い枠+文字
  echo '<div class="page-header"><div class="page-header-inner container">';
  echo wp_kses( apply_filters( 'lightning_page_header_title_html', $page_header_title_html ), $allowed_html );
  echo ('</div></div>');
 }
?>

<!-- [ /.page-header ] -->
コードの修正箇所2

プラグインCategory Imagesのコードのを変更する。こちらはテーマとは関係ないのでテーマの更新では上書きされない。プラグインの更新で上書きされた場合に元のように修正しよう。

z_taxonomy_image()で画像があったかどうか知りたい。常に$taxonomy_imageを返すようにして、なかったことを「if (empty($taximage))」で判断できるようにしている。


wordpress/wp-content/plugins/categories-images/categories-images.php
関数はzTaxonomyImage() 赤いところをコメントアウト


        if ($echo)    echo $taxonomy_image;
        //else //edit 画像があったかどうかを判定したい
	return $taxonomy_image;
    }

function.phpの変更

WordPressアーカイブが長いので短くしたい

wordpress/wp-content/themes/function.phpにget_archives_link()のフィルターのコードを追加

/* ウィジェットで表示されるアーカイブを短く表示させます
 * 1.リンクが/サイトurl/2022/07というように固定される。リンクは設定次第で変わるので、リンクはそのまま使いたい。 →解決
 * 2.月や週や日で指定された場合の考慮がない →解決
 * 3.12月に記事がない年は年表示がされない →解決
 * 4.今月記事を書いてないと年表示がされない →解決
 * 5.今年の記事しかなく、今月の記事がない場合、2回アーカイブを呼ばれると年が表示されない。→未解決
 * 月表示の後不要なhtmlタグが出ている「</a></li>」 →解決
 * もうガンガン作り変えます
 */
function my_archives_link($link_html){
    $currentMonth = date('n');
    $currentYear = date('Y');

//年指定の場合は何もしない
    if(strpos($link_html,'月') != true){
      return $link_html;
    }

//年/月/(日でもOK?)の場合
    // アーカイブの年月HTMLを編集
    $ym = explode('年', $link_html);        //ym[0]=<li><a href='https://localhost/?m=202206'>2022 ym[1]=6月</a></li> 
    $monthArray = explode('月', $ym[1]);    //$monthArray[0]=6 [1]=</a></li>
    $month = $monthArray[0];                //=6
    $year = intval(strip_tags($ym[0]));	    //2022 remove php html tags
    //$linkMonth = substr('0'.$month, -2);    //0+月の後ろ2文字 012 → 12, 07→07、2桁にしている いらない

    //リンク先
    preg_match_all('/\'.+?\'/', $ym[0], $urlArray);//正規表現で''で囲まれたURLを抽出
    $url = $urlArray[0][0];
    //echo '$urlEX =';echo $url;var_dump ($linkMonthArray); //for debug
	   
    $linkMonth  = '<a href='.$url.' style="white-space: nowrap;">'.$month.'月&nbsp;</a>';
    $linkYear   = '';  //条件により生成する
    $formatYear = '<span style="font-weight:bold;">%s年</span><br />';

//$linkYearを条件により作成し、$_SESSION['printyear']を今処理中の年を入れる。これは1年に1度しか処理させないため
    //今まで出力していた年とは違う場合=初めてその年を出力するとき
    if ($_SESSION['printyear']!=$year) {  //初期値は""空白である。2回目以降呼び出されると最後に処理した年となる
      //※今年の記事しかない場合に2回目に呼ばれると$_SESSION['printyear']が今年から更新されないので引っかからない
      $linkYear = sprintf($formatYear, $year);  //1年目「年+改行」
      $_SESSION['printyear']=$year;           //[年+改行]出力した年を記録
      if($currentYear != $year){        //今年ではない場合
	$linkYear = '<br />'.$linkYear; //さらに頭に[改行]を加える「[改行]+年+[改行]」
      }
    }
    //2回目に呼ばれた時の対策1.:今月だったら間違いなし。不十分。今月書いてなかったらダメ
    else if (($currentMonth == $month) AND ($currentYear == $year)){
      $linkYear = sprintf($formatYear, $year);  //1年目「年+改行」
      $_SESSION['printyear']=$year; //[年+改行]出力した年を記録 
    }
    //そうでない場合は初期値$linkYear = ''

    //'[改行]or[無]2020[改行]' or '無' + '<a href='.$url.' style="white-space: nowrap;">6月</a>'
    return $linkYear.$linkMonth;  //$link_htmlを$linkYear + $linkMonthに加工して返す
}
add_filter('get_archives_link', 'my_archives_link');

スラッグが日本語のときにpost-に換える

記事は無いがこれもwordpress/wp-content/themes/function.phpを修正している。上のと一緒に修正すべき。

/*
* スラッグ名が日本語だったら自動的に投稿タイプ+id付与へ変更(スラッグを設定した場合は適用しない)
*/
function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) {
    if ( preg_match( '/(%[0-9a-f]{2})+/', $slug ) ) {
//        $slug = utf8_uri_encode( $post_type ) . '-' . $post_ID; 
        $slug = utf8_uri_encode( $post_type ); 
//        $slug = utf8_uri_encode( 's15bravetune' ); 
    }
    return $slug;
}
add_filter( 'wp_unique_post_slug', 'auto_post_slug', 10, 4  );

コメントを残す