web-dev-qa-db-ja.com

1つの投稿しか持てない投稿にフィールドを追加する(チェックボックス)

Wordpressの投稿(ページではなく)にフィールドを追加しようとしていますが、これにはラベルとチェックボックスが含まれているだけです。 これをスティッキーポストにしますか?チェックする場合は、キーをTRUEまたは簡単にアクセスできるものに設定してください。ただし、問題は、1つの投稿にTRUE値のみを設定したいということです。つまり、post-1でフィールドをチェックし、その後post-2でそのフィールドをチェックした場合、post-1のフィールド値はFALSEに設定されるので、同時に1つのポストのみがTRUEになります。

それからindex.phpで投稿をループして、値== TRUEを持つ投稿を取得し、それをページのどこかに表示します。このようなもの(未テスト):

    $args = array(
        'order'             => 'DESC',
        'posts_per_page'    => 1,
        'meta_key'          => 'post_sticky',
        ),
    );
    $stickyPost = new WP_Query( $args );

理想的には、このフィールドを自分のfunctions.phpファイルに設定したいのですが、私がインターネット上で収集したものからすると、そう簡単ではありません。あなたはWordpress自身の中にフィールドを追加することができますが、私は作家に頼っていて、私はそれらをいじって欲しくないのでそのようにしたくありません。

編集:どの投稿もハイライトとしてチェックされていない場合、明らかに4つの投稿が表示されます(これは私がインデックスページで許す限りのものです)。このループを呼び出す前にメインループのポストデータをリセットする必要がありますか?そうであっても、私は投稿があれば付箋投稿以外の投稿を除外することを期待しています。これは私のsidebar.phpファイルのコードです:

<?php $args = array(
    'p' => get_option('my_sticky_post')
    );
    $stickyPost = new WP_Query($args);
?>
<?php if($stickyPost->have_posts()) : while($stickyPost->have_posts()) : $stickyPost->the_post(); ?>
    <aside class="highlight">
        <h3>Must-read</h3>
        <div class="sidebar-content">
            <div class="thumbnail">
            <?php $image_id = get_post_thumbnail_id();
            $image_url = wp_get_attachment_image_src($image_id,'home-featured'); ?>
                <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" style="background-image: url('<?php echo $image_url[0]; ?>');"><span><?php the_title(); ?></span></a>
            </div>
            <?php the_excerpt(); ?>
        </div>
    </aside>
    <?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>

編集2:オプション 'my_sticky_post'の存在を確認することができます。存在しない場合、WPはFALSEを返します。したがって、次のように動作します。

<?php 

$stickyId = get_option('my_sticky_post');
if ($stickyId) :
    $args = array(
        'p' => $stickyId
    );
    $stickyPost = new WP_Query($args);

    if($stickyPost->have_posts()) : while($stickyPost->have_posts()) : $stickyPost->the_post(); ?>
        <aside class="highlight">
            <h3>Must-read</h3>
            <div class="sidebar-content">
                <div class="thumbnail">
                <?php $image_id = get_post_thumbnail_id();
                $image_url = wp_get_attachment_image_src($image_id,'home-featured'); ?>
                    <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" style="background-image: url('<?php echo $image_url[0]; ?>');"><span><?php the_title(); ?></span></a>
                </div>
                <?php the_excerpt(); ?>
            </div>
        </aside>
    <?php endwhile; // have posts ?>
    <?php endif; // have posts ?>
    <?php wp_reset_postdata(); ?>
<?php endif; // $stickyId ?>
2
Bram Vanroy

うまくいけば、私はあなたの質問を正しく理解しました、そして私は以下のコードが役立つことを願っています。

最初に各Postに追加したいオプションを保持するメタボックスを追加しなければなりません、そしてmy_add_sticky_metabox()関数はadd_meta_boxesアクションフックと共にこれを行います。

この段階では、実際には何も印刷していませんが、Post編集画面が表示されるたびに宣言されたコールバック(my_output_sticky_metabox())を使用して印刷するようにWordPressに指示します。

my_output_sticky_metabox()関数を使って、ボックスがチェックされるべきかどうか、そして/または無効にされるべきかどうかに関するチェックを含むメタボックスコンテンツが印刷されます。

最後に正しい値はsave_postアクションフックと一緒にmy_save_sticky_metabox()関数を使って保存されます。

