在多个内容类型之间创建关系

时间:2013-04-26 作者:Grant Palin

我在一个网站上工作,除了内置的内容类型外,还有多种内容类型(见下面的列表)。我想建立在任何方向标记相关内容的能力,从任何内容类型到任何其他类型。

内容类型包括:

  • post
  • page
  • topic (来自bbpress)case (自下而上的自定义类型)
  • note
  • question
  • therapy_guideline
以下是我的functions.php 用于设置从帖子到其他内容类型的可能连接:

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-post\',
        \'from\' => \'post\',
        \'to\' => \'post\'
    )
);

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-page\',
        \'from\' => \'post\',
        \'to\' => \'page\'
    )
);

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-topic\',
        \'from\' => \'post\',
        \'to\' => \'topic\'
    )
);

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-case\',
        \'from\' => \'post\',
        \'to\' => \'case\'
    )
);

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-note\',
        \'from\' => \'post\',
        \'to\' => \'note\'
    )
);

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-question\',
        \'from\' => \'post\',
        \'to\' => \'question\'
    )
);

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-therapy_guideline\',
        \'from\' => \'post\',
        \'to\' => \'therapy_guideline\'
    )
);
这只是为了建立从帖子到其他内容类型的关系。我重复了这些咒语来建立其他各种联系——总共28个。我对这种重复感到畏缩。如果添加更多的内容类型,并且需要能够连接到所有(或大部分)其他类型,这可能会非常尴尬。

我突然想到,我可以使用一个循环来迭代这些内容类型中的每一种,并生成到其他类型的连接,但这感觉不对。我也读过关于倒数值的内容,但这似乎是从内容类型回到了相同的类型。有没有一种方法可以简化在不同内容类型之间创建连接的过程,而不必为每个方向(从和到)创建连接?

我的目的是在创建/编辑内容时,通过后端方便选择与当前内容相关的内容。然后在显示所述当前内容之后显示“相关内容”部分。这些相关的内容片段可以跨越正在使用的各种内容类型,但可以手动选择,以确保最大的相关性。

我在这些内容类型中使用自定义分类法,并考虑过使用它来查找相关内容,但分类法仍然过于宽泛。手动选择似乎是一条出路。

6 个回复
最合适的回答,由SO网友:GhostToast 整理而成

为什么不。。。

$my_post_types = array(
    \'post\', 
    \'page\', 
    \'topic\', 
    \'case\', 
    \'note\', 
    \'question\', 
    \'therapy_guideline\'
);

p2p_register_connection_type( array(
    \'name\' => \'my_post_relationships\',
    \'from\' => $my_post_types,
    \'to\' => $my_post_types,
    \'sortable\' => \'any\',
    \'reciprocal\' => false,
    \'cardinality\' => \'many-to-many\',
    \'title\' => array(
        \'from\' => \'Children\',
        \'to\' => \'Parent\',
        ),
    \'admin_column\' => \'any\',
    )
);
或者类似的东西?

编辑:

使用前面提到的数组,可以在不需要所有键入的情况下获取多个框。

foreach($my_post_types as $post_type){
    // use line below if you don\'t ever need to relate posts to posts, pages to pages, etc.
    $temp_array = array_diff($my_post_types, array($post_type));

    p2p_register_connection_type( array(
        \'name\' => \'my_\'.$post_type.\'_connections\',
        \'from\' => $temp_array, // use $my_post_types if you didn\'t define $temp_array
        \'to\' => $post_type,
        \'sortable\' => \'any\',
        \'reciprocal\' => false,
        \'cardinality\' => \'many-to-many\',
        \'admin_column\' => \'any\',
        )
    )
}
temp数组使每个post类型都与其他post类型相关,而不是与自身相关。不确定这是不是你想要的东西,很容易移除。

SO网友:128KB

GhostToast似乎重复回答了您的问题。

针对您的具体情况执行此操作应显示相关内容:https://github.com/scribu/wp-posts-to-posts/wiki/Related-posts:

$related=p2p\\u类型(“posts\\u to\\u pages”)->get\\u related(get\\u queryed\\u object());

唯一的区别是,我们将get\\u connected()替换为get\\u related()。

对于手动查找特定内容,这在过去对我很有用:http://wordpress.org/plugins/better-internal-link-search/

SO网友:s1lv3r

对我来说,实际的问题是:您使用关系信息的目的和方式是什么?它显示在哪里,或者您是否需要它来实现任何进一步的业务逻辑?

据我所知,核心功能无法实现这一点。

