用户配置文件和对象关联

时间:2014-01-28 作者:o_O

我来自Drupal,我非常习惯Drupal处理用户和对象的方式(在那里称为节点)我必须学习WordPress如何处理这些相同的情况。

由于我们会被意思不同的相同单词所混淆,我将在这里定义其中一些:

  • Node - 在Drupal中,一切都是一个节点。帖子是一个节点。页面是一个节点。产品是一个节点
  • Author - 在Drupal中,每个节点都有一个作者。想想WordPress帖子的作者
  • Product - 在Drupal中,产品是一个节点。在我的网站上,我卖书。因此,书籍是一种产品,它是一个节点
  • Book Author - 在正常意义上,一本书的作者就是作者。从现在起,我将把它称为book author,以避免与node author混淆。每一位图书作者都是该网站的用户

    在用户的配置文件页面(书籍作者的配置文件)上,我可以在其配置文件页面上列出他们所写的书籍(带有指向实际产品节点的链接)。我只是有一个部分,在那里我渲染每个产品,它们是节点作者。

    现在我需要学习WordPress处理这种情况的方式,无论是通过插件还是functions.php. 到目前为止,我一直在阅读用户配置文件,它们与Drupal不太一样。

    如何将用户关联为图书作者?我想这将是WordPress中的某种自定义角色;然而,我一直在阅读,WordPress中的角色似乎只与发布权限等相关。

    如何将用户(书籍作者)与产品关联?我正在使用WooCommerce插件。我知道我可以在产品上创建一个自定义字段,称之为Author,然后在其中输入一个名称,但这只会呈现为简单的文本。我需要将此字段关联为用户(书籍作者)配置文件的链接,并能够将此产品关联到用户配置文件。

    在WordPress中,用户配置文件是否是处理此问题的适当方式?或者我应该研究其他类型的模板吗?也许是一个自定义的帖子类型,它在模板中有一块代码,可以根据帖子的标题(这里用作作者名)或类似的内容呈现产品列表?如果这是一个很好的方法,那么我如何将链接关联回这个自定义贴子页面?i、 e.当在评论中单击用户名时,它现在应该转到关联的自定义帖子,而不是用户配置文件。

    如果所有这些都让人困惑,很抱歉。这在Drupal中是开箱即用的行为,因为这是我使用WordPress的第二周,所以我也有点困惑。

    NOTE: 管理员应该创建一个Drupal标记。通过快速搜索,我在这里找到了许多与Drupal相关的帖子,它可以更好地帮助熟悉这两个平台的用户找到他们可以熟练回答的问题。;-)

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

然而,我不知道Drupal,在我看来,Drupal中的“节点”是WordPress中的“post类型”。

默认情况下,WordPress有几种帖子类型:帖子、页面、附件、菜单项、修订(这些帖子类型通常被称为“内置”)。

您可以注册任意数量的自定义帖子类型,即CPT。

数据库中的Post类型彼此不同,只是因为posts表中的“Post\\U type”列不同。

然而,他们的“行为”可能非常不同,这取决于帖子类型registration arguments.

因此,您可以将帖子类型分为层次式和非层次式、需要特定用户能力才能编辑的帖子类型、帖子类型“public”和非public等等。

例如,菜单项和修订不是公共的:默认UI是隐藏的,WordPress为它们提供了不同的UI。

在WordPress中,每一篇文章,无论类型如何,都有作者。(就我所知,就像Drupal中的节点有作者一样)。

文章与作者的关系是一对多(一篇文章只能有一位作者,而一位作者可以有多篇文章)。在数据库中,此关系通过post_author 字段在post表中。

该字段引用了users表中的ID:因此帖子的唯一作者是用户:有用户名、密码、配置文件等。

在您的情况下,“Book”应该是post类型,并且if it\'s good for you that book author is a real user, you can use link books and authors using the post author field.

这将很容易做到,因为默认的后期创建/编辑UI有一个字段来设置用户,并且还有一些默认的模板标记可以使用(如the_authorrelated).

此外,您可以使用template hierarchy 轻松自定义作者存档(在WordPress中,“存档”是显示一组共享功能的帖子的网页:分类法存档是显示具有相同分类法的帖子的页面,就像作者存档是显示特定作者帖子的页面一样)。

如果你的作者不是真人,但只是连接书籍的一种方式,你可以考虑使用不同的方法,因为如果书籍作者是帖子作者(所以是用户),他们应该有一封电子邮件、一个帐户等等。。。

事实上,替代方法是为作者使用另一种帖子类型,或者使用分类法。

分类法是WordPress中的另一种“实体”。每个分类法都可以有无限的术语(就像avery post type可以有无限的帖子一样)。类别和标记是两种默认分类法,但您可以register unlimited custom taxonomies.

关于帖子与其他帖子的连接方式,在WordPress中,开箱即用,您必须:

岗位一对多关系same 帖子类型:这是一种父子关系,您只需将帖子类型注册为层次结构即可设置。例如WordPress页面

