织梦dede:sql根据自定义字段获取指定id文章内容和字段

最近做个旅游网站,想要实现线路功能,线路攻略包含很多景点,如果在文章页面重复编辑工作量太大,索性就直接在文章页面调用指定几个id文章的字段,织梦调用指定文章的标签非常简单, {dede:arclist idlist=’2,3,4′  orderby=’idlist’  }[field:title/]{/dede:arclist} ,但是由于其中的文章id为动态参数, {dede:arclist idlist=’自定义字段’  orderby=’idlist’  } 又无法实现,只能用dede:sql来实现了。

{dede:sql sql=”SELECT * FROM #@__archives WHERE arcrank>-1 AND id in(~自定义字段名~) ORDER BY FIELD(id,~自定义字段名~)”}<a href=”[field:id runphp=yes]$id=@me;$url=GetOneArchive($id);@me=$url[‘arcurl’];[/field:id]”><img src=”[field:litpic/]”>[field:title/]</a><p>[field:description/]</p>{/dede:sql}

查了一圈资料这个可以实现,这个标签自定义字段有两处,可供两个自定义字段。但是当自定义字段出现多个数值是只能调用第一个数字id的文章,如果想要全部调用还需要修改php文件。 打开 /include/taglib/sql.lib.php 找到

preg_match_all(“/~([A-Za-z0-9]+)~/s”, $sql, $conditions);

修改为:

preg_match_all(“/~([A-Za-z0-9_]+)~/s”, $sql, $conditions);

紧接着找到

$sql = str_replace($conditions[0][$key], “‘”.addslashes($refObj->Fields[$value]).”‘”, $sql);

修改为:

  1. if(is_numeric(str_replace(‘,’,”,$refObj->Fields[$value])))
  2. {
  3. $sql = str_replace($conditions[0][$key], addslashes($refObj->Fields[$value]), $sql);
  4. }
  5. else
  6. {
  7. $sql = str_replace($conditions[0][$key], “‘”.addslashes($refObj->Fields[$value]).”‘”, $sql);
  8. }

ok,这样就能实现任意数量的文章参数调用了,但是注意调用的是archives表里面的字段。