Pocket

wordpressプラグインでおなじみの、ACF(advanced Custom fields)

リピーターフィールド内のラジオボタンで、ラベルと値を出力しようとしてちょっと戸惑ったので備忘録です。

前提

まず、ACFのカスタムフィールドの設定は、

repeater_field_nameというリピーターフィールドの中に、btn_nameというラジオボタンのフィールドを設定し、

選択肢を、

3f : 3F
loft : ロフト
2f-only : 2Fまで

と設定しました。
で、「2f-only : 2Fまで」の時は値を表示しないようにしたかったのです。

上手くいかなかった出力方法

通常通りのリピーターフィールドとラジオボタンの出力のコードを書きました。


<?php
if( have_rows('repeater_field_name') ):
while ( have_rows('repeater_field_name') ) : the_row();
//ラジオボタンのデータを代入
$field = get_sub_field_object(‘field_name’);
$value = get_sub_field(‘field_name’);
$label = $field[‘choices’][ $value ];
?>

<?php if($value <> '2f-only'):?>
<p><?php echo $label; ?>
<?php endif;
endwhile;
else :
// no rows found
endif;
?>

これだと「Array」と表示されるだけ。まいったなぁと思ったときは頑張ってDocumentationを確認しましょう。

上手くいった出力方法

調べてみたら、get_sub_field_objectは、has_sub_fieldループ内で使用する必要があるようです。

なので、次のようにコードを修正。


<?php
if( get_field('repeater_field_name') ):
while ( has_sub_field('repeater_field_name') ) :
//ラジオボタンのデータを代入
$field = get_sub_field_object(‘field_name’);
$btn_value = $field['value'];
$value = $btn_value['value'];
$label = $btn_value[‘label’];
?>

<?php if($value <> '2f-only'):?>
<p><?php echo $label; ?>
<?php endif;
endwhile;
else :
// no rows found
endif;
?>

ここまで至るのに諸々ありましたが、迷ったときはprint_r()関数で配列を全て出力してみると糸口をつかめます。

出力した配列

Array
(
[ID] => 6024
[key] => field_58e4c643fc29f
[label] => 3F または ロフト
[name] => repeater_field_name_0_field_name
[prefix] => acf
[type] => radio
[value] => Array
(
[value] => 2f-only
[label] => 2Fのみ
)

[menu_order] => 3
[instructions] => 3階建てまたはロフトをお選びください。
[required] => 0
[id] =>
[class] =>
[conditional_logic] => 0
[parent] => 6020
[wrapper] => Array
(
[width] =>
[class] =>
[id] =>
)

[_name] => field_name
[_prepare] => 0
[_valid] => 1
[choices] => Array
(
[3f] => 3F
[loft] => ロフト
[2f-only] => 2Fのみ
)

[allow_null] => 0
[other_choice] => 0
[save_other_choice] => 0
[default_value] => ロフト
[layout] => horizontal
[return_format] => array
)

誰かのお役にたれてば幸いです。

参考:ACF Docmentation

Pocket

Pocket

プラグインアップデート中に、

「Briefly unavailable for scheduled maintenance. Check back in a minute.」

のメッセージがでて、サイト側も管理画面側も使えなくなってしまいました・・

どうしよう!って慌てずにgoogleに聞きましょう。

原因は「.maintenance」というファイル

wordpressのディレクトリ内に上記ファイルがあると思うので削除しましょう。

.maintenance

アップデート中に作成されるファイルですが、画面遷移やアップデートの失敗でファイルが残ってしまうことがあるようですね。

消してサイトが適切に見れればOKです。

お疲れ様でした。

 

Pocket

Pocket

お客さまより、

「昨日まではちゃんと動いていたのに、今日朝きたら再起動繰り返してしまって起動できません!」というご連絡をいただきました。

何事にも原因と結果があり、何も意識していないのにおかしくなってしまった場合ほとんどがwindows updateの問題です。

お邪魔してみるとwindowsが通常起動できない状態でしたので、セーフモードで起動。

コントロールパネル>プログラム>プログラムと機能>インストールされた更新プログラム

で、問題がありそうな更新プログラムをアンインストールします。

windowsを通常起動できたら、少しメンテナンスしましょう。

ディスククリーンアップ

windowsの標準プログラムです。

Windows Updateのクリーンアップ などが溜まっていたら削除しましょう。

ディスククリーンアップ

※上記はwin10でWindows Updateのクリーンアップの不要ファイルは溜まってません。イメージです。

 

ディスククリーンアップの起動方法

ローカルディスクを右クリックして、プロパティを開きます。

プロパティ画面の「全般」タブ内のディスクのクリーンアップを選択すればOK

まだまだやれることはありますが、今日は時間がないのでこの辺で・・

Pocket

Pocket

最近のサイトは運用を考えて、ほとんどACFでカスタムフィールドを作って納品してます。

が、カスタムフィールドの値がプレビューに反映されないことが判明しました・・。

それじゃ困るので、早速検索。

親切な人がコード書いていてくれました~

function.phpに下記を記載

/*-------------------------------------------*/
/*  カスタムフィールドもプレビューできるようにする
/*-------------------------------------------*/
function get_preview_id($postId) {
    global $post;
    $previewId = 0;
    if ( isset($_GET['preview'])
            && ($post->ID == $postId)
                && $_GET['preview'] == true
                    &&  ($postId == url_to_postid($_SERVER['REQUEST_URI']))
        ) {
        $preview = wp_get_post_autosave($postId);
        if ($preview != false) { $previewId = $preview->ID; }
    }
    return $previewId;
}

add_filter('get_post_metadata', function($meta_value, $post_id, $meta_key, $single) {
    if ($preview_id = get_preview_id($post_id)) {
        if ($post_id != $preview_id) {
            $meta_value = get_post_meta($preview_id, $meta_key, $single);
        }
    }
    return $meta_value;
}, 10, 4);

add_action('wp_insert_post', function ($postId) {
    global $wpdb;
    if (wp_is_post_revision($postId)) {
        if (count($_POST['fields']) != 0) {
            foreach ($_POST['fields'] as $key => $value) {
                $field = get_field($key);
                if ( !isset($field['name']) || !isset($field['key']) ) continue;
                if (count(get_metadata('post', $postId, $field['name'], $value)) != 0) {
                    update_metadata('post', $postId, $field['name'], $value);
                    update_metadata('post', $postId, "_" . $field['name'], $field['key']);
                } else {
                    add_metadata('post', $postId, $field['name'], $value);
                    add_metadata('post', $postId, "_" . $field['name'], $field['key']);
                }
            }
        }
        do_action('save_preview_postmeta', $postId);
    }
});

ネタ元はコチラです。
[WordPress]カスタムフィールドの値もプレビューする

Pocket