0

誰かがここで私のコードを見てアドバイスを提供してくれることを望んでいたので、同じタスクを達成するためのより良い方法があるかどうかを知ることができます.やりたいことができるようになるまで。

とにかく、wordpress ギャラリーに画像が表示されている軍人のランクを自動的に検出する wordpress 添付ファイル テンプレートの関数を作成しています。その意図は、誰かが個人の画像をクリックすると、ワードプレスの添付ページが表示され、ランクに関する簡単なメモが表示され、画像のキャプションに記載されている軍のランクに基づいて画像の横にランクの記章が表示されることです。機能は動作します。私はそれを改善し、これがこれを達成するための最良の方法であるかどうか、または私が従うべきより良いコーディングプラクティスがあるかどうかを知りたいと思っています. アドバイスありがとう!

    <?php $a = get_the_excerpt(); ?>
<?php
if (substr_count($a, 'Gen') > 0) {
    $rankimage = 'http://myurl.com/images/Gen.png';
    $rank = 'General';
}
elseif (substr_count($a, 'Col') > 0) {
    $rankimage = 'http://myurl.com/images/Col.png';
    $rank = 'Colonel';
}
elseif (substr_count($a, 'LTC') > 0) {
    $rankimage = '';
    $rank = 'Lieutenant Colonel';
}
elseif (substr_count($a, 'Maj') > 0) {
    $rankimage = '';
    $rank = 'Major';
}
elseif (substr_count($a, 'Cpt') > 0) {
    $rankimage = '';
    $rank = 'Captain';
}
elseif (substr_count($a, 'Lt') > 0) {
    $rankimage = '';
    $rank = 'First Lieutenant';
}
elseif (substr_count($a, '2Lt') > 0) {
    $rankimage = '';
    $rank = 'Second Lieutenant';
}
elseif (substr_count($a, 'SMA') > 0) {
    $rankimage = '';
    $rank = 'Sergeant Major of the Army';
}
elseif (substr_count($a, 'CSM') > 0) {
    $rankimage = '';
    $rank = 'Command Sergeant Major';
}
elseif (substr_count($a, 'SM') > 0) {
    $rankimage = '';
    $rank = 'Sergeant Major';
}
elseif (substr_count($a, '1Sgt') > 0) {
    $rankimage = '';
    $rank = 'First Sergeant';
}
elseif (substr_count($a, 'MSgt') > 0) {
    $rankimage = '';
    $rank = 'Master Sergeant';
}
elseif (substr_count($a, 'SFC') > 0) {
    $rankimage = '';
    $rank = 'Sergeant First Class';
}
elseif (substr_count($a, 'SSgt') > 0) {
    $rankimage = '';
    $rank = 'Staff Sergeant';
}
elseif (substr_count($a, 'Sgt') > 0) {
    $rankimage = '';
    $rank = 'Sergeant';
}
elseif (substr_count($a, 'Cpl') > 0) {
    $rankimage = '';
    $rank = 'Corporal';
}
elseif (substr_count($a, 'Spc') > 0) {
    $rankimage = '';
    $rank = 'Specialist';
}
elseif (substr_count($a, 'PFC') > 0) {
    $rankimage = '';
    $rank = 'Private First Class';
}
elseif (substr_count($a, 'Pvt') > 0) {
    $rankimage = 'http://myurl.com/images/01Pvt.png';
    $rank = 'Private';
}
?>
<?php 
if ($rank != null){
    echo "<table border='1' width='100%'>
        <tbody>
        <tr>
        <td style='text-align: center;' colspan='2'>Rank Detected! $a is a $rank! <img src=$rankimage></td></tr>";
//I placed this if here to close the table in the event that the wordpress image had no description containing the closing tags. I nested it inside the if loop so that it doesn't have to run on pages that don't detect a rank in the image caption.
    if (get_the_content() == null){
        echo "</td></tr></tbody></table>";
    }
}
else{

}
?>

