如何通过选择框向页面添加自定义帖子

时间:2014-10-26 15:29:29

标签: wordpress

我尝试在页面的侧边栏中添加可编辑的文本区域,并能够在此侧边栏中显示不同页面的不同文本。出于各种原因,我不想使用插件。 我到目前为止提出的解决方案是创建一个包含侧栏文本的自定义帖子:

add_action( 'init', 'left_column_posts' );

function left_column_posts() {
    register_post_type( 'left_column_text', 
        array(
            'labels' => array(
                'name' => __( 'Left Column Posts' ),
                'singular_name' => __( 'Left Column Text' )
            ),
            'public' => true,
        )
    );
}

到目前为止一切顺利。 下一步是能够选择其中一个帖子并将其添加到页面中:

add_action('admin_init', 'init_left_column_text_selection');

function init_left_column_text_selection(){
  add_meta_box("left-column-text-meta", "Left Column Text", "add_left_column_text", "page", "side", "low");
}

function add_left_column_text(){
  global $post;  
  echo '<label>Left Column:</label>';
  echo '<select>';
  echo '<option value="" selected>= = = = = = = = = = </option>';
    $loop = new WP_Query(array('post_type' => 'left_column_text'));
    if($loop->have_posts()) {
    //  while($loop->have_posts()) : $loop->the_post();
    //    $title = get_post_meta( get_the_ID(), 'title', true );    
    //    echo '<option value="'.get_the_ID().'">';     
     //   echo $title;
    //  echo the_title();
    //  echo '</option>';
    //  endwhile;
    }   
    echo '</select>';
    wp_reset_query();
}

add_action('save_post', 'save_left_column_text');

function save_left_column_text(){
  global $post;
  update_post_meta($post->ID, "$left_column_text", $_POST["$left_column_text"]);
}

这就是我被困的地方。注释行是不起作用的部分。如何获取帖子ID并保存?另外,另一个问题是,当我保存页面时,slug被覆盖了帖子内容 - 所以我怀疑这里有些东西我没有掌握。

最后一步是创建一个小部件,然后我可以将其添加到侧边栏,并在每页的基础上检索自定义帖子。

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:0)

好的,我认为我已经提出了一个有效的解决方案,所以我会发布我的代码,希望它可以帮助那些正在寻找类似解决方案的人。上面的代码是沿着右边的行,但是包含了一些拼写错误(duh!),它停止了保存选择值。此外,我发现将位置改为&#34; advanced&#34;在add_meta_box()中解决了被覆盖的页面slug的问题(但不确定原因)。我将在下面发布完整的代码(进入functions.php):

add_action( 'init', 'left_column_posts' );

function left_column_posts() {
    register_post_type( 'left_column_text', 
        array(
            'labels' => array(
                'name' => __( 'Left Column Posts' ),
                'singular_name' => __( 'Left Column Text' )
            ),
            'public' => true,
        )
    );
}


add_action('add_meta_boxes', 'init_left_column_text_selection');

function init_left_column_text_selection(){
//add_meta_box( $id, $title, $callback, $page, $context, $priority ); 
  add_meta_box("left_column_text-meta", "Left Column Text", "add_left_column_text", "page", "advanced", "low");
}

function add_left_column_text(){
    global $post;
    $l_c_t = 0;
    $custom = get_post_custom($post->ID);
    if(isset($custom["left_column_text"])){
      $l_c_t = $custom["left_column_text"][0];
    }

    echo '<label>Left Column:</label>';
    echo '<select name="left_column_text">';
    echo '<option value="">= = = = = = = = = = </option>';
    $args = array(
      'post_type' => 'left_column_text',
      'nopaging'  => true
    );
    $query = new WP_Query($args);   
    if($query->have_posts()) {
      while ( $query->have_posts() ) : $query->the_post();
        echo '<option value="'.get_the_ID().'"';
        if($l_c_t == get_the_ID()){
            echo 'selected';
        }
        echo '>';
        the_title();            
        echo '</option>';
      endwhile;
      wp_reset_query();
    }       
    echo '</select>';
}

add_action('save_post', 'save_left_column_text');

function save_left_column_text(){
  global $post;
  update_post_meta($post->ID, "left_column_text", $_POST["left_column_text"]);
}

进入窗口小部件的代码非常简单。它只是看看是否有一个&#34; left_column_text&#34;属性到页面,如果是,它找到相应的帖子:

// WIDGET CODE GOES HERE    
$custom = get_post_custom();
$left_column_id = 0;
if(isset($custom['left_column_text'])) {
    $left_column_id = $custom['left_column_text'][0];
}

$loop = new WP_Query(array('post_type' => 'left_column_text'));
if($loop->have_posts()) {
  while($loop->have_posts()) : $loop->the_post();       
    if ($left_column_id == get_the_ID()){
        echo the_content();
    }       
  endwhile;
}   
wp_reset_query();

这只是一个普通的小部件。

因此,通过此功能,您可以创建单独的文本区域(我称之为&#34;左列帖子&#34;)并从这些帖子中进行选择以将其添加到您的页面。使用您的小部件,您可以选择在页面上显示它们的位置。我不认为它会具有很大的可扩展性(即对几十个自定义帖子没有好处),但我认为它比向您的网页添加数十个自定义文本小部件更具可扩展性。

希望它对某人有用。