【WordPress】特定カテゴリ内の表示順を変更

特定のカテゴリを表示した際、インストール手順などは
表示順を古い順に表示したくなります。

テーマの「functions.php」の最後に下記のコードを追加します。

/**
 * Old post order
 */
function my_pre_get_posts($query) {
	if (is_category('カテゴリのスラッグ名')) {
		$query->set('order', 'ASC');
	}
}
add_action('pre_get_posts', 'my_pre_get_posts');

括弧の閉じ忘れなどがあると500エラーが発生し、
管理画面を表示することすらできなくなるので注意。
万が一なった場合、TeraTermでサーバーにログインし、
「functions.php」をviエディタで編集し、元の状態の戻す必要があります。

私の環境では下記に配置されていました。

/var/www/html/任意ディレクトリ名/wp-content/themes/parament

基本的な確認コマンドその1

  • OSのバージョン確認

    cat /etc/issue
    CentOS release 6.6 (Final)
    Kernel \r on an \m
    
  • OSのbit数確認

    uname -a
    Linux z-area.net 2.6.32-504.23.4.el6.x86_64 #1 SMP Tue Jun 9 20:57:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    

LFTPコマンドの外だし

シェルでLFTPでファイルを取得する必要があったので。

#!/bin/sh
echo "処理開始" >> result.log

# LFTP接続
lftp -f command.txt >> ftp.log

# ftp.logに先頭から始まる「abc*」がない場合
if ! grep "^abc*" ftp.log > /dev/null 2>&1; then

    # ftp.logの内容をresult.logに移し、ftp.logを初期化し、処理正常
    cat ftp.log >> result.log
    echo "処理終了(ファイルなし)" >> result.log
    cp /dev/null ftp.log
    exit 0

# ftp.logに先頭から始まる「abc*」がある場合
else

    # ftp.logの内の先頭から始まる「abc*」をgrepする
    for X in `grep "^abc*" ftp.log`
    do
        # ファイル名(grep結果)が取得できている場合(-eが存在確認)
        if [ ! -e $X ]; then

            # ftp.logの内容をresult.logに移し、ftp.logを初期化し、処理異常
            cat ftp.log >> result.log
            echo "ファイル転送エラー" >> result.log
            cp /dev/null ftp.log
            exit 1
        fi
    done
fi

# ftp.logの内容を初期化し、処理正常
echo "処理終了" >> result.log
cp /dev/null ftp.log
exit 0;
command.txtの内容
open IP
user ユーザ名 パスワード
cd /test
cls abc*.txt
mget abc*.txt

ftp.logは処理が終了すると0バイトに初期化するが、
処理中は下記状態となる。

【正常の場合(取得ファイルあり)】
abc1.txt
abc2.txt

【正常の場合(取得ファイルなし)】
ファイル取得エラー

【異常の場合】
abc1.txt
abc2.tx
ファイル転送エラー

【CentOS】cronの自動実行

cronは決められた時刻にコマンドを定期的に実行させるためのデーモンプロセスです。

  • cronの起動確認

    /etc/rc.d/init.d/crond status
    crond (pid  xxxx) を実行中...
    
  • cronの起動

    /etc/rc.d/init.d/crond start
    
  • cronの設定ファイル(設定変更非推奨)

    cat /etc/crontab 
    
    # 「/etc/password」の記述に関係なく、強制的にここで定義されたシェルを利用
    SHELL=/bin/bash
    # パスの設定
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    # cronの実行結果をここで指定されたユーザー宛にメール
    MAILTO=root
    # cronによりプログラム実行されるときのカレントディレクトリ
    HOME=/
    
  • cronへの登録(手動)

    crontab -e
    
    * * * * * プログラム名
    1番目:分(0 - 59)
    2番目:時(0 - 23)
    3番目:日(1 - 31)
    4番目:月(1 - 12)
    5番目:曜日(0 - 6)(日曜日が0) or (sun,mon,tue,wed,thu,fri,sat)
    

    編集が完了すると下記パスにユーザ名のファイルに保存される。

    /var/spool/cron/ユーザ名
    
  • cronへの登録(自動)
    対象ディレクトリに配置するだけで自動実行される。

    /etc/cron.hourly:1時間に1回実行
    /etc/cron.daily:1日に1回実行
    /etc/cron.weekly:1週間に1回実行
    /etc/cron.monthly:1ヶ月に1回実行
    

【CentOS】myDNSへのグローバルIP自動通知

myDNSへのグローバルIPの通知はDiCEで実施していたのですが、
最近はWindowsを立ち上げることが減ってきたので、
CentOS側にシェルを作成して自動通知することに。

