вывод списка рубрик в виде текста

необходимо организовать вывод списка рубрик в виде текста. фишка вся заключается в том, что надо привязать к рубрике (category) js при помощи которого открывается суб-меню с вложенными в нее рубриками.
поясню:
при стандартном вызове

<?php wp_list_cats('sort_column=name&child_of=1&children=0&hide_empty=0'); ?>

выводиться листинг следующего содержания:

    <li><a href="http://somesite/?cat=2" title="sometitle">some_sub-category_2</a>
</li>
    <li><a href="http://somesite/?cat=3" title="sometitle">some_sub-category_3</a>
</li>
    <li><a href="http://somesite/?cat=4" title="sometitle">some_sub-category_4</a>
</li>
    <li><a href="http://somesite/?cat=5" title="sometitle">some_sub-category_5</a>
</li>

а необходимо:

<div id="divTop1" class="clTop"><a href="somehref" onclick="menu(1); return false" onfocus="this.blur()">some_category_1</a><br>
<div id="divSub1" class="clSub">
    <a href="http://somesite/?cat=2" title="sometitle">some_sub-category_2</a><br>
    <a href="http://somesite/?cat=3" title="sometitle">some_sub-category_3</a><br>
    <a href="http://somesite/?cat=4" title="sometitle">some_sub-category_4</a><br>
    <a href="http://somesite/?cat=5" title="sometitle">some_sub-category_5</a><br>
</div><br />
</div>

код скрипта служит для того, что-бы раскрыть divSub1. а для этого надо вывести some_category_1 в виде текста и потом уж привязать в нему ссылку.

есть идеи как это сделать? 😎

А что тебе мешает переделать для себя wp_list_cats? Добавить туда свои div, убрать li

то, что wp_list_cats используется в других местах… неудобно. попробую переписать аналогично wp_list_cats. потом скажу что вышло)

перепиши, свою запиши в файле function.php темы и используй.
Это самый простой вариант

Пускай вариант и не самый лучшмй, зато работает как надо 😛

<?php

/* put this code to functions.php of your active theme after all.
    ex of use: <?php wp_list_cats_text_only('sort_column=name&child_of=1&children=0&hide_empty=0&codeBefore=_codeBefore_&codeAfter=_codeAfter_'); ?> */

function wp_list_cats_text_only($args = '') {
    if ( is_array($args) )
        $r = &$args;
    else
        parse_str($args, $r);

    // Map to new names.
    if ( isset($r['optionall']) && isset($r['all']))
        $r['show_option_all'] = $r['all'];
    if ( isset($r['sort_column']) )
        $r['orderby'] = $r['sort_column'];
    if ( isset($r['sort_order']) )
        $r['order'] = $r['sort_order'];
    if ( isset($r['optiondates']) )
        $r['show_last_update'] = $r['optiondates'];
    if ( isset($r['optioncount']) )
        $r['show_count'] = $r['optioncount'];
    if ( isset($r['list']) )
        $r['style'] = $r['list'] ? 'list' : 'break';
    $r['title_li'] = '';

    return wp_list_categories_text_only($r);
}

function wp_list_categories_text_only($args = '') {
    if ( is_array($args) )
        $r = &$args;
    else
        parse_str($args, $r);

    $defaults = array('show_option_all' => '', 'orderby' => 'name',
        'order' => 'ASC', 'show_last_update' => 0, 'style' => 'list',
        'show_count' => 0, 'hide_empty' => 1, 'use_desc_for_title' => 1,
        'child_of' => 0, 'feed' => '', 'feed_image' => '', 'exclude' => '',
        'hierarchical' => true, 'title_li' => __('Categories'),
        'codeBefore' => '', 'codeAfter' => '');
    $r = array_merge($defaults, $r);
    if ( !isset($r['pad_counts']) && $r['show_count'] && $r['hierarchical'] )
        $r['pad_counts'] = true;
    if ( isset($r['show_date']) )
        $r['include_last_update_time'] = $r['show_date'];
    extract($r);

    $categories = get_categories($r);

    $output = '';
    if ( $title_li && 'list' == $style )
            $output = '<li class="categories">' . $r['title_li'] . '<ul>';

    if ( empty($categories) ) {
        if ( 'list' == $style )
            $output .= '<li>' . __("No categories") . '</li>';
        else
            $output .= __("No categories");
    } else {
        global $wp_query;

        if ( is_category() )
            $r['current_category'] = $wp_query->get_queried_object_id();

        if ( $hierarchical )
            $depth = 0;  // Walk the full depth.
        else
            $depth = -1; // Flat.

        $output .= walk_category_tree($categories, $depth, $r);
    }

    if ( $title_li && 'list' == $style )
        $output .= '</ul></li>';

    // echo apply_filters('wp_list_categories', $output);

foreach(($categories) as $cat) {
     echo $codeBefore . $cat->cat_name . $codeAfter . '<br />';
 }

}

