2012-02-02 31 views
4

我想为我的主题创建一个选项页面,其中的选项页面上有一个下拉列表,显示所有类别名称,选项值为ID号该类别,以便在下拉菜单中显示所有类别名称,但是当您选择类别并在前端回显时,它会回显类别标识。WordPress - 主题选项页面与类别列表

我现在的代码显示了类别名称列表,但也回显了名称到前端。我试图修改它的身份证号码,但我没有运气。

因此,只需总结一下,在选项页面上,它需要在下拉列表中显示类别名称,但在前端应该回显类别的ID号。

编辑:这是我使用创建的选项页面的完整代码 - 这一切坐镇内线的functions.php:

<?php 
$themename = "TGH 2012"; 
$shortname = "tgh"; 

$categories = get_categories('hide_empty=0&orderby=name'); 
    $wp_cats = array(); 

    foreach ($categories as $category_list) { 
      $wp_cats[$category_list->cat_id] = $category_list->cat_name; 
    } 

    array_unshift($wp_cats, "Choose a category"); 


global $options; 
$options = array (

    array( "name" => "Homepage Options", 
      "type" => "title"), 

    array( "type" => "open"), 


array( "name" => "Pick Categories", 
     "desc" => "Choose a category from the list to do some interesting stuff.", 
     "id" => $shortname."_categories", 
     "type" => "select", 
     "options" => $wp_cats, 
     "std" => ""), 

array( "type" => "close") 

); 

