默认情况下,织梦的投票标签 {dede:vote} 是调用系统后台设置的一个“默认投票”,但我们可以通过修改其参数,让它指向与当前文章绑定的那个特定投票。

以下是详细的步骤和方法,从易到难,你可以根据自己的需求选择。
最直接的方法(在文章内容页调用)
这种方法适用于在文章内容页(article_article.htm)的末尾或开头,显示与该文章关联的投票。
前提条件:
- 后台已创建投票:在织梦后台,进入“核心” -> “投票管理”,创建一个或多个投票主题,记下你要关联的那个投票的主题ID(在列表中可以看到)。
- 文章已关联投票:这是最关键的一步,织梦默认没有“文章-投票”的关联字段,我们需要手动为文章表(
dede_archives)添加一个字段来存储关联的投票ID。
步骤 1: 为文章表添加一个字段来存储投票ID
-
登录你的网站数据库管理工具(如 phpMyAdmin)。
-
选择你的织梦数据库。
(图片来源网络,侵删) -
找到
dede_archives表(如果你的表前缀不是dede_,请相应修改)。 -
点击“结构”或“SQL”,执行以下SQL语句,为文章表添加一个名为
voteid的字段,用于存储关联的投票ID:ALTER TABLE `dede_archives` ADD `voteid` INT(10) NOT NULL DEFAULT '0' COMMENT '关联的投票主题ID';
-
当你编辑或新增文章时,在“高级选项”里,你将看到一个名为“关联投票ID”的字段,在这里填入你想要关联的投票主题ID。
步骤 2: 修改文章内容页模板
-
进入织梦后台的“模板” -> “默认模板管理”。
-
找到并打开文章内容页模板文件,通常是
article_article.htm。 -
在你希望显示投票的位置(例如文章内容的末尾),插入以下代码:
{dede:vote voteid='[field:voteid /]' lineheight='22' tablewidth='100%' titletext='投票'}代码解释:
{dede:vote}: 这是织梦调用投票的标签。voteid='[field:voteid /]': 这是核心参数,它告诉织梦,不要调用默认投票,而是调用[field:voteid /]这个值所指定的投票主题ID。[field:voteid /]会自动获取当前文章的voteid字段值。lineheight='22': 设置投票选项行高,用于样式调整。tablewidth='100%': 设置投票表格的宽度。titletext='投票': 投票模块的标题。
-
保存模板文件并更新网站缓存。
当你查看一篇在后台设置了“关联投票ID”的文章时,页面就会显示你指定的那个投票。
更灵活的方法(通过自定义函数)
如果你不想修改数据库结构,或者希望有更灵活的控制(例如通过文章自定义字段来关联),可以使用自定义函数的方法。
前提条件:
- 后台已创建投票:同方法一。
- 文章有自定义字段:我们使用织梦的自定义字段功能来关联投票ID。
步骤 1: 添加文章自定义字段
- 在织梦后台,进入“核心” -> “内容模型管理” -> “普通文章” -> “更改”(或选择你使用的模型)。
- 在“字段管理”选项卡中,点击“添加新字段”。
- 设置字段:
- 字段名称:
voteid(必须与下面代码中的变量名一致) - 字段类型:
单行文本 - 字段提示:
关联投票ID - 前台调用: 勾选
- 其他选项保持默认即可。
- 字段名称:
- 保存后,去编辑一篇文章,你会在“常规选项”或“高级选项”中看到新添加的“关联投票ID”输入框,在这里填入投票的主题ID。
步骤 2: 创建自定义函数文件
-
在你的网站根目录下,找到
/include/extend.func.php文件,如果这个文件不存在,请自己创建一个。 -
在这个文件中,添加以下PHP函数:
/** * 根据文章ID获取关联的投票主题ID,并返回投票代码 * @param int $aid 文章ID * @return string 投票的HTML代码 */ function getArticleVote($aid) { global $dsql; $voteid = 0; // 从附加表的自定义字段中获取voteid // 注意:这里假设你的自定义字段在 `dede_addonarticle` 表中,并且字段名为 `voteid` // 如果你的模型不同,表名可能需要修改,`dede_addon17` 等 $query = "SELECT voteid FROM `dede_addonarticle` WHERE aid = $aid"; $row = $dsql->GetOne($query); if (is_array($row)) { $voteid = $row['voteid']; } // 如果找到了voteid,则生成投票代码 if ($voteid > 0) { // 调用投票系统,生成HTML // 注意:这里的路径可能需要根据你的织梦版本调整 require_once(DEDEINC.'/vote.class.php'); $vote = new Vote(); $voteHTML = $vote->GetVoteCode($voteid); return $voteHTML; } return ''; // 如果没有关联投票,则返回空 }代码解释:
- 这个函数接收一个文章ID (
$aid)。 - 它从文章的附加表中查询我们刚刚创建的自定义字段
voteid的值。 - 如果找到了值,就使用织梦自带的
vote.class.php来生成该投票的完整HTML代码。 - 如果没找到,就返回空。
- 这个函数接收一个文章ID (
步骤 3: 在模板中调用自定义函数
-
同样,打开
article_article.htm模板文件。 -
在需要显示投票的位置,插入以下代码:
{dede:field.id function="getArticleVote(@me)"/}代码解释:
{dede:field.id}: 获取当前文章的ID。function="getArticleVote(@me)": 调用我们在extend.func.php中定义的getArticleVote函数,并将文章ID (@me) 作为参数传递给它。
-
保存模板文件并更新缓存。
这种方法的好处是,它不修改核心数据表,更符合织梦的扩展机制,也更灵活。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 方法一 (直接修改数据库) | 实现简单,调用代码直观,性能较好(直接调用字段)。 | 需要直接操作数据库,修改了 dede_archives 表结构。 |
对于已经确定要为所有文章都增加此功能,且不介意修改数据库结构的情况。 |
| 方法二 (自定义函数) | 不修改数据库结构,使用织梦原生自定义字段功能,更灵活、更规范。 | 代码稍复杂,需要创建函数文件,对PHP有一定要求。 | 推荐使用,特别是当你只想在部分文章中显示投票,或者希望遵循织梦最佳实践时。 |
建议:对于大多数用户,强烈推荐使用方法二,因为它更安全、更灵活,且符合织梦的设计哲学。