add_action('add_meta_boxes', 'my_add_sticky_metabox');
function my_add_sticky_metabox(){

    add_meta_box(
        'my_sticky_post_metabox',
        __('Sticky Post', 'my_text_domain'),
        'my_output_sticky_metabox',
        'post'
    );

}

function my_output_sticky_metabox($post){

    /** Grab the current 'my_sticky_post' option value */
    $sp = intval(get_option('my_sticky_post'));

    /** Check to see if the 'my_sticky_post' option should be disabled or checked for the current Post */
    $checked = checked($sp, $post->ID, false);
    if($sp > 0) :
        $disabled = (!disabled($sp, $post->ID, false)) ? 'disabled="true"' : '';
    else :
        $disabled = '';
    endif;

    /** Add a nonce field */
    wp_nonce_field('my_sticky_post_metabox', 'my_sticky_post_metabox_nonce');

    /** Add a hidden field to check against in case it is unchecked before save */
    $value = ($checked) ? '1' : '0';
    echo '<input type="hidden" name="was_checked" value="' . $value . '" />';

    /** Output the checkbox and label */
    echo '<label for="my_sticky_post">';
    echo '<input type="checkbox" id="my_sticky_post" name="my_sticky_post" value="' . $post->ID . '" ' . $checked . $disabled . ' />';
    echo 'Make this the sticky post?</label>';

    /** Let the user know which Post is currently sticky */
    switch($sp) :

        case 0:
            $message = 'There is currently no Sticky Post.';
            break;
        case $post->ID:
            $message = 'This Post is the Sticky Post.';
            break;
        default:
            $message = '<a href="' . get_edit_post_link($sp) . '" title="' . the_title_attribute('before=Edit post \'&after=\'&echo=0') . '">' . get_the_title($sp) . '</a> is the current Sticky Post';
            $message.= '<br />You must remove the sticky status from that post before you can make this one sticky.';

    endswitch;
    echo '<p><em>' . $message .'</em></p>';

}

add_action('save_post', 'my_save_sticky_metabox');
function my_save_sticky_metabox($post_id){

    /*
     * We need to verify this came from our screen and with proper authorization,
     * because the save_post action can be triggered at other times.
     */

    /** Ensure that a nonce is set */
    if(!isset($_POST['my_sticky_post_metabox_nonce'])) :
        return;
    endif;

    /** Ensure that the nonce is valid */
    if(!wp_verify_nonce( $_POST['my_sticky_post_metabox_nonce'], 'my_sticky_post_metabox')) :
        return;
    endif;

    /** Ensure that an AUTOSAVE is not taking place */
    if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) :
        return;
    endif;

    /** Ensure that the user has permission to update this option */
    if(!current_user_can('edit_post', $post_id)) :
        return;
    endif;

    /**
     * Everything is valid, now the option can be updated
     */

    /** Check to see if the 'my_sticky_post' option was checked */
    if(isset($_POST['my_sticky_post'])) : // It was...

        update_option('my_sticky_post', $_POST['my_sticky_post']);  // Update the option

    else : // It was not...

        /** Check to see if the option was checked prior to the options being updated */
        if($_POST['was_checked'] != 0) : // It was...

            update_option('my_sticky_post', -1);    // Set the option to '-1'

        endif;

    endif;

}

あなたがあなたのカスタム付箋記事をつかみたいとき今、あなたはこの質問を使います -

$args = array(
    'p' => get_option('my_sticky_post')
);
$stickyPost = new WP_Query($args);

if($stickyPost->have_posts()) : while($stickyPost->have_posts()) : $stickyPost->the_post();

        { Your code goes here }

    endwhile;
endif;
wp_reset_postdata();

私はあなたがここで見てみることをお勧めしたい、たくさんの読み物があります。うまくいけば、それはあなたが上記のコードについてのあなたの質問に答えるでしょう -

編集する

スティッキー投稿が設定されていない場合は、index.phpに4件の投稿が出力されます(これが標準の番号です)。

pパラメータが空の場合は無視されるため、my_sticky_postオプションの値を確認する必要があるためです。

$args配列にこの変更を加えます(そして上記の追加行に注意してください) -

$sticky_id = get_option('my_sticky_post');
$args = array(
    'p' => ($sticky_id) ? $sticky_id : '-1'
);
4
David Gard