如果我过去想在没有插件的情况下实现类似的功能,那么我编写了一些定制PHP,可以自动添加一个分类法来保存post类型之间的关系信息。与使用相比,使用其他分类法的主要好处是post_meta 您可以更轻松地根据关系信息查询和访问您的内容。

如果插件的开销适合所需的功能,那么我使用Advanced Custom Fields (关系型或post对象字段类型),无需任何php即可完成所有这些操作,只需在后端进行一些单击(但使用post_meta 保存关系)。

SO网友:Chris Cox

最好的方法是注册一个非层次分类法,在要关联的不同帖子类型之间共享。

然后,您可以使用WP的内置分类查询来提取任何术语的所有关联内容。一般来说,您要查询的任何内容都应该是一个分类法,而不是一个字段,因为按字段查询在DB上要复杂得多。

SO网友:ksr89

如果要在自定义帖子类型之间创建关系,可以使用插件TYPES . 使用此插件,您可以创建自定义帖子类型,还可以设置它们之间的关系,如父关系或子关系。

另一种方法是将关系值保存在post\\u元表中,以便根据关系信息更轻松地查询和访问内容。

SO网友:Dr. Abhishek Ghosh

你需要这个还是更复杂?

enter image description here

这只是一个原型示例。therapy_guideline 可能有surgical_therapy_guideline, conservative_therapy_guideline, palliative_therapy_guideline, 等

不管你想要多复杂,你都可以做到。实际上,您需要在该网站上实现语义网。创建语义的最简单方法是使用RDFa数据。您可以使用Enhanced Publication Plugin.有许多免费资源creating semantic web. 您可以使用Apache Stanbol plus Open Refine(在Google项目中搜索)。您将使用什么取决于可能的查询的数量、数据库的可伸缩性以及您的知识。增强的发布插件将向WordPress的MySQL数据库(甚至不是MySQLi)增量添加小数据。如果您想使用WordPress plus插件并且服务器上的负载非常高,最好在nginx服务器上转换为PostgreSQL。

显然,您可以将RDFa、JSON或API与Apache Stanbol一起使用,并将其与PHP或WordPress自定义挂钩一起使用。如果您想创建插件,可以使用另一个相关Post插件的框架。

结束

相关推荐

在多个内容类型之间创建关系 - 小码农CODE - 行之有效找到问题解决它

在多个内容类型之间创建关系

时间:2013-04-26 作者:Grant Palin

我在一个网站上工作,除了内置的内容类型外,还有多种内容类型(见下面的列表)。我想建立在任何方向标记相关内容的能力,从任何内容类型到任何其他类型。

内容类型包括:

  • post
  • page
  • topic (来自bbpress)case (自下而上的自定义类型)
  • note
  • question
  • therapy_guideline
以下是我的functions.php 用于设置从帖子到其他内容类型的可能连接:

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-post\',
        \'from\' => \'post\',
        \'to\' => \'post\'
    )
);

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-page\',
        \'from\' => \'post\',
        \'to\' => \'page\'
    )
);

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-topic\',
        \'from\' => \'post\',
        \'to\' => \'topic\'
    )
);

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-case\',
        \'from\' => \'post\',
        \'to\' => \'case\'
    )
);

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-note\',
        \'from\' => \'post\',
        \'to\' => \'note\'
    )
);

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-question\',
        \'from\' => \'post\',
        \'to\' => \'question\'
    )
);

p2p_register_connection_type(
    array(
        \'name\' => \'post-to-therapy_guideline\',
        \'from\' => \'post\',
        \'to\' => \'therapy_guideline\'
    )
);
这只是为了建立从帖子到其他内容类型的关系。我重复了这些咒语来建立其他各种联系——总共28个。我对这种重复感到畏缩。如果添加更多的内容类型,并且需要能够连接到所有(或大部分)其他类型,这可能会非常尴尬。

我突然想到,我可以使用一个循环来迭代这些内容类型中的每一种,并生成到其他类型的连接,但这感觉不对。我也读过关于倒数值的内容,但这似乎是从内容类型回到了相同的类型。有没有一种方法可以简化在不同内容类型之间创建连接的过程,而不必为每个方向(从和到)创建连接?

我的目的是在创建/编辑内容时,通过后端方便选择与当前内容相关的内容。然后在显示所述当前内容之后显示“相关内容”部分。这些相关的内容片段可以跨越正在使用的各种内容类型,但可以手动选择,以确保最大的相关性。

我在这些内容类型中使用自定义分类法,并考虑过使用它来查找相关内容,但分类法仍然过于宽泛。手动选择似乎是一条出路。