【起動条件】
1日1回起動

【通知条件】
(A) 前回通知したグローバルIPと起動時のグローバルIPが異なる場合
または
(B) 前回実行が「ERROR」の場合
または
(C) 前回実行から5日経過している場合

通知条件(A)は「/etc/cron.daily」にシェルを配置することで
システムで自動的に1日1回起動するようにします。
通知条件(B)と(C)はシェルで実装します。

  • シェル作成

    vi /etc/cron.daily/mydns.sh
    
  • シェル内容

    #!/bin/bash
    
    # 更新時の日付・時刻、IPアドレス、更新結果ログファイル
    CURRENT_IP_FILE='/var/tmp/current_ip.log'
    # 更新時にMyDNS.jpから返されるHTMLファイル
    LOG_FILE='/var/tmp/ip_update.html'
    
    # ieserver.netのグローバルIP確認でグローバルIPを取得
    IP_ADDR_CHK='http://ieserver.net/ipcheck.shtml'
    # myDnsのログインページ
    DDNS_UPDATE="http://www.mydns.jp/login.html"
    USR='myDNSのユーザ名'
    PSW='myDNSのパスワード'
    STATUS='login_status = 1\.'
    
    if [ -f ${CURRENT_IP_FILE} ]; then
        CURRENT=`cat ${CURRENT_IP_FILE}`
        CURRENT_IP=`echo ${CURRENT} | cut -d " " -f 3`
        CURRENT_DT=`echo ${CURRENT} | cut -d " " -f 1-2`
        CURRENT_RTN=`echo ${CURRENT} | cut -d " " -f 4`
    else
        CURRENT_IP='0.0.0.0'
        CURRENT_DT='2000/01/01 00:00:00'
        CURRENT_RTN='ERROR'
    fi
    
    NEW_IP=`wget -q -O - ${IP_ADDR_CHK}`
    NEW_DT=`date +"%Y/%m/%d %H:%M:%S"`
    
    DIFF_DAY=`expr \( \`date -d"${NEW_DT}" +%s\` - \`date -d"${CURRENT_DT}" +%s\` \) / 86400`
    
    if ( [ ${NEW_IP} != "0.0.0.0" ] && [ ${NEW_IP} != ${CURRENT_IP} ] ) \
    || [ ${CURRENT_RTN} = "ERROR" ] \
    || [ ${DIFF_DAY} -gt 5 ]; then
        wget -q --user=${USR} --password=${PSW} -O ${LOG_FILE} ${DDNS_UPDATE}
        if [ $? -eq 0 ] && grep -q "${STATUS}" ${LOG_FILE}; then
            echo "${NEW_DT} ${NEW_IP} OK" > ${CURRENT_IP_FILE}
            MSG="OK"
        else
            echo "${NEW_DT} ${CURRENT_IP} ERROR" > ${CURRENT_IP_FILE}
            MSG="ERROR"
        fi
    fi
    
  • シェル実行権限付与

    chmod 755 /etc/cron.daily/mydns.sh
    

【ファイルサーバ】Samba導入

タブレットを買ったこともあり、
会社作業を2つのPCで行うことが増えたので、
NUCにSambaを構築します。

  • Samba導入

    yum -y install samba
    
  • Samba設定

    mkdir /home/share
    chmod 777 /home/share
    vi /etc/samba/smb.conf
    
    下記内容を[global]の下に追加
    # Linux側文字コード
    unix charset = UTF-8
    # Windows側文字コード
    dos charset = CP932
    # ローカルLAN内からのみのアクセスを許可
    hosts allow = 192.168.XXX.
    
    下記内容を変更
    # Windowsのマイコンピュータの「プロパティ」-「ワークグループ」を指定
    workgroup = MYGROUP
    ↓
    workgroup = WORKGROUP
    
    # 認証を行なわない(ローカルLAN内からのアクセスのみ許可しているため)
    security = user
    ↓
    security = share
    
    # プリンタの共有
    load printers yes
    ↓
    load printers no
    
    [printers]の部分を全てコメントアウト
    
    下記内容を最終行に追加
    # テキトーに好きな名前指定
    [Share]
    # 共有フォルダを指定
     path = /home/share
    # 書き込み許可
    writable = yes
    # ゲストユーザ許可
    guest ok = yes
    # 全てゲストユーザとして扱う
    guest only = yes
    # フルアクセスでファイル作成
    create mode = 0777
    # フルアクセスでディレクトリ作成
    directory mode = 0777
    # 複数人が同時アクセス許可
    share modes = yes
    
  • Samba用のファイアウォール設定
    ファイアウォールの設定を行う。
    外部からは接続できないようにするため、ルーターのポートは開けません。

    iptables -I INPUT 12 -p tcp --dport 445 -j ACCEPT
    iptables -I INPUT 12 -p tcp --dport 139 -j ACCEPT
    iptables -I INPUT 12 -p udp --dport 138 -j ACCEPT
    iptables -I INPUT 12 -p udp --dport 137 -j ACCEPT
    service iptables save
    
  • Samba起動

    /etc/rc.d/init.d/smb start
    /etc/rc.d/init.d/nmb start
    chkconfig smb on
    chkconfig nmb on
    

    smb:ファイル転送の機能を提供する。
    nmb:ネットワークでマシンをブラウジングする機能を提供する。

    Windowsからエクスプローラーで「\\192.168.XXX.XXX\」とうって
    shareディレクトリが確認でき、複数PCでファイルやり取りができれば問題なし。

