我正在寻找一个从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 事物..
有人可以帮我这个吗?
此致
答案 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上工作会更容易将数据写入其他表,而不是尝试从其他地方读取数据。