6 个回复
最合适的回答,由SO网友:GhostToast 整理而成

为什么不。。。

$my_post_types = array(
    \'post\', 
    \'page\', 
    \'topic\', 
    \'case\', 
    \'note\', 
    \'question\', 
    \'therapy_guideline\'
);

p2p_register_connection_type( array(
    \'name\' => \'my_post_relationships\',
    \'from\' => $my_post_types,
    \'to\' => $my_post_types,
    \'sortable\' => \'any\',
    \'reciprocal\' => false,
    \'cardinality\' => \'many-to-many\',
    \'title\' => array(
        \'from\' => \'Children\',
        \'to\' => \'Parent\',
        ),
    \'admin_column\' => \'any\',
    )
);
或者类似的东西?

编辑:

使用前面提到的数组,可以在不需要所有键入的情况下获取多个框。

foreach($my_post_types as $post_type){
    // use line below if you don\'t ever need to relate posts to posts, pages to pages, etc.
    $temp_array = array_diff($my_post_types, array($post_type));

    p2p_register_connection_type( array(
        \'name\' => \'my_\'.$post_type.\'_connections\',
        \'from\' => $temp_array, // use $my_post_types if you didn\'t define $temp_array
        \'to\' => $post_type,
        \'sortable\' => \'any\',
        \'reciprocal\' => false,
        \'cardinality\' => \'many-to-many\',
        \'admin_column\' => \'any\',
        )
    )
}
temp数组使每个post类型都与其他post类型相关,而不是与自身相关。不确定这是不是你想要的东西,很容易移除。

SO网友:128KB

GhostToast似乎重复回答了您的问题。

针对您的具体情况执行此操作应显示相关内容:https://github.com/scribu/wp-posts-to-posts/wiki/Related-posts:

$related=p2p\\u类型(“posts\\u to\\u pages”)->get\\u related(get\\u queryed\\u object());

唯一的区别是,我们将get\\u connected()替换为get\\u related()。

对于手动查找特定内容,这在过去对我很有用:http://wordpress.org/plugins/better-internal-link-search/

SO网友:s1lv3r

对我来说,实际的问题是:您使用关系信息的目的和方式是什么?它显示在哪里,或者您是否需要它来实现任何进一步的业务逻辑?

据我所知,核心功能无法实现这一点。

如果我过去想在没有插件的情况下实现类似的功能,那么我编写了一些定制PHP,可以自动添加一个分类法来保存post类型之间的关系信息。与使用相比,使用其他分类法的主要好处是post_meta 您可以更轻松地根据关系信息查询和访问您的内容。

如果插件的开销适合所需的功能,那么我使用Advanced Custom Fields (关系型或post对象字段类型),无需任何php即可完成所有这些操作,只需在后端进行一些单击(但使用post_meta 保存关系)。

SO网友:Chris Cox

最好的方法是注册一个非层次分类法,在要关联的不同帖子类型之间共享。

然后,您可以使用WP的内置分类查询来提取任何术语的所有关联内容。一般来说,您要查询的任何内容都应该是一个分类法,而不是一个字段,因为按字段查询在DB上要复杂得多。

SO网友:ksr89

如果要在自定义帖子类型之间创建关系,可以使用插件TYPES . 使用此插件,您可以创建自定义帖子类型,还可以设置它们之间的关系,如父关系或子关系。

另一种方法是将关系值保存在post\\u元表中,以便根据关系信息更轻松地查询和访问内容。

SO网友:Dr. Abhishek Ghosh

你需要这个还是更复杂?

enter image description here

这只是一个原型示例。therapy_guideline 可能有surgical_therapy_guideline, conservative_therapy_guideline, palliative_therapy_guideline, 等

不管你想要多复杂,你都可以做到。实际上,您需要在该网站上实现语义网。创建语义的最简单方法是使用RDFa数据。您可以使用Enhanced Publication Plugin.有许多免费资源creating semantic web. 您可以使用Apache Stanbol plus Open Refine(在Google项目中搜索)。您将使用什么取决于可能的查询的数量、数据库的可伸缩性以及您的知识。增强的发布插件将向WordPress的MySQL数据库(甚至不是MySQLi)增量添加小数据。如果您想使用WordPress plus插件并且服务器上的负载非常高,最好在nginx服务器上转换为PostgreSQL。

显然,您可以将RDFa、JSON或API与Apache Stanbol一起使用,并将其与PHP或WordPress自定义挂钩一起使用。如果您想创建插件,可以使用另一个相关Post插件的框架。

相关推荐