向只能有一个帖子的帖子(复选框)添加字段

时间:2015-02-11 作者:Bram Vanroy

我试图在Wordpress帖子(而不是页面)中添加一个字段,其中只包含一个标签和一个复选框。像这样的:把这变成粘性贴子如果选中,则应将键设置为TRUE或易于访问的内容。然而,问题是,我只想one post可能具有真实值。这意味着,当我检查了post-1中的字段,然后又检查了post-2中的字段时,post-1的字段值应该设置为FALSE,以便同时只有一篇post可以为TRUE。

然后我会在索引中循环帖子。php获取值==TRUE的帖子,并将其显示在页面的某个位置。类似这样(未经测试):

    $args = array(
        \'order\'             => \'DESC\',
        \'posts_per_page\'    => 1,
        \'meta_key\'          => \'post_sticky\',
        ),
    );
    $stickyPost = new WP_Query( $args );
理想情况下,我希望在函数中设置此字段。php文件,但从我在互联网上收集的信息来看,这并不像应该的那么容易。你可以在Wordpress本身中添加字段,但我不想这样做,因为我依赖于作者,我不想让他们摆弄。

编辑:显然,当没有选中任何帖子作为突出显示时,会显示4篇帖子(这是我在索引页上允许的最大数量)。在调用此循环之前,是否需要重置主循环的post数据?即便如此,我还是希望if-has帖子会排除除粘性帖子之外的任何其他帖子。这是我侧边栏中的代码。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\\u sticky\\u 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 ?>

1 个回复
最合适的回答,由SO网友:David Gard 整理而成

希望我正确理解了您的问题,希望下面的代码能有所帮助。

首先,您必须添加一个元框来保存要添加到每篇文章中的选项,并且my_add_sticky_metabox() 函数将与add_meta_boxes 行动挂钩。

在这个阶段,您实际上并没有打印任何内容,而是告诉WordPress使用您声明的回调进行打印(my_output_sticky_metabox()) 无论何时显示后期编辑屏幕。

使用my_output_sticky_metabox() 功能打印元数据库内容,包括检查是否应选中和/或禁用该框。

最后,使用my_save_sticky_metabox() 功能与save_post 行动挂钩。

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();
这里有大量的阅读材料,我鼓励你看看,希望它能回答你对上面代码的任何问题-

结束

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register