web-dev-qa-db-ja.com

投稿のカスタムフィールドの自動値

Add_meta_boxアクションを使用して、投稿用のカスタムフィールドを作成しました。自分のカスタムフィールドに基づいて独自のWPクエリを作成し、正しいデータを含む投稿コレクションのみを読み込むようにします。新しいフィールドを追加しても、投稿にカスタムフィールドの値は自動的には表示されません。だから私は手動ですべての投稿を保存せずに適切なコレクションを読み込むことができません。私は1200以上の投稿を持っているので、それらすべてを変更してデータベースに値を設定することは本当に難しいでしょう。

作成したフィールドは自動的に "true"に設定されます。このフィールドが正しい場合は、特定のページに投稿を表示します。私は現在、すべての投稿をそのページに表示する必要があるので、1200の投稿すべてをロードする必要があります。将来、投稿は整理され、いくつかの投稿はホームページに表示されるべきではありません。

Add_meta_boxesアクションを使用してフィールドを作成しました。フィールドの表示、フィールドの編集、およびフィールドの保存は正しく機能します。

/**
 * Add Meta Box to post
 */
if(!function_exists('theme_settings_add_post_meta_box')) {
    function theme_settings_add_post_meta_box()
    {
        $screens = array('post');

        foreach ($screens as $screen) {
            add_meta_box(
                'theme_settings_section_slider',
                __('Homepage Slider', 'slidedata'),
                'theme_settings_section_slider_callback',
                $screen,
                'normal',
                'high'
            );
        }
    }
}

フォーム要素は "theme_settings_section_slider_callback"関数で作成しました。フィルタしたいカスタムフィールドをコピーしました。

$showPost = 'theme_settings_post_show';
<?php /** Show post on frontend */ ?>
<label for="<?php echo $showPost ?>"><?php _e('Show post on homepage') ?></label>
<br />
<select style="margin-bottom: 20px" name="<?php echo $showPost ?>" id="<?php echo $showPost ?>">
    <option value="false" <?php echo get_post_meta($object->ID, $showPost, true)  == 'false' ? '' : 'selected' ?>>No</option>
    <option value="true" <?php echo get_post_meta($object->ID, $showPost, true) != 'false' ? 'selected' : '' ?>>Yes</option>
</select>

保存機能(これもうまく機能します)

if(!function_exists('theme_settings_save_post_meta_box')) {
    function theme_settings_save_post_meta_box($post_id, $post) {
        // Add a check if this account has permission to save, maybe?
        .....
        $data['show_post']      = 'theme_settings_post_show';

        foreach($data as $item) {
            if(isset($_POST[$item])) {
                $value = $_POST[$item];
                update_post_meta($post_id, $item, $value);
            }
        }
    }
}

フィールドロジックはうまく機能します。これは、「theme_settings_post_show」フィールドに基づいて投稿を表示するために使用するクエリです。

//Get all posts which have to be shown on the homepage
if(!function_exists('getPosts')) {
    function getPosts() {
        //$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

        //Query arguments
        $queryArguments = array(
            'posts_per_page' => -1,
            'post_type'     => 'post',
            'meta_key'      => 'theme_settings_post_show',
            'meta_value'    => 'true'
        );

        $postsQuery = new WP_Query($queryArguments);

        if($postsQuery->have_posts()) {
            return $postsQuery;
        }

        return false;
    }
}

ご想像のとおり、フィールド "theme_settings_post_show"はまだどの投稿にも設定されていないので、私は自分の関数 "getPost"で投稿を取得していません。 meta_value nullによるフィルタリングも試しましたが、うまくいきません。

だから、私の質問は:どのように私は自動的にすべての投稿のためのデフォルト値を持つフィールドを作成することができますか?それとも、すべての投稿をループ処理してデータを自動的に設定するようなスクリプトを作成する必要がありますか。または、投稿にフィールドを追加するために間違った方法を使用していますか?

1
Stefan R

meta_query(新しい投稿の場合)とtheme_settings_post_show == trueが設定されていない投稿(古い投稿の場合)を取得するには、theme_settings_post_showを試してください。

<?php
$queryArguments = array(
    'posts_per_page' => -1,
    'post_type'     => 'post',
    'meta_query' => array(
       'relation' => 'OR', // value is not set or true
        array(
         'key' => 'theme_settings_post_show',
         'value' => '', // can be any value, since it does not exists
         'compare' => 'NOT EXISTS',
        ),
        array(
         'key' => 'theme_settings_post_show',
         'value' => true,
         'compare' => '=',
        ),
    ),
);
2
Max Yudin

Advanced Custom Fieldsプラグインにはtrue/falseタイプのフィールドもあり、これを特定の投稿、投稿タイプページなどに追加したり、デフォルト値を定義したりすることもできます。

しかし、これは新しく追加された投稿に対してのみ機能します。

0
D. Dan