function mytheme_add_admin() { 

global $themename, $shortname, $options; 

if ($_GET['page'] == basename(__FILE__)) { 

    if ('save' == $_REQUEST['action']) { 

      foreach ($options as $value) { 
       update_option($value['id'], $_REQUEST[ $value['id'] ]); } 

      foreach ($options as $value) { 
       if(isset($_REQUEST[ $value['id'] ])) { update_option($value['id'], $_REQUEST[ $value['id'] ] ); } else { delete_option($value['id']); } } 

      header("Location: themes.php?page=functions.php&saved=true"); 
      die; 

    } else if('reset' == $_REQUEST['action']) { 

     foreach ($options as $value) { 
      delete_option($value['id']); } 

     header("Location: themes.php?page=functions.php&reset=true"); 
     die; 

    } 
} 

add_theme_page($themename." Options", "".$themename." Options", 'edit_themes', basename(__FILE__), 'mytheme_admin'); 

    } 

    function mytheme_admin() { 

    global $themename, $shortname, $options; 

    if ($_REQUEST['saved']) echo '<div id="message" class="updated fade"><p><strong>'.$themename.' settings saved.</strong></p></div>'; 
    if ($_REQUEST['reset']) echo '<div id="message" class="updated fade"><p><strong>'.$themename.' settings reset.</strong></p></div>'; 

?> 
<div class="wrap"> 
<h2><?php echo $themename; ?> settings</h2> 
<form method="post"> 
    <?php foreach ($options as $value) { 

    switch ($value['type']) { 

     case "open": 
     ?> 
    <table width="100%" border="0" style="background-color:#eef5fb; padding:10px;"> 
    <?php break; 

     case "close": 
     ?> 
    </table> 
    <br /> 
    <?php break; 

     case "title": 
     ?> 
    <table width="100%" border="0" style="background-color:#dceefc; padding:5px 10px;"> 
    <tr> 
    <td colspan="2"><h3 style="font-family:Georgia,'Times New Roman',Times,serif;"><?php echo $value['name']; ?></h3></td> 
    </tr> 
    <?php break; 

     case 'text': 
     ?> 
    <tr> 
    <td width="20%" rowspan="2" valign="middle"><strong><?php echo $value['name']; ?></strong></td> 
    <td width="80%"><input style="width:400px;" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" type="<?php echo $value['type']; ?>" value="<?php if (get_settings($value['id']) != "") { echo get_settings($value['id']); } else { echo $value['std']; } ?>" /></td> 
    </tr> 
    <tr> 
    <td><small><?php echo $value['desc']; ?></small></td> 
    </tr> 
    <tr> 
    <td colspan="2" style="margin-bottom:5px;border-bottom:1px dotted #000000;">&nbsp;</td> 
    </tr> 
    <tr> 
    <td colspan="2">&nbsp;</td> 
    </tr> 
    <?php 
     break; 

     case 'textarea': 
     ?> 
    <tr> 
    <td width="20%" rowspan="2" valign="middle"><strong><?php echo $value['name']; ?></strong></td> 
    <td width="80%"><textarea name="<?php echo $value['id']; ?>" style="width:400px; height:200px;" type="<?php echo $value['type']; ?>" cols="" rows=""><?php if (get_settings($value['id']) != "") { echo get_settings($value['id']); } else { echo $value['std']; } ?> 
</textarea></td> 
    </tr> 
    <tr> 
    <td><small><?php echo $value['desc']; ?></small></td> 
    </tr> 
    <tr> 
    <td colspan="2" style="margin-bottom:5px;border-bottom:1px dotted #000000;">&nbsp;</td> 
    </tr> 
    <tr> 
    <td colspan="2">&nbsp;</td> 
    </tr> 
    <?php 
     break; 

     case 'select': 
     ?> 
    <tr> 
    <td width="20%" rowspan="2" valign="middle"><strong><?php echo $value['name']; ?></strong></td> 
    <td width="80%"><select style="width:240px;" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>"> 
     <?php foreach ($value['options'] as $option) { ?> 
     <option<?php if (get_settings($value['id']) == $option) { echo ' selected="selected"'; } elseif ($option == $value['std']) { echo ' selected="selected"'; } ?>><?php echo $option; ?></option> 
     <?php } ?> 
     </select></td> 
    </tr> 
    <tr> 
    <td><small><?php echo $value['desc']; ?></small></td> 
    </tr> 
    <tr> 
    <td colspan="2" style="margin-bottom:5px;border-bottom:1px dotted #000000;">&nbsp;</td> 
    </tr> 
    <tr> 
    <td colspan="2">&nbsp;</td> 
    </tr> 
    <?php 
     break; 

     case "checkbox": 
     ?> 
    <tr> 
    <td width="20%" rowspan="2" valign="middle"><strong><?php echo $value['name']; ?></strong></td> 
    <td width="80%"><? if(get_settings($value['id'])){ $checked = "checked=\"checked\""; }else{ $checked = ""; } ?> 
     <input type="checkbox" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" value="true" <?php echo $checked; ?> /></td> 
    </tr> 
    <tr> 
    <td><small><?php echo $value['desc']; ?></small></td> 
    </tr> 
    <tr> 
    <td colspan="2" style="margin-bottom:5px;border-bottom:1px dotted #000000;">&nbsp;</td> 
    </tr> 
    <tr> 
    <td colspan="2">&nbsp;</td> 
    </tr> 
    <?php   break; 


} 
} 
?> 

    <!--</table>--> 

    <p class="submit"> 
    <input name="save" type="submit" value="Save changes" /> 
    <input type="hidden" name="action" value="save" /> 
    </p> 
</form> 
<form method="post"> 
    <p class="submit"> 
    <input name="reset" type="submit" value="Reset" /> 
    <input type="hidden" name="action" value="reset" /> 
    </p> 
</form> 
<?php 
} 

add_action('admin_menu', 'mytheme_add_admin'); ?> 
<?php 
if (function_exists('register_sidebar')) 
    register_sidebar(array(
     'before_widget' => '<li id="%1$s" class="widget %2$s">', 
     'after_widget' => '</li>', 
     'before_title' => '', 
     'after_title' => '', 
    )); 

?> 

下面的代码,然后放置在“header.php文件”的底部:

<?php global $options; 
foreach ($options as $value) { 
    if (get_settings($value['id']) === FALSE) { $$value['id'] = $value['std']; } else { $$value['id'] = get_settings($value['id']); } 
} 
?> 

然后,这是我用来显示在前端保存变量的代码:

<?php echo $tgh_categories; ?> 

回答

2

这是真的吗?如果是这样,改变cat_idcat_ID

foreach ($categories as $category_list) { 
     $wp_cats[$category_list->cat_id] = $category_list->cat_name; 
} 

EDIT

在此之后:

foreach ($categories as $category_list) { 
       $wp_cats[$category_list->cat_ID] = $category_list->cat_name; 
     } 

地址:

$wp_ids = array(); 

