Contact Info

  • aniuma OÜ Harju maakond, Tallinn, Lasnamäe linnaosa, Sepapaja tn 6, 15551

カスタムタクソノミーのタームを持っている時の条件分岐

投稿でいうカテゴリーなどのタクソノミーを追加できる”カスタムタクソノミー”という機能を使った時に、そのタクソノミーのタームを指定して「持っている場合は○○」といった条件分岐をしたい時の分岐条件です。
if ( is_object_in_term( $post->ID, 'custom_tax', 'custom_term' ) ):
前述のコードをループ内で仕様し、custom_tax と custom_term を自分で指定したものに変えましょう。
<?php if ( is_object_in_term( $post->ID, 'custom_tax', 'custom_term' ) ) : ?>
    Yes I am!
<?php else: ?>
    No I'm not.
<?php endif; ?>
実際にはこのように該当のタームを持っている時だけ表示を変えることができます。 参考はこちら
https://wordpress.stackexchange.com/questions/13464/check-if-post-type-has-term

カスタム投稿タイプ・カスタムポストタイプで指定したカテゴリー (タクソノミー) をタームのスラッグで指定したい

タイトルの通り「カスタム投稿タイプ・カスタムポストタイプで指定したカテゴリー (タクソノミー) をタームのスラッグで指定したい」時の対処方法とコードです。
$loop = new WP_Query( array(
    'post_type'      => 'new_posttype',
    'posts_per_page' => 1,
    'tax_query' => array(
        array(
            'taxonomy' => 'new_category',
            'field' => 'slug',
            'terms'    => array('category_name'),
            'include_children' => false
        )
    )
) );
while ( $loop->have_posts() ) : $loop->the_post();

    get_template_part( 'template-parts/content' );

endwhile;
wp_reset_postdata();
tax_qeuryを利用して定義をしますが、その時にfieldsの項目でslugを指定するのを忘れないようにしましょう。また、idなどと変更することで出力したいタームの判定形式を変えることもできます。今回はidで取得すると開発環境と本番環境で振る舞いが変わってしまいそうなのでslugで判定しています。
https://stackoverflow.com/questions/46532162/wordpress-tax-query-multiple-terms-using-or-operator
参考にしたのはこちらの記事です

Smart Custom Fields を有効化した時だけ読み込みを有効化する

大変お世話になっている https://2inc.org/ の Smart Custom Fields をコードベースで管理する時にプラグインが有効化されている時にだけコードを読み込む方法です。
https://2inc.org/

Smart Custom Fields が有効化な時だけ読み込むコード