现在是WooCommerce的“问题”(或者更好的是,你可能会遇到WooCommerce的问题)。该插件注册一个post类型来处理产品,cpt名称为“product”。

如果你注册了一个定制的post类型的书籍,那么你就不能在WooCommerce中销售它们,因为只有“产品”(post类型为“product”)可以使用该插件进行开箱销售。

我不知道是否有任何插件允许出售其他自定义帖子类型。然而,解决这个问题的一个简单方法是在书籍和

注册一个名为“产品类型”的自定义分类法,并在其中创建术语“图书”,一个可能更好的选择是为图书创建自己的WooCommerce产品类型。See this WPSE answer 通过@helgatheviking. WooCommerce产品类型是插件用来处理具有不同功能(简单、可变、可下载等)的产品的方式关于将图书产品连接到图书作者,如果您使用post-author,则只需指定正确的作者,然后在需要显示指向作者存档使用的链接时the_author_link 模板标记。如果使用分类法,则使用get_term_link 要显示的模板标记,然后链接到相关存档。

还有一个我还没有提到的选择。如果书籍作者不是真正的用户(因此您不使用pos author字段),并且您希望创建一个作者档案(显示所有作者的页面)以及每个作者的“单一视图”(例如,包含作者传记、信息、照片等的页面)可能您必须为作者创建另一个帖子类型。这可能是一个问题:正如前面所说,WordPress中没有一个现成的系统可以直接将帖子与不同的帖子类型(在您的例子中是“产品”和“作者”)连接起来。

一个著名的插件,Posts2Posts 可以帮助解决此问题,或者您可以使用自定义元字段(可能是\'book_author_id\') 关于产品(或书籍)的帖子类型。在这种情况下,可以使用以下命令在循环(产品存档或产品单页)中显示指向相关作者页的链接get_permalink 结合get_post_meta, 类似于:

$author = get_post( get_post_meta( get_the_ID(), \'book_author_id\', TRUE) );
$title = apply_filters(\'the_title\', $author->post_title);
$link = get_permalink($author);
echo \'<a href="\' . $link . \'" title="\' . $title. \'">\' . $title. \'</a>\';
之后,在单作者模板中(根据模板层次结构\'single-author.php\' 您可以使用自定义WP_Query 使用\'meta_query\' 参数,类似于:

// single-author.php

the_post();

<h1>Author Name: <?php the_title() ?></h1>
<h2>Author Info</h2>
<div><?php the_content() ?></div>

<h2>Books by <?php the_title() ?></h2>
<?php
$args = array(
  \'post_type\' => \'products\',
  \'meta_query\' => array(
    \'meta_key\' => \'book_author_id\',
    \'meta_value\' => get_the_ID()
   )
);
$books = new WP_Query( $args );
if ( $books->have_posts() ) : while( $books->have_posts() ) : $books->the_post(); 
?>

<div class="book">
  <h3><?php the_title() ?></h3>
  <p><?php the_excerpt() ?></p>
  <a href="<?php the_permalink() ?>">Details</a>
</div>

<?php endwhile; wp_reset_postdata(); else: ?> 
<div>Sorry, <?php the_title() ?> has no books.</div>
<?php endwif; ?>
但是,如果书籍作者是真正的用户(应该在网站上有一个帐户),我强烈建议使用post-author将书籍与书籍作者连接,如果您需要一些作者存档信息,可以使用author description 用户配置文件页面中的字段,并使用custom page templateWP_User_Query 如果您想显示所有书籍作者的档案。

SO网友:Mark Kaplun

这是一个非常笼统的问题,答案也是——“不管你喜欢什么”。

AFAIK Wordpress的平台不如drupal那么严格,系统中没有一种受支持的关联对象的方法,Wordpress实际上一直在发展,并提供了新的方法。

如果我们只关注此时的最佳实践,那么您问题中最简单的部分就是产品的处理,它们将是一个自定义的发布时间,与drupal中的一个节点类似,它与一篇文章相关。

书籍作者更难。在我的世界里,用户是唯一可以登录系统的实体,我假设不会邀请书籍作者登录您的店铺,因此他们不是用户。它们应该是什么?这将取决于其他因素,是否可以搜索,是否可以对其进行分组,或者是否仅用于对产品进行分组。根据具体需要,您可能会选择也作为CPT进行,但您可能希望将它们作为分类法进行。

结束

相关推荐

private functions in plugins

我开发了两个插件,其中一个功能相同(相同的名称,相同的功能)。当试图激活两个插件时,Wordpress会抛出一个错误,因为它不允许我以相同的名称定义函数两次。有没有一种方法可以使这个函数只对插件私有,而不使用面向对象编程,也不简单地重命名函数?我不想使用OOP,因为我首先要学习它。此外,我不想重命名该函数,因为我可能也想在其他插件中使用它,而重命名感觉不太合适。