?>

если есть свои предложения – выкладывайте 🙂

Так, навскидку:

<?php

$text = @wp_list_cats('параметры');

$text =  str_replace(<li>','на что заменить <li>', $text);
$text =  str_replace(</li>','на что заменить </li>', $text);
$text =  str_replace(<ul>','на что заменить <ul>', $text);
$text =  str_replace(</ul>','на что заменить </ul>', $text);

echo $text;

?>

было бы слишком просто если заработал код. не работает, макс! (и дело не в отрывающих одиночных кавычках)

вариант с правкой функций хоть и работает, но опять-же не так как надо 🙁

стал подумывать о выводе даже отдельно по рубрике, просто обращаясь по id и используя стандартные параметры.

и вообще, для чего это, поясню. работаю над доской объявлений, (всё основано на рубриках(category) – это понятно) и появилась необходимость реализовать следующую задачу: есть рубрика Автомобили (к примеру) в нее вложена ‘Авто-рынок’. А вот уже в авторынке – рубрики ‘Куплю’ ‘Продам’ ‘Меняю’ и др. необходимо, что-бы при клике на ‘Авто-рынок’ открывались под-рубрики купли-продажи и прочего. ниже приведу исходник скрипта:

<script language="JavaScript" type="text/javascript">

function lib_bwcheck(){ //Browsercheck (needed)
    this.ver=navigator.appVersion
    this.agent=navigator.userAgent
    this.dom=document.getElementById?1:0
    this.opera5=this.agent.indexOf("Opera 5")>-1
    this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera5)?1:0; 
    this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera5)?1:0;
    this.ie4=(document.all && !this.dom && !this.opera5)?1:0;
    this.ie=this.ie4||this.ie5||this.ie6
    this.mac=this.agent.indexOf("Mac")>-1
    this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0; 
    this.ns4=(document.layers && !this.dom)?1:0;
    this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5)
    return this
}
var bw=new lib_bwcheck()

FoldNumber = 6                 //How many toplinks do you have?
var stayFolded = false            //Stay open when you click a new toplink?
foldImg = 1                    //Do you want images (if not set to 0 and remove the images from the body)?
mainOffsetY = 0                  //Vertical space adjustment between the main items, in pixels.

var unImg=new Image();
unImg.src='foldoutmenu_arrow.gif'

var exImg=new Image();
exImg.src='foldoutmenu_arrow_open.gif'

var px = bw.ns4||window.opera?"":"px";

if(navigator.userAgent.indexOf('Opera')>-1 && document.getElementById){
    scrX= innerWidth; scrY= innerHeight;
    document.onmousemove= function(){
        if(scrX<innerWidth-10 || scrY<innerHeight-10 || scrX>innerWidth+10 || scrY>innerHeight+10){
            scrX = innerWidth;
            scrY = innerHeight;
            initFoldout();
        }
    };
}

function makeMenu(obj,nest){
    nest= (!nest)?"":'document.'+nest+'.';
    this.el= bw.ie4?document.all[obj]:bw.ns4?eval(nest+'document.'+obj):document.getElementById(obj);    
       this.css= bw.ns4?this.el:this.el.style;
    this.ref= bw.ns4?this.el.document:document;        
    this.x= (bw.ns4||bw.opera5)?this.css.left:this.el.offsetLeft;
    this.y= (bw.ns4||bw.opera5)?this.css.top:this.el.offsetTop;
    this.h= (bw.ie||bw.ns6)?this.el.offsetHeight:bw.ns4?this.ref.height:bw.opera5?this.css.pixelHeight:0;
    this.vis= b_vis;
    this.hideIt= b_hideIt;
    this.showIt= b_showIt;
    this.moveIt= b_moveIt;
    return this
}

function b_showIt(){this.css.visibility='visible'}
function b_hideIt(){this.css.visibility='hidden'}
function b_vis(){if(this.css.visibility=='hidden' || this.css.visibility=='HIDDEN' || this.css.visibility=='hide') return true;}
function b_moveIt(x,y){this.x=x; this.y=y; this.css.left=this.x+px; this.css.top=this.y+px}

function menu(num){
    if(bw.bw){
        if (!stayFolded){
            for (var i=0; i<oSub.length; i++){
                if (i!=num){
                    oSub[i].hideIt()
                    if (foldImg)oTop[i].ref["imgA"+i].src = unImg.src
                }
            }
            for(var i=1; i<oTop.length; i++){
                oTop[i].moveIt(0,oTop[i-1].y+oTop[i-1].h)
            }
        }
        if (oSub[num].vis()){
            oSub[num].showIt()
            if (foldImg)oTop[num].ref["imgA"+num].src = exImg.src
        }else{
            oSub[num].hideIt()
            if(foldImg)oTop[num].ref["imgA"+num].src = unImg.src
        }
        for(var i=1; i<oTop.length; i++){ 
            if (!oSub[i-1].vis()) oTop[i].moveIt(0,oTop[i-1].y+oTop[i-1].h+oSub[i-1].h+mainOffsetY) 
            else oTop[i].moveIt(0,oTop[i-1].y+oTop[i-1].h+mainOffsetY)
        }
    }
}

function initFoldout(){
    //Fixing the browsercheck for opera... this can be removed if the browsercheck has been updated!!
    bw.opera5 = (navigator.userAgent.indexOf("Opera")>-1 && document.getElementById)?true:false
    if (bw.opera5) bw.ns6 = 0

    oTop = new Array()
    oSub = new Array()
    //Making the objects and hiding the subs...
    for (var i=0; i<FoldNumber; i++){
        oTop[i] = new makeMenu('divTop'+i,'divCont')
        oSub[i] = new makeMenu('divSub'+i,'divCont.document.divTop'+i)
        oSub[i].hideIt()
    }
    
    //Positioning the top objects...
    oTop[0].moveIt(0,0)
    for (var i=1; i<oTop.length; i++){
        oTop[i].moveIt(0, oTop[i-1].y+oTop[i-1].h+mainOffsetY)
    }
    
    //Making the containing menu object and showing it...
    oCont = new makeMenu('divCont')
    oCont.showIt()
}

// If the browser is ok, the script is started onload...
if(bw.bw) onload = initFoldout;
</script>

и его применение:

<div id="divCont">

<div id="divTop0" class="clTop"><a href="#" onclick="menu(0); return false" onfocus="this.blur()"><img src="foldoutmenu_arrow.gif" name="imgA0" width=12 height=12 alt="" border="0"> [choice 0]</a><br>
<div id="divSub0" class="clSub">
    <a href="#">This is a link</a><br>
    <a href="#">This is a link</a><br>
    <a href="#">This is a link</a><br>
    <a href="#">This is a link</a><br>
</div><br>
</div>

<div id="divTop1" class="clTop"><a href="#" onclick="menu(1); return false" onfocus="this.blur()"><img src="foldoutmenu_arrow.gif" name="imgA1" width=12 height=12 alt="" border="0"> [choice 1]</a><br>
<div id="divSub1" class="clSub">
    <a href="#">This is a link</a><br>
    <a href="#">This is a link</a><br>
</div><br>
</div>

<div id="divTop2" class="clTop"><a href="#" onclick="menu(2); return false" onfocus="this.blur()"><img src="foldoutmenu_arrow.gif" name="imgA2" width=12 height=12 alt="" border="0"> [choice 2]</a><br>
<div id="divSub2" class="clSub">
    <a href="#">This is a link</a><br>
    <a href="#">This is a link</a><br>
    <a href="#">This is a link</a><br>
</div><br>
</div>

<div id="divTop3" class="clTop"><a href="#" onclick="menu(3); return false" onfocus="this.blur()"><img src="foldoutmenu_arrow.gif" name="imgA3" width=12 height=12 alt="" border="0"> [choice 3]</a><br>
<div id="divSub3" class="clSub">
    <a href="#">This is a link</a><br>
    <a href="#">This is a link</a><br>
    <a href="#">This is a link</a><br>
</div><br>
</div>

<div id="divTop4" class="clTop"><a href="#" onclick="menu(4); return false" onfocus="this.blur()"><img src="foldoutmenu_arrow.gif" name="imgA4" width=12 height=12 alt="" border="0"> [choice 4]</a><br>
<div id="divSub4" class="clSub">
    <a href="#">This is a link</a><br>
    <a href="#">This is a link</a><br>
    <a href="#">This is a link</a><br>
    <a href="#">This is a link</a><br>

    <a href="#">This is a link</a><br>
</div><br>
</div>

<div id="divTop5" class="clTop"><a href="#" onclick="menu(5); return false" onfocus="this.blur()"><img src="foldoutmenu_arrow.gif" name="imgA5" width=12 height=12 alt="" border="0"> [choice 5]</a><br>
<div id="divSub5" class="clSub">
    <a href="#">This is a link</a><br>
    <a href="#">This is a link</a><br>
</div><br>
</div>
</div>

вот так вот. если кто знает как реализовать или есть предложения, выкладывайте! 😎

думаю всю затею провернуть через свой скрипт, просто выдергивать записи из wp_categories. вот только трабл: как(откуда) можно получить количество записей в определенной рубрике? по идее, данные об этом хранятся в wp_post2cat (`category_id`), но количество записей в category_id не соответствует реальному количеству постов в данной категории (получаю количество записей из category_id, где category_id = нужной категории).

и как должен выглядеть алгоритм построения иерархического списка?

<?php

define('db_host',    'localhost');
define('db_name',    'wordpress');
define('db_table_name',    'wp_categories');
define('db_user',    'root');
define('db_pwd',    '');

$link = mysql_connect(db_host, db_user, db_pwd)
    or die("Could not connect : " . mysql_error());
print "<h2>Connected successfully</h2>";
mysql_select_db(db_name) or die("Could not select database");

    $query = "SELECT * FROM ".db_table_name." ORDER BY cat_ID";
    $result = mysql_query($query) or die("Query failed : " . mysql_error());

    print "<table>\n";
    while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
        print "\t<tr>\n";
        foreach ($line as $col_value) {
            print "\t\t<td>$col_value</td>\n";
        }
        print "\t</tr>\n";
    }
    print "</table>\n";

    mysql_free_result($result);
    mysql_close($link);
