自定义/手动PHP函数从wordpress表中检索类别层次结构?

时间:2012-10-10 05:12:05

标签: php wordpress

我正在寻找一个从wordpress表中获取wordpress类别层次结构的函数(wp_terms,wp_term_relationships,wp_term_taxonomy)不使用wordPress函数/模板

我基本上想要获取类别(父/子)关系,然后我想将它们插入到我自己的CMS表中。为此我必须知道“什么类别来自什么?(所有子(多个)目录)

到目前为止,我做到了这一点:

$sql="SELECT a.term_id,a.description,a.parent,a.count,b.name,b.slug
FROM wp_term_taxonomy a INNER JOIN wp_terms b WHERE a.term_id=b.term_id
AND a.taxonomy='category';
";

$result = mysql_query($sql);

while ($row = mysql_fetch_assoc($result)) {
    echo($row['name'].'<br>');
}
exit;

此功能显示所有类别,但不显示层次结构,我无法获得Child Parent 事物..

有人可以帮我这个吗?

此致

2 个答案:

答案 0 :(得分:2)

这并不难。首先,我通过让它表现得像RecursiveIterator

来包装那些递归的东西
class RecursiveCategoryIterator implements RecursiveIterator {
    const ID_FIELD = 'term_id';
    const PARENT_FIELD = 'parent';

    private $_data;
    private $_root;
    private $_position = 0;

    public function __construct(array $data, $root_id = 0) {
        $this->_data = $data;
        $this->_root = $root_id;
    }

    public function valid() {
        return isset($this->_data[$this->_root][$this->_position]);
    }

    public function hasChildren() {
        $subid = $this->_data[$this->_root][$this->_position][self::ID_FIELD];
        return isset($this->_data[$subid])
            && is_array($this->_data[$subid]);
    }

    public function next() {
        $this->_position++;
    }

    public function current() {
        return $this->_data[$this->_root][$this->_position];
    }

    public function getChildren() {
        return new self($this->_data,
            $this->_data[$this->_root][$this->_position][self::ID_FIELD]);
    }

    public function rewind() {
        $this->_position = 0;
    }

    public function key() {
        return $this->_position;
    }

    public static function createFromResult($result) {
        $menu_array = array();
        while($row = mysql_fetch_assoc($result)) {
            $menu_array[$row[self::PARENT_FIELD]][] = $row;
        }

        return new self($menu_array);
    }
}

现在我为什么这样做?首先,因为您可以重新使用id来显示树,或者使用它来做其他事情,就像在自己的表中导入它一样。其次,如果您必须测试代码,则可以将其他RecursiveIterator作为模拟(例如RecursiveArrayIterator)。

现在第二部分,按字数据的实际导入:

// your original query
$sql="SELECT a.term_id,a.description,a.parent,a.count,b.name,b.slug
FROM wp_term_taxonomy a INNER JOIN wp_terms b WHERE a.term_id=b.term_id
AND a.taxonomy='category';
";

$result = mysql_query($sql, $dbh);

// always test for failure
if($result === false) {
    die("query failed: ". mysql_error());
}

// create the iterator from the result set
$wpterms = RecursiveCategoryIterator::createFromResult($result);

// and import it. 
insert_it($wpterms, 0);

// the function which does all the dirty work.
function insert_it($iterator, $parent_id = 0) {
    foreach($iterator as $row) {
        // insert the row, just edit the query, and don't forget
        // to escape the values. if you have an insert function,
        // use it by all means
        $qry = 'INSERT INTO my_table (myparent, myname, ...)'
            . ' VALUES (\'' . mysql_real_escape_string($parent_id)
            . '\', \'' . mysql_real_escape_string($row['name']) . '\', ....)';

        $status = mysql_query($qry);

        if($status === false) {
            // insert failed - rollback and abort
            die("hard: " . mysql_error());
        }

        // you need to pass the id of the new row
        // so the "child rows" have their respective parent
        $cid = mysql_insert_id();

        // insert the children too
        if($iterator->hasChildren()) {
            insert_it($iterator->getChildren(), $cid);
        }
    }
}    

答案 1 :(得分:2)

如果要将数据迁移到其他(甚至是自定义的)CMS,则应使用Export,这将生成一个非常容易解析并导入到第三个的WXR(XML)文件 - 系统。它包括所有帖子类型,分类,元数据,附件和其他所有内容。

直接使用数据库是一件很痛苦的事情,但如果愿意的话,在WordPress上工作会更容易将数据写入其他表,而不是尝试从其他地方读取数据。