foreach ($categories as $category_list) { 
     $wp_ids[$category_list->cat_ID] = $category_list->cat_ID; 
} 

更改此:

array( "name" => "Pick Categories", 
    "desc" => "Choose a category from the list to do some interesting stuff.", 
    "id" => $shortname."_categories", 
    "type" => "select", 
    "options" => $wp_cats, 
    "std" => ""), 

要这样:

array( "name" => "Pick Categories", 
    "desc" => "Choose a category from the list to do some interesting stuff.", 
    "id" => $shortname."_categories", 
    "cid" => wp_ids, 
    "type" => "select", 
    "options" => $wp_cats, 
    "std" => ""), 

而且改变这种:

case 'select': 
    ?> 
    <tr> 
     <td width="20%" rowspan="2" valign="middle"><strong><?php echo $value['name']; ?></strong></td> 
     <td width="80%"><select style="width:240px;" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>"> 
      <?php foreach ($value['options'] as $option) { ?> 
      <option<?php if (get_settings($value['id']) == $option) { echo ' selected="selected"'; } elseif ($option == $value['std']) { echo ' selected="selected"'; } ?>><?php echo $option; ?></option> 
      <?php } ?> 
     </select></td> 
    </tr> 
    <tr> 
     <td><small><?php echo $value['desc']; ?></small></td> 
    </tr> 
    <tr> 
     <td colspan="2" style="margin-bottom:5px;border-bottom:1px dotted #000000;">&nbsp;</td> 
    </tr> 
    <tr> 
     <td colspan="2">&nbsp;</td> 
    </tr> 
    <?php 
      break; 

要这样:

case 'select': 
    ?> 
    <tr> 
     <td width="20%" rowspan="2" valign="middle"><strong><?php echo $value['name']; ?></strong></td> 
     <td width="80%"><select style="width:240px;" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>"> 
      <?php foreach ($value['options'] as $option) { ?> 
      <option value="<?php echo $value['cid']; ?>" <?php if (get_settings($value['id']) == $option) { echo ' selected="selected"'; } elseif ($option == $value['std']) { echo ' selected="selected"'; } ?>><?php echo $option; ?></option> 
      <?php } ?> 
     </select></td> 
    </tr> 
    <tr> 
     <td><small><?php echo $value['desc']; ?></small></td> 
    </tr> 
    <tr> 
     <td colspan="2" style="margin-bottom:5px;border-bottom:1px dotted #000000;">&nbsp;</td> 
    </tr> 
    <tr> 
     <td colspan="2">&nbsp;</td> 
    </tr> 
    <?php 
      break; 

EDIT

我不好,我忘了$

更改此:

"cid" => wp_ids, 

要:

"cid" => $wp_ids, 

NEW EDIT

更改此:

<tr> 
    <td width="20%" rowspan="2" valign="middle"><strong><?php echo $value['name']; ?></strong></td> 
    <td width="80%"><select style="width:240px;" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>"> 
     <?php foreach ($value['options'] as $option) { ?> 
     <option value="<?php echo $value['cid']; ?>" <?php if (get_settings($value['id']) == $option) { echo ' selected="selected"'; } elseif ($option == $value['std']) { echo ' selected="selected"'; } ?>><?php echo $option; ?></option> 
     <?php } ?> 
    </select></td> 
</tr> 

要这样:

<tr> 
    <td width="20%" rowspan="2" valign="middle"><strong><?php echo $value['name']; ?></strong></td> 
    <td width="80%"><select style="width:240px;" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>"> 
     <?php 

$categories = get_categories('hide_empty=0&orderby=name'); 

foreach ($categories as $category_list) { 

    ?> 
     <option value="<?php echo $category_list->cat_ID; ?>" <?php if (get_settings($value['id']) == $category_list->cat_name) { echo ' selected="selected"'; } elseif ($category_list->cat_name == $value['std']) { echo ' selected="selected"'; } ?>><?php echo $category_list->cat_name; ?></option> 
     <?php } ?> 
    </select></td> 
</tr> 
+0

