如何在编辑或添加帖子屏幕上添加Metabox来拉取自定义帖子列表(任意两个)?

时间:2018-03-20 作者:Nimesh

我想将metabox添加到自定义帖子列表中,并在编辑或添加帖子屏幕上选择任意两个。最后,当文章发布时,将其显示在单个文章页面上。请帮帮我!任何帮助都将不胜感激。。。。

    add_action( \'add_meta_boxes\', function () {
    add_meta_box(
        \'yourcustom_sectionid\', 
        __( \' Custom Offer Section\', \'yourtextdomain\' ), 
        function ( $post ) {
            wp_nonce_field( plugin_basename( __FILE__ ), \'yourcustom_noncename\' );
            $cstm = get_post_meta(get_the_ID(),\'yourcustom_meta\',true);
            echo "<pre>".print_r($cstm,true)."</pre>";
            $getPostsToSelect = get_posts(\'post_type=offers&numberposts=-1\');
foreach ($getPostsToSelect as $aPostsToSelect) {
    ?>
    <label>
        <input 
          type=\'checkbox\' 
          name=\'yourcustom_meta[]\' 
          class=\'postsToSelect\'
          value=\'<?php echo $aPostsToSelect->ID ?>\'
         /> 
        <?php echo $aPostsToSelect->post_title ?>
    </label><br />
    <?php
}
        }, 
        \'listing\'
    );
} );

and then below:

echo "<script type=\'text/javascript\'>
  var limit = 2;
jQuery(\'input.single-checkbox\').on(\'change\', function(evt) {
   if(jQuery(\'input.single-checkbox:checked\').length > limit) {
       this.checked = false;
   }
});
</script>";
但是jquery似乎无法选择这两个复选框

到目前为止,我获得的结果是4个名为offerin的自定义帖子,如下图所示enter image description here

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

您可以在编辑屏幕中使用

add_action( \'add_meta_boxes\', function () {
    add_meta_box(
        \'yourcustom_sectionid\', 
        __( \' Custom Meta Box\', \'yourtextdomain\' ), 
        function ( $post ) {
            wp_nonce_field( plugin_basename( __FILE__ ), \'yourcustom_noncename\' );
            $cstm = get_post_meta(get_the_ID(),\'yourcustom_meta\',true);
            echo "<pre>".print_r($cstm,true)."</pre>";
        }, 
        \'page\'
    );
} );
您可以使用查询帖子get_posts() 并在该元框中添加一些复选框

$getPostsToSelect = get_posts(\'post_type=post&numberposts=-1\');
foreach ($getPostsToSelect as $aPostsToSelect) {
    ?>
    <label>
        <input 
          type=\'checkbox\' 
          name=\'yourcustom_meta[]\' 
          class=\'postsToSelect\'
          value=\'<?php echo $aPostsToSelect->ID ?>\'
         /> 
        <?php echo $aPostsToSelect->post_title ?>
    </label><br />
    <?php
}
您需要一些jQuery来限制只选择2个。那会有点像

var limit = 2;
jQuery(\'input.single-checkbox\').on(\'change\', function(evt) {
   if(jQuery(\'input.single-checkbox:checked\').length > limit) {
       this.checked = false;
   }
});
您可以通过以下方式保存所有内容:

add_action( \'save_post\', function ( $post_id ) {

     if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
          return;
     if ( !wp_verify_nonce( $_POST[\'yourcustom_noncename\'], plugin_basename( __FILE__ ) ) )
          return;
     if ( \'page\' == $_POST[\'post_type\'] ) { // not the Post Type
          if ( !current_user_can( \'edit_page\', $post_id ) )
               return;
     } else {
          if ( !current_user_can( \'edit_post\', $post_id ) )
               return;
     }

     update_post_meta($post_id,\'yourcustom_meta\',$_POST[\'yourcustom_meta\']);
});
然后在你的single.php, 或者,无论您希望循环显示在哪里,您只需调用它们:

$cstm = get_post_meta(get_the_ID(),\'yourcustom_meta\',true);
foreach ($cstm as $aPostToDisplay) {
    echo "<pre>{$aPostToDisplay->ID} - {$aPostToDisplay->post_title}</pre>";
}
请注意,我是免费的(未经测试),因此复制/粘贴将不起作用。。它更像是一个逻辑guid。

我假设没有仔细检查name=\'yourcustom_meta[]\' 将仅将选中的传递给$_POST[\'yourcustom_meta\'], 但你可能想确认一下。

我还使用了匿名函数,如果这是针对公共插件/主题的,可能不应该使用匿名函数。

SO网友:Kolawole Emmanuel Izzy

我知道这个问题已经问了一段时间了,但下面是我自己的贡献;

add_action( \'add_meta_boxes\', function () {
    add_meta_box(
        \'yourcustom_sectionid\', 
        __( \' Custom Meta Box\', \'yourtextdomain\' ), 
        \'enter_your_callback_function_here\', 
        \'posttype_id\',
        \'side\',
        \'default\'
     );
 } );

function enter_your_callback_function_here( $post ) {
    wp_nonce_field( \'saving_postlist_data\', \'postlist_metabox_wpnonce\' );

    $value = get_post_meta( $post->ID, \'_add_your_meta_key\', true );

    echo "<pre>".print_r($value,true)."</pre>";//This is for testing purpose, remove when you\'re done, this is just to see that your selection is added to the array

    $getAllPostsToSelect = get_posts(\'post_type=PostTypeToGetListFrom&numberposts=-1\');

        ?>
        <div class="List_wrapper">
        <?php foreach ($getAllPostsToSelect as $dPostsToSelect): ?>
            <label>
                <input 
                  type=\'checkbox\' 
                  name=\'_add_your_meta_key[]\' 
                  class=\'postsToSelect\'
                  value=\'<?php echo $dPostsToSelect->ID ?>\'
                  <?php if ($value && in_array($dPostsToSelect->ID, $value) ? { echo \' checked="checked"\'; } ?>
                 /> 
                <?php echo $dPostsToSelect->post_title ?>
            </label><br />
        <?php endforeach ?>
    </div>
    <?php
}

// //Save The custom Meta Data
function why_not_save_the_postlist_data( $post_id ) {
    //If nonce is not set by wordpress
    if ( ! isset( $_POST[\'postlist_metabox_wpnonce\'] ) ) {
        return;
    }

    //If nonce is not verified by wordpress
    if ( ! wp_verify_nonce( $_POST[\'postlist_metabox_wpnonce\'], \'saving_postlist_data\' ) ) {
        return;
    }

    //If wordpress is doing auto-save, dont save metabox
    if ( define(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE ) {
        return;
    }

    //If user cant edit post
    if ( ! current_user_can( \'edit_post\', $post_id )) {
        return;
    }

    $data = $_POST[\'_add_your_meta_key\'];

    //Update the Data
    update_post_meta( $post_id, \'_add_your_meta_key\', $data );
}
add_action( \'save_post\', \'why_not_save_the_postlist_data\' );
测试和工作。你会得到这样的结果;

enter image description here

您可以根据需要设置样式,下面是我用来设置上面屏幕截图样式的CSS;

#yourcustom_sectionid .inside {
    padding-bottom: 40px;
}
#yourcustom_sectionid .inside .List_wrapper {
    height: 150px;
    overflow-y: auto;
    border: 1px solid #dddddd;
    background: #fdfdfd;
    padding: 10px;
}


FRONT-END DISPLAY
数组存储自定义帖子类型的帖子ID,因此要在前端获取帖子名称和链接,需要执行以下操作:;

global $post;

$arrayOfIDs = get_post_meta( $post->ID, \'_add_your_meta_key\', true );

<ul class="anythingHere">
    <?php foreach ($arrayOfIDs as $getPost) : ?>
        <li><a href="<?php echo get_permalink($getPost); ?>"><?php echo get_the_title($getPost); ?></a></li>  
    <?php endforeach; ?>
</ul>
然后输出将如下所示,带有一些CSS样式

enter image description here

结束

相关推荐

在WordPress中使用metabox插件的文件_EXISTS()的问题

我正在使用metabox插件(https://wordpress.org/plugins/meta-box/) 我得到这个警告信息:警告:file\\u exists():文件名超过此平台上允许的最大路径长度(4096):/usr/home/mydomain。com/web/BLOG/wp-content/plugins/meta-box/inc/905ai0evm8qpx-wsfhq1h72rml-zz614ijl0r7dot3brnnip1atfrlg-irkh4c278jlcq7f7dr8pfnvu