以下の追加コードを追加しました。

    $date_list = Array(
    Array( 'age', "$birthday", 'now' ),
    Array( 'membership', "$datejoined", 'now' ),
    Array( 'promoted', "$lastpromo", 'now' ),
);

foreach ( $date_list as $date_set ) {
    $var = $date_set[0];
    $start = $date_set[1];
    $end  = $date_set[2];
    $datetime1 = date_create($start);
    $datetime2 = date_create($end);
    $interval = date_diff($datetime1, $datetime2);
    if ( substr_count( $var, 'age' ) > 0 ){
        $age = $interval->format('%y');
    }
    elseif ( substr_count( $var, 'membership' ) > 0 ){
        $years = $interval->format('%y');
        $months = $interval->format('%m');
        $membership = floor(($years*12)+$months);
        if($membership > 1){
            $suffix = 'Months';
        }
        elseif($membership == 1){
            $suffix = 'Month';
        }
        else{
            $membership = "< 1";
            $suffix = 'Month';
        }
    }
    elseif ( substr_count( $var, 'promoted' ) > 0 ){
        $years = $interval->format('%y');
        $months = $interval->format('%m');
        $test = $interval->format('%a');
        $promoted = floor(($years*12)+$months);
        if($promoted > 1){
            $suffix = 'Months ago';
        }
        elseif($promoted == 1){
            $suffix = 'Month ago';
        }
        else{
            $promoted = "< 1";
            $suffix = 'ago';
        }
    }
}
4

1 に答える 1

1

そのコードを作成したとき、多くの切り取りと貼り付けを行う必要がありましたよね? 機能するifステートメントを1つ取得し、それをカットアンドペーストしてテキストを変更し、それを19回続けました。そして、少年はそれを吸ったよね?

同じことを何度も繰り返しているときにやりたいことは、ループで実行することです。あなたの場合、考えられる各ランクに関する情報の配列が必要であり、substr チェックを繰り返し実行します (これは最良の方法ではないかもしれませんが、今のところはそのままにしておきます)。それに応じて戻り変数を設定します。

$a = get_the_excerpt();
$rank_list = Array(
    Array( 'Gen', 'General', 'Gen.png' ),
    Array( 'Col', 'Colonel', 'Col.png' ),
    // And so on...
    Array( 'PFC', 'Private First Class', '' ),
    Array( 'Pvt', 'Private', '01Pvt.png' ),
);

foreach ( $rank_list as $rank_set ) {
    $abbr = $rank_set[0];
    if ( substr_count( $a, $abbr ) > 0 ) {
        $rank = $rank_set[1];
        $img  = $rank_set[2];
        $rankimage = ($img == '') ? '' : "http://myurl.com/images/$img";
        break; // Stop looping through the foreach loop
    }
}

元のコードを振り返ってください。あなたはまったく同じことを19回行っています。substr_count()チェックを 19 回、設定を$rank19 回、設定を19 回行います$rankimage。提督を追加する必要がある場合はどうなりますか? 同じコードのチャンクをもう一度カット アンド ペーストする必要があります。やり方にバグを見つけたらどうしますsubstr_count()か?19 行のコードを変更する必要があり、19 行すべてが正しく変更されることを願っています。

さて、あなたの代わりとして私がしたことを見てください。必要なことを実行するコードの小さなフレームワークが 1 つあります。substr_count()これを に変更したい場合preg_match()は、19 ではなく 1 行のコードを変更するだけで済みます。Admiral を追加する必要がある場合は、$rank_listもう一度カット アンド ペーストする代わりに、配列に 1 行のコードを追加します。

DRY と呼ばれるプログラミングの基本原則があります。自分自身を繰り返さないでください。カット アンド ペーストを何度も繰り返している場合 (実際、カット アンド ペーストをまったく行っていない場合) は、おそらく DRY 原則に違反している可能性があります。

于 2013-08-12T01:41:55.000 に答える