WordPress访问插件的类/模型以加载自定义POST类型数据的方法是什么?

时间:2019-10-14 作者:Brian

Wordpress开发新手。

我正在使用一个插件,它使用自定义帖子类型创建在线课程。

我注意到这个插件有一个名为

/wp内容/插件/sfwd lms/包含/类/类ldlms主题模型。php

它包含:

<?php
if ( ( class_exists( \'LDLMS_Model_Post\' ) ) && ( ! class_exists( \'LDLMS_Model_Topic\' ) ) ) {
    class LDLMS_Model_Topic extends LDLMS_Model_Post {

        private static $post_type = \'sfwd-topic\';

        function __construct( $topic_id = 0 ) {
            $this->load( $topic_id );
        }

        // Endof functions.
    }
}
因此,在一个钩子操作中,我试图访问插件的模型。例如:

require_once LEARNDASH_LMS_PLUGIN_DIR . \'includes/classes/abstract-ldlms-model-post.php\';
require_once LEARNDASH_LMS_PLUGIN_DIR . \'includes/classes/class-ldlms-topic-model.php\';

add_action( \'learndash-topic-quiz-row-before\', \'show_topic_content\', 10, 3);
function show_topic_content($topicID, $course_id, $user_id) {
    // get model
    $thistopic = new LDLMS_Model_Topic($topicID);
    print_r($thistopic);die;
}
但我有一个错误:

Fatal error: Uncaught Error: Call to undefined method LDLMS_Model_Topic::load() in wp-content/plugins/sfwd-lms/includes/classes/class-ldlms-topic-model.php:8 
我刚从Laravel开发公司来,所以我想有一种类似wordpress的方式来访问模型,也许我错过了一些步骤?

或者也许,因为topic 在这个插件中post 我需要使用post 模型看来这会很奇怪topic 模型是它自己独特的post.

我很想知道访问模型及其权限的正确的、插件无关的方式是什么。

谢谢Brian

2 个回复
SO网友:Tom J Nowell

我刚从Laravel开发公司来,所以我想有一种类似wordpress的方式来访问模型,也许我错过了一些步骤?

你不需要,Laravel是一个提供结构的框架,所以模型就是模型,但在WP中没有这些。

WordPress中的插件只是PHP文件,顶部有一条注释,其中包含一些元数据。它们没有被包含、沙盒或以任何方式分开,这意味着:

您无法从类可能位于的文件夹/文件名中推断出任何内容这些对象和变量不存储在公共位置,除非插件将其放在一个位置,否则没有标准的方法获取插件数据结构,如果插件有任何数据结构,插件可能没有任何模型可获取,它可能使用不同的编程范式,它可能根本不存储任何数据。插件甚至可以加载Laravel的部分内容,并使用Laravel在内部构建自己。我自己在WP插件中使用过Symfony组件

因此,如果数据是使用WordPress API(如自定义帖子类型、帖子元、分类法等)存储的,那么您可以使用所有标准的WP函数来检索它们。你需要做一些调查来了解后元价值观LearnDash存储了什么,以及它们的含义和作用。

至于控制器和模型,WP不提供控制器和模型。WP提供的任何类都不是存储或扩展的地方。它不是一个面向对象的框架,或者根本不是一个框架,您必须提供这些信息。

那么,如何获得具有所需数据的对象呢?

查看learndash文档阅读代码,找出该类在何处实例化为对象,以及如何存储该类。查找单例、静态变量、全局变量、过滤器,接受可能没有获取它的方法,但更重要的是,请联系learndash支持部门。第三方插件是非主题的,所以你在这里得到的任何答案都是通用的,它不会告诉你LearnDash的细节。如果LearnDash支持帮不上忙,那么很不幸,您需要雇佣一位了解LearnDash的开发人员,调查其他方法,或者阅读LearnDash代码和文档来解决问题

SO网友:Brian

好吧,算了吧。关键是我使用的插件将其帖子注册为自定义帖子类型。因此,我帖子的第二句话一直都很关键:“我正在使用一个使用自定义帖子类型的插件”:-)

根据Wordpress插件开发指南

通过在WP\\u查询类构造函数的参数数组中传递post\\u type键,可以查询特定类型的帖子。

基于此,瞧,这是可行的:

function show_topic_content($topicID, $course_id, $user_id) {
    // get model
    $args = array(
        \'post_type\'   => \'sfwd-topic\',
        \'p\' => $topicID
    );
    $query = new WP_Query( $args );
    $post = $query->posts;
    // do stuff
}
可能是专业人士的基本材料,但对我来说却大开眼界!

谢谢Brian

相关推荐

Testing Plugins for Multisite

我最近发布了一个WordPress插件,它在单个站点上非常有效。我被告知该插件在多站点安装上不能正常工作,我理解其中的一些原因。我已经更新了代码,现在需要一种方法来测试更新后的代码,然后才能转到实时客户的多站点安装。我有一个用于测试的WordPress安装程序的单站点安装,但需要在多站点安装上进行测试。根据我所能找到的唯一方法是在网络上至少有两个站点来安装整个多站点安装,以测试我的插件。设置WordPress的整个多站点安装是插件开发人员的唯一/首选方式,还是有更快的测试环境可用。