刚刚尝试过这一点,恐怕它不工作:( – 2012-02-02 17:36:07

+0

看我上面编辑 – seanbreeden 2012-02-02 19:05:58

+0

编辑后的代码显示类别ID,然后显示类别名称,但不再列出它们在select中,而是出现在管理页面的顶部,并在下面显示一条错误消息:警告:无法修改标题信息 - 已在(线路861上的/wp-includes/functions.php中的(输出在/themes/gh2012/functions.php:72处开始输出) – 2012-02-02 20:21:37

1

你看过使用Options Framework

它使得管理面板的所有麻烦。作为奖励,还有内置的类别下拉列表功能。

+0

我同意。选项框架和'wp_dropdown_categories'([documentation](http://codex.wordpress.org/Function_Reference/wp_dropdown_categories))是迄今为止最好也是最简单的方法。 – Simon 2012-02-08 18:37:28

+0

我宁愿找到我现有代码的解决方案。 – 2012-02-10 18:52:10

+0

在这种情况下,我会建议在使用类别列表时查看选项框架文件。 – MBL 2012-02-11 01:21:29

0

我一直在寻找同样的东西,并没有发现哪里实际回答你想要做的事情,甚至没有这个线程。至少在这里他们很接近,但是他们仍然在提供的问题代码中破坏了一些功能。但是,我一直在为此工作几个小时,而且通常情况下,您工作的时间越长,解决方案的结果就越简单。

我假设你正试图让我们WP_Query选择并显示来自在你的新选项页面中选择的类别的帖子,就像我一样。我发现如果你使用的是名字,WP_Query不喜欢通过类别递归筛选,但如果你使用的是cat_ID,即使使用get_cat_ID也不会。因此,首先,这里是出现在我的面前,page.php文件

<?php 
    $feat1= get_option('twp_feat_cat'); //this is the id of your option in the mega array you setup in functions.php 
    $args=array('cat' => $feat1,'post_type' => 'post','post_status' => 'publish','posts_per_page' => 2,'caller_get_posts'=> 1); 
    $my_query = null; 
    $my_query = new WP_Query($args); 
    $post_counter = 0; //so I can style last post differently with css 
    if($my_query->have_posts()) { 
     while ($my_query->have_posts()) : $my_query->the_post(); $post_counter++; ?> 
      <article id="post-<?php the_ID(); ?>" <?php if ($post_counter == 1) post_class('fourcol first clearfix'); elseif ($post_counter == count($posts)) post_class('fourcol last clearfix'); else post_class('fourcol clearfix'); ?> role="article"> 
      <header class="article-header"> 
      <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2> 
      </header> <!-- end header section --> 
      <section class="entry-content clearfix"> 
       <?php $thumb = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'original'); 
       $url = $thumb['0']; 
       echo do_shortcode('[rimg src="' . $url . '"]'); 
       ?> 
       <?php the_excerpt(); ?> 
      </section> <!-- end article section --> 
      <footer class="article-footer"> 
       <p class="tags"><?php //the_tags('<span class="tags-title">' . __('Tags:', 'bonestheme') . '</span> ', ', ', ''); ?></p> 
      </footer> <!-- end article footer --> 
      </article> 
      <?php 
      endwhile; 
      } 
      wp_reset_query(); // Restore global post data stomped by the_post(). 
      ?> 

该片段从我的主题选项页采取CAT_ID,并将其放入$feat1

需要的功能只有两个变化我WP_Query 。从最初的PHP正在改变这一点:

$wp_cats[$category_list->cat_id] = $category_list->cat_name; 

这样:

$wp_cats[$category_list->cat_ID] = $category_list->cat_ID; 

,然后从这个修改您的选择<option>标签:

<option<?php if (get_settings($value['id']) == $option) { echo ' selected="selected"'; } elseif ($option == $value['std']) { echo ' selected="selected"'; } ?>><?php echo $option; ?></option> 

这样:

<option value="<?php echo $option;?>" <?php if (get_settings($value['id']) == $option) { echo 'selected="selected"'; } ?>><?php echo get_cat_name($option); ?></option> 

我不必在我的header.php中放入任何东西来实现这个功能。因此,它所做的不是使用cat_name,而是使用cat_ID,但在下拉列表中填充用户友好的cat_name,同时仍将每个条目与cat_ID关联,我认为这是您要查找的内容。我很抱歉,如果这很长,晚,或不是你想要的东西,但这是我第一次为该网站做出贡献,而这个帖子让我开始寻找解决方案。