将一种帖子类型的列表放入其他帖子类型中进行选择,并在第二种帖子类型的单页中显示所选项目

时间:2018-06-09 作者:Farhang

我的网站上有两种帖子类型。一个用于课程,另一个用于教师。我想将教师职位类型的可选列表放在课程职位类型中,然后在课程单页中显示,并将其链接到该教师的单页。我该怎么办?

 function custom_meta_box_markup($object)
  {
 wp_nonce_field(basename(__FILE__), "meta-box-nonce");
 ?>
  <div>
  <select name="meta-box-dropdown">
  <?php 
  $args=array(\'post_type\'=>\'mama_ashpaz\');
  $q=new WP_Query($args);


   if($q->have_posts()){
   $current=0;
     while($q->have_posts()){
       $q->the_post();?>
  <?php $options[$current]=get_the_title();
    $options_id[$current]=get_the_id();
    $current++;

    }

    }wp_reset_postdata();
    foreach($options as $key=>$value){
    if($value == get_post_meta($object->ID, "meta-box-dropdown", true))
     {
     ?>
     <option selected><?php echo $value; ?></option>
    <?php    
     }
    else
    {
     ?>
   <option><?php echo $value; ?></option>
    <?php
    }

   }
    ?>
   </select>
   </div>
   <?php  
  }

   function add_custom_meta_box()
   {
    add_meta_box("demo-meta-box", "مامان آشپز", "custom_meta_box_markup", 
  "product", "side", "high", null);
   }

   add_action("add_meta_boxes", "add_custom_meta_box");



    function save_custom_meta_box($post_id, $post, $update)
    {
    if (!isset($_POST["meta-box-nonce"]) || !wp_verify_nonce($_POST["meta- 
    box-nonce"], basename(__FILE__)))
     return $post_id;

      if(!current_user_can("edit_post", $post_id))
      return $post_id;

      if(defined("DOING_AUTOSAVE") && DOING_AUTOSAVE)
       return $post_id;

     $slug = "product";
     if($slug != $post->post_type)
     return $post_id;

    $meta_box_dropdown_value = "";

    if(isset($_POST["meta-box-dropdown"]))
     {
     $meta_box_dropdown_value = $_POST["meta-box-dropdown"];
     }   
    update_post_meta($post_id, "meta-box-dropdown", 
    $meta_box_dropdown_value);

    }

    add_action("save_post", "save_custom_meta_box", 10, 3);

       function add_maman(){?>
     <div class="maman-meta"><a href="<?php echo get_the_permalink();?>">
    <?php echo get_post_meta( get_the_id(), "meta-box-dropdown", true ) ;?>
    </a>
    </div>
    <?php
     }
    add_action( \'woocommerce_before_single_product_summary\',\'add_maman\' );

3 个回复
最合适的回答,由SO网友:Bjorn 整理而成

我无法在这里创建一个完整的解决方案,因为这有点像是“免费为我工作”的问题。

我可以(从全球范围)告诉你如何做到这一点。

wp admin-->课程CPT-->添加元框“选择教师”。收集教师get_posts(). 将所选教师另存为元,使用update_post_meta($course_post_id, \'assigned_teachers\', $assigned_teachers) 在metabox保存功能中get_post_meta($course_post_id, \'assigned_teachers\', true). 如果要获取教师帖子的链接,请使用get_permalink($teacher_post_id).

<小时>UPDATE (OP添加代码)

您的第一个功能:

function custom_meta_box_markup($object)
 {
wp_nonce_field(basename(__FILE__), "meta-box-nonce");
?>
 <div>
 <select name="meta-box-dropdown">
 <?php
 $args=array(\'post_type\'=>\'mama_ashpaz\');
 $q=new WP_Query($args);


  if($q->have_posts()){
  $current=0;
    while($q->have_posts()){
      $q->the_post();?>
 <?php $options[$current]=get_the_title();
   $option[$current]=get_the_id();
   $current++;

   }

   }wp_reset_postdata();
   foreach($options as $key=>$value){
   if($value == get_post_meta($object->ID, "meta-box-dropdown", true))
    {
    ?>
    <option selected><?php echo $value; ?></option>
   <?php
    }
   else
   {
    ?>
  <option><?php echo $value; ?></option>
   <?php
   }

  }
   ?>
  </select>
  </div>
  <?php
 }
有点乱,而且你没有创造<option> 正确地

这样做:

function custom_meta_box_markup($product)

  $options_html = \'\';

  $args = array(
    \'posts_per_page\' => -1, // get all posts
    \'post_type\' => \'mama_ashpaz\',
  );
  $teacher_posts = get_posts($args);

  $selected_teacher = get_post_meta($product->ID, "selected_teacher", true); // notice the different naming, this is more clear.

  if($teacher_posts) {
    foreach($teacher_posts as $teacher) {

      $selected = \'\';
      if($teacher->ID == $selected_teacher) $selected = \'selected="selected"\';

      // in your code you are not setting the option value.
      // When you save the form and collect it with save_post action hook. Only the \'option value=""\' will be passed to the $_POST.
      $options_html .= \'<option value="\'.$teacher->ID.\'" \'.$selected.\'>\'.$teacher->post_title.\'</option>\';
    }
  }

  // start the Output
  ?>
  <select name="product_teachers_select">
  <?php echo $options_html; ?>
  </select>
  <?php
}

// If you\'re keeping the above naming, make sure you update the remaining follow-up functions
现在,教师id已保存。检索教师时,您将拥有他的id。通过他的id,您可以收集所需的任何数据,例如:

$teacher = get_post($teacher_id);
$teacher_description = $teacher->post_content;
$teacher_custom_meta = get_post_meta($teacher->ID, \'the_custom_meta_key\', true);
Tip:
创建代码时,请尝试命名params, meta_keys, functions 以任何人都能理解的方式。即使对你自己来说,这也是非常重要的(想象一下,从现在起两年后看你的代码)。

你好,比约恩

SO网友:Karun

您需要一个带有下拉字段的自定义元框。

这是a link. 它正确地教导如何使用和保存元框中的数据。

在那个元框上,您可以添加WP_Query 获取教师职位类型列表。您可以将选项值设置为ID 您可以使用它在前端进行查询。

在前端,您可以使用get_post_meta 函数从下拉列表中获取保存的值。

然后,使用get_permalink 函数并将元值作为参数传入,以获得教师的完整永久链接。

就是这样。

SO网友:dhirenpatel22

您可以使用第三方免费WordPress插件“ACF”添加额外的自定义字段。

您可以添加relationship field 然后选择要在另一个帖子类型中显示的帖子类型,如下面的屏幕截图所示。

enter image description here

在单个页面中使用以下代码显示选定的帖子。

<?php $posts = get_field(\'relationship_field_name\');
if( $posts ): ?>
  <ul>
  <?php foreach( $posts as $p ): // variable must NOT be called $post (IMPORTANT) ?>
    <li>
        <a href="<?php echo get_permalink( $p->ID ); ?>"><?php echo get_the_title( $p->ID ); ?></a>
        <span>Custom field from $post: <?php the_field(\'author\', $p->ID); ?></span>
    </li>
  <?php endforeach; ?>
  </ul>
<?php endif; ?>
请在以下参考URL中查找有关如何使用关系字段的简要说明:https://www.advancedcustomfields.com/resources/relationship/

结束