<?php 
if ( in_array( 'smart-custom-fields/smart-custom-fields.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    //plugin is activated
    require_once get_template_directory() . '/functions/custom-fields.php';
};?>
functions.phpは直接汚したくないためパーツを分解して require_once を使ってパーツごとに読み込んでいるのですが、カスタムフィールドの指定をする時にプラグインが有効化されていないとエラーが起きて画面が表示されなくなり、管理画面にも入ることができずに四苦八苦します。 前述のコードのとおり、Smart Custom Fields が有効化されている時だけカスタムフィールドの定義をすれば有効化されている時だけファイルが読み込まれます。
参考の記事はこちら
また、Smart Custom Fields の設定方法をコードで管理したいときは下記の記事が参考になると思います。
https://2inc.org/blog/2015/03/12/4670/
https://yosiakatsuki.net/blog/smart-custom-fields-code-base/
https://qiita.com/yousan/items/7cbd56308ecc0e2bb263

WP User Avatar で設定した画像のURLをループ内で取得する

タイトルのとおり、WP User Avatar で設定した画像のURLをループ内で取得する方法です。
WP User Avatar の公式ディレクトリページ
後述のコードではループの記事から著者のIDを取得して、そのIDをもとにWP User Avatar で設定した画像のURLを取得しています。おそらくループないでしか利用できません。またscrapeImageという機能で画像のURLが正しい形式を確認し、安全に出力するようにしています。
<?php
function scrapeImage( $text ) {
    $pattern = '/src=[\'"]?([^\'" >]+)[\'" >]/';
    preg_match( $pattern, $text, $link );
    $link = $link[1];
    $link = urldecode( $link );

    return $link;
}


$author = get_userdata($post->post_author);
$user_id      = $author->ID ;
$avatar_img  = scrapeImage( get_wp_user_avatar( $user_id ) );
?>

<img src="<?php echo $avatar_img ;?>">
参考の記事はこちらです。
https://stackoverflow.com/questions/35648385/in-plugin-wp-user-avatar-get-avtar-url-not-with-img-src-tag

WP-CLIを使って未使用の画像を一括削除する

WordPressは自動的にさまざまなサイズの画像を生成します。そのためwp-content/uploadsのディレクトリには膨大な画像ファイルが存在することになりますが、その中でも実際には使っていない画像も多数存在します。

今回はWordPressにはアップロードしているけど使っていない画像を一括で削除する方法について解説します。

未使用画像を一括削除する前提条件

  • WP-CLIを利用している
  • ターミナル (シェルコマンド) が使える
  • uploadsのバックアップがある

未使用画像を一括削除する

未使用画像の一覧を取得する

まずは未使用画像の一覧を取得しましょう。WP-CLIが実行できるディレクトリで下記のコマンドを実行します。

wp post list --post_type='attachment' --format=ids --post_parent=0 --post_mime_type='image/jpeg'

上記の wp post list コマンドでは該当するWordPressのポスト一覧を出力してくれます。attachment (メディア) であること、形式が画像であること、添付 (利用) されていること、ポストのIDを出力することというオプションが付与されています。

実行した出力結果

ポストIDから一括で画像を削除する

このように未使用の画像のポストIDが出力されるので、その値をコピーし削除コマンドを実行します。0001などとなっている値は上記で取得した未使用画像のポストIDと差し替えてください。

wp post delete 0001 0002 0003 0004
削除された時の様子

また後述のエラーが表示されている場合は –force オプションを付与しましょう。attachmentはゴミ箱への送信をサポートしていないたゴミ箱にはいれず–forceフラグをたててそのまま削除します。

Posts of type 'attachment' do not support being sent to trash.
Please use the --force flag to skip trash and delete them permanently.

まとめ

WP-CLIを使うと管理画面から1つ1つ画像を削除しんくても画像を削除することができます。また投稿の中で利用されていない画像でもウィジェットなどで利用されていることもあるため注意が必要です。

その他にもWP-CLIを使うと管理画面を使わずに効率よく一括作業をおこなうことができるのでWordPressを利用する上で必須のスキルといえるでしょう。

https://wordpress.stackexchange.com/questions/262823/how-can-i-batch-delete-all-unattached-images-with-wp-cli-or-other-automated-proc
WP-CLIで添付していない画像を一括で消す方法についての質問と回答
WP-CLIのwp post delteの説明

[image-optimize-command] WordPressの画像をWP-CLIを使って圧縮する方法

3年の間、毎日3~4記事ほど発信しているWebメディアのリニューアルと表示速度や管理画面の動作が重たくなってきたためメンテナンスの依頼を受けました。\
画像の入っているUploadsフォルダを見てみるとお50GB近くあり、原因としては多くの画像がまったく圧縮されていない状態で入っておりそのフォルダの圧縮を試みました。\
npmのimageminで処理をしようとしたところ各年の各月に分けた通しても数が多すぎて処理ができなかったため他の方法を模索して下記の記事にたどりつきました。
https://typist.tech/articles/easily-optimize-wordpress-images-using-wp-cli-and-some-binaries/
また上記の内容は下記のリポジトリに集約されているため下記のリンクだけを見ても大丈夫です。
https://github.com/TypistTech/image-optimize-command

導入の方法

早速WP-CLIのインストールしている環境で下記コマンドを実行したところ
wp package install typisttech/image-optimize-command:@stable
後述してあるエラーが表示されます。
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 10485760 bytes) in phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php on line 583
ローカル環境での実行でしたが、PHPの起動メモリがたりないということで設定を変更します。エラー文をググると下記ソースにあたったので参考通りに利用中のPHPとパスを調べ、php.iniのmemory_limitの値を修正します。512でもだめだっので1024に設定しました。(参考 : https://make.wordpress.org/cli/handbook/common-issues/#php-fatal-error-allowed-memory-size-of-999999-bytes-exhausted-tried-to-allocate-99-bytes) インストールが完了すると
Success: Package installed.
と表示されるので実際にコマンドを実行していきます。 なにかのエラー出て、画像が圧縮できませんでした。
PHP Fatal error:  Uncaught Error: Call to undefined method Symfony\Component\Process\Process::fromShellCommandline() in /Users/susumu/.wp-cli/packages/vendor/spatie/image-optimizer/src/OptimizerChain.php:97
Stack trace:
同様の問題を抱えた人がいるみたいです。
https://github.com/TypistTech/image-optimize-command/issues/37

まとめと現状報告

Symfonyがうまく動いてないっぽいけどわからなく迷宮入りです。
情報求む

functions.phpで作ったページネーションのフォーマットがリライトされて404になる問題の解決方法

functions.phpで作ったページネーションがパーマリンクの設定によって自動でリライトされてしまい、2ページ目以降が404になってしまいアクセスできなくなってしまう問題にぶちあたりました。 下記の参考リンクと同様の問題なのですが、参考のコードを利用しても僕のローカル環境では問題が解決しませんでした。
https://teratail.com/questions/130276
前述の参考記事のコードではpageというキーワードとマッチする前にリダイレクトされているようで、先に404へリダイレクトされてしまいます。 後述の参考URLのように /page/○○ という時にだけ条件一致でリライトするようにしたら無事解決し、他のp−まリンク設定でも現状は問題なさそうなのでそのようにしました。
add_filter( 'get_pagenum_link', 'tweak_pagenation_link' );

function tweak_pagenation_link( $link )
{
    return preg_replace( '~/page/(\d+)/?~', '/?paged=\1', $link );
}
https://wordpress.stackexchange.com/questions/78546/change-permalink-structure-for-pagination-only

カスタム投稿タイプの投稿タイプ名 (singluar_name) を取得する

カスタム投稿タイプを作成した時に設定した投稿タイプ名をテンプレート内に表示したいときがあります。その時はobjectを取得しその中から投稿タイプを調べ、ラベルの中のsingluar_nameを取得するとよいでしょう。 ループの中や外で取得方法が違うので用途に応じて下記のサンプルを参考にしてください。

カスタム投稿タイプの名前をループの外で表示する

$post = get_queried_object();
$postType = get_post_type_object(get_post_type($post));
if ($postType) {
    echo esc_html($postType->labels->singular_name);
}

カスタム投稿タイプの名前をループの中で表示する

$postType = get_post_type_object(get_post_type());
if ($postType) {
    echo esc_html($postType->labels->singular_name);
}

カスタム投稿タイプの名前をアーカイブで表示する

$postType = get_queried_object();
echo esc_html($postType->labels->singular_name);

参考URL

https://codex.wordpress.org/Function_Reference/get_queried_object
https://wordpress.stackexchange.com/questions/169504/how-to-get-current-get-post-types-name

G suite でアカウントを作ったら個別にプロフィール写真を設定できない時の解決法

G suiteを契約し複数のアカウントを管理する時はデフォルトで個別にアカウントのプロフィール写真を変更することができません。設定を仕様としてもアイコン画像をアカウントに紐付ける事ができない状態になります。 その時はG suiteの管理画面である Google Admin にアクセスし下記のURLのように個別の設定の許可をするとよいでしょう。
https://support.google.com/a/answer/7326921?hl=ja

管理コンソールのページにログインし、 [ディレクトリ] > [ディレクトリ設定] にアクセスしましょう。ディレクトリ設定のページではユーザが個別に変更できるプロフィールの許可をあたえる設定ができます。 下記画像のようにすべてにチェックをいれれば、性別からプロフィール画像の変更まですべてできるようになります。必要に応じてチェックをいれるとよいでしょう。