【メールサーバ】Postfix設定その5(再送)

  • Postfix設定(再送)
    Postfixの設定内容を追加します。
    再送リトライはデフォルトだと5日となっていますが、
    再送出来ない場合、1回で諦めるように設定変更します。

    vi /etc/postfix/main.cf
    
    下記内容を追加
    # 再送リトライは1回
    maximal_queue_lifetime = 0
    bounce_queue_lifetime = 0
    

    設定内容を反映します。

    /etc/rc.d/init.d/postfix restart
    

【メールサーバ】root宛メール

  • root宛メール削除
    「/var/mail/root」と「/var/spool/mail/root」のファイルサイズが増えていたので、
    mailコマンドで確認してみたところ

    sudo -u root mail
    
    No mail for root
    

    メールがないと記載されたが、ファイルサイズがあって気持ち悪いので、
    内容を待避し、削除することにしました。

    cat /var/mail/root > /home/ユーザ名/mail.txt
    cat /dev/null > /var/mail/root
    

    これで「/var/mail/root」と「/var/spool/mail/root」のファイルサイズが0になりました。

  • root宛メール転送
    root宛のメールをPostfixを利用して
    プロバイダのメールアドレスに転送します。

    Postfixのエイリアスの設定場所を確認し、設定値を追加します。

    view /etc/postfix/main.cf
    
    下記内容が設定されていることを確認する。
    alias_maps = hash:/etc/aliases
    
    vi /etc/aliases
    
    下記内容を最終行に追加
    root: プロバイダのメールアドレス
    

    設定内容を反映します。

    postalias /etc/aliases
    /etc/rc.d/init.d/postfix restart
    
  • root宛メール転送確認

    echo test | mail root
    

    「/var/mail/root」と「/var/spool/mail/root」のファイルサイズが0KBのままで
    プロバイダのメールアドレスにテストメールが届きます。

【APサーバ】Tomcat削除

Tomcatが停止できない原因はファイアウォールだったわけですが、
原因特定前にTomcatを再インストールしたので、
Tomcatの削除手順を記載しておきます。

  • Tomcat停止

    ps -ef | grep java
    

    Tomcatが起動していないことを確認。
    Tomcatが起動している場合、停止する。

    sudo -u tomcat /usr/local/tomcat/bin/shutdown.sh
    
  • Tomcat自動起動の停止

    chkconfig --list | grep tomcat
    

    Tomcatが自動起動になっている場合、停止および削除する。

    sudo chkconfig tomcat off
    chkconfig --del tomcat
    
  • Tomcat削除

    • yumでインストールしている場合

      yum list installed | grep tomcat
      

      yumでインストールしたアプリ名を確認し、removeで削除していく。

      sudo yum remove -y 上記で出力されたアプリ名
      
    • 手動でインストールしている場合(私の場合はこちら)

      rm -f /usr/local/tomcat
      rm -fr /usr/local/apache-tomcat-7.0.50
      

【APサーバ】Tomcat停止時にエラー

  • Tomcat停止時エラー
    Apache2とTomcat連携をしてからか、
    MyDNSの設定を変更してからか不明ですが、
    Tomcat停止時に下記エラーが発生しました。

    重大: Catalina.stop:
    java.net.NoRouteToHostException: ホストへの経路がありません
    
    重大: Catalina.stop:
    java.net.ConnectException: 接続を拒否されました
    
  • ファイアウォールの設定見直し
    ルーティング系のエラーはファイアウォールが一番怪しいので、調べてみると
    Tomcat停止時は8005番ポートを利用しているようなので、iptablesの設定を変更します。
    内部の話なのでルーターの設定は変更していません。

    iptables -L --line-numbers
    iptables -I INPUT 9 -p tcp -m tcp --dport 8005 -j ACCEPT
    service iptables save