?>

ахтунг! всё верно. просто несколько записей были в черновиках, но прикреплены к некоторым кубрикам. отсюда и неразбериха. количество постов в категории считается количеством записей в таблице wp_post2cat, где category_id = нужной нам категории. теперь спокойно можно придаться здоровому сну 😛

остается разобраться с иерархией, и можно делать свой плагин 😀
есть идеи?

Код для WordPress 2.1:

<?php
function my_cat($text)
{
    $text =  str_replace("\n", ' ', $text);
    $text =  str_replace("\t", ' ', $text);
    $text =  str_replace('> <', '><', $text);
    $text =  str_replace('<li>', '<p>', $text);
    $text =  str_replace('</li>', '', $text);
    $text =  str_replace('<ul>', '', $text);
    $text =  str_replace('</ul>', '', $text);
    $text =  str_replace("<ul class='children'>", '', $text);
    $text =  str_replace('   ', ' ', $text);
    $text =  str_replace('  ', ' ', $text);
    $text =  str_replace('> <', '><', $text);
    $text =  str_replace('<p><p>', '<p>', $text);
    return $text;
}
add_filter('wp_list_categories', 'my_cat');
wp_list_categories('title_li=&use_desc_for_title=0');
remove_filter('wp_list_categories', 'my_cat');
?>

Естественно, форматирование можно по своему усмотрению сделать. Я добавил <p>.

Anonymous
Отправить
Ответ на: