将多个自定义帖子附加到一个元字段

时间:2017-01-27 作者:Iváncsik Krisztián

我目前正在为wordpress制作一个webshop模板。

我已经制作了两种自定义帖子类型,一种是我的项目的“产品”。到目前为止,这台工作正常。

然而,现在我正在尝试为订单创建一个post类型。我想存储买家的详细信息,以及他们购买的物品,但我不知道如何将我的产品从其他自定义帖子类型链接到此订单。

我想知道这是否可行,或者我是否应该寻找其他方法来做到这一点?

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

您只需将产品的post ID与订单一起存储(最简单的方法是通过post_meta). 然后你可以运行WP_query 去拿所有的产品。

下面的示例是一个授予用户访问自定义帖子类型和收费积分的系统,并提供更新时发送电子邮件、设置访问状态和手动收费积分的选项。

Multiple users

虽然它和你的不太一样,但同样的原则正在发挥作用。

我假设您已经可以使用WordPress挂钩、CPTs元数据库等。

您需要:

将产品添加到表单(使用ajax搜索和获取产品ID)

  • 钩住update_post 将表单保存到post_metapost_meta 在页面上
  • 假设您有一个具有以下形式的元盒:

    <form>
       <?php
    
         // lets get all your products saved as a serialized list
         // more on how thats done later
         $product_ids = get_post_meta( $post_id, \'product_ids\', true );
    
         // if no value, set default empty array
         if ( empty( $product_ids ) ) { 
           $product_ids = array();
         } else {
           // otherwise, deserialize the value
           $product_ids = explode( $product_ids, \',\' );
         } 
    
         /*
            Two things to note about this code:
    
            1. We are saving the IDs as a string, with ids separated by \',\'
            which we explode into an array to use
    
            2. We are using the post_meta \'single\' argument instead of 
            saving multiple metas and retrieving as array.
    
            You could do save multitple meta values, but it will use up more of 
            your database and is generally harder to maintain
         */
      ?>
       <table id="product_list">
         <?php foreach( $product_ids as $p_id ) : ?>
         <tr>
           <td><input type="text" name="product_id[]" value="<?php echo $p_id; ?>"></td>
         </tr>
         <?php endforeach; ?>
    
         <!-- 
            - Each row has an input with the same name ( id[] ) 
            - Each input value must be a valid ID
    
            You have to use javascript to populate this table with new items
            which can be fetched using ajax through an input elsewhere in the page
    
            Note that to remove a field, just remove it from the DOM
            When saving, we\'ll overwrite the whole array, so any missing
            items won\'t be saved ... as if they were never there!
         -->
       </table>
    </form>
    
    你可以加入save_post. $_POST[ \'product_id\' ] 现在有一个包含所有帖子ID的数组。方便的

    function yourdomain_save_post( $post_id ) {
    
      // check we are updating your product CPT
      if ( get_post_type( $post_id ) != \'your_products_cpt\' ) { return; }
    
      // Parse the product id
      // make sure to check the values receieved, nonces, sanitization etc!
      $product_ids = join( $_POST[ \'product_id\' ], \',\' );
      // this will serialize your product IDs: "2,34,92,3"
      // So it can be used with the display code in the previous example
    
      // save the list
      update_post_meta( $post_id, \'product_ids\', $product_ids, true );
    
    }
    
    现在,如果要提取每个产品信息(说出其名称),可以使用WP_Query:

    // get comma separated string with product IDs
    $product_ids = get_post_meta( $post_id, \'product_ids\', true );
    
    // create WP_Query    
    $args = array(
      \'post_type\' => \'your_products_cpt\', 
      \'post__in\'  => $product_ids             // you can use a comma separated list
                                              // of IDs here ... coincidence..?
    );
    $query = new WP_Query( $args );
    
    if ( $query->have_posts() ) {
      // pretty standard loop from now on
      // You\'re a pro at this I am sure!
    }
    
    真的是这样!

    我知道这有点匆忙,但希望这足以让你开始。

    一旦这些项目就绪,您就可以开始添加更好的功能和UX,例如使用jQuery ui autocomplete和Ajax来搜索产品名称,在表中使用名称(ID为隐藏字段),显示产品图片。。。天空是极限。

    如果您想快速完成,请查看ACF relationship fields.

    还要花一些时间在药典中查找代谢箱和save post hooks

    对于Ajax,我总是指excelent article on Smashingmag

    请记住检查您的ID,清理输入并使用nonce保护您的站点!

    干杯

    相关推荐

    如何让`wp-list-table`显示我在Custom-Post中的`Custom-Fields`

    一切都好吗<我需要wp-list-table 也要显示custom-fields 在每个custom-post 我有,但我不知道如何做到这一点,在这幅图中,它显示了带有字段的表格:Title, Author and Publication Date: 我想要的是能够选择custom-fields 将出现,例如以下示例Title, Carta, Naipe, Author, and Date of Publication: