将发布数据保存在另一个数据库中

时间:2018-03-23 作者:Steam Second

所以我的问题是:我有一个抓取脚本,当我将信息用于我的帖子时,它会抓取信息并保存到自己的数据库中,但我所做的是复制所有信息并将其放入wp\\u帖子和wp\\u postmeta中。因此,它会创建大量重复数据,基本上这样做不是很好。所以我的问题是,我能不能让我的wordpress从其他数据库中获取数据,并使用插件(例如自定义字段)将数据写入不同的数据库,而不是Posteta表中。

感谢您的回答

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

这是有可能的,但你必须做大量的定制工作才能得到你想要的。如果希望Posteta的所有内容都来自并转到单独的数据库,可以使用以下过滤器:

  • get_{$meta_type}_metadata - 此过滤器记录在wp-includes/meta.php. 从此筛选器返回非null值将使对的调用短路get_metadata (使用人get_post_meta).

  • update_{$meta_type}_metadata - 此筛选器也位于wp-includes/meta.php. 返回非null值将使update_metadata 函数,由调用update_post_meta.

  • add_{$meta_type}_metadata - 实际上与相同update_{$meta_type}_metadata, 除非有人要求add_post_meta.

  • delete_{$meta_type}_metadata - 除用于删除元数据外,与上述所有操作相同。

使用这四个过滤器,您可以创建到另一个数据集的自定义连接器,而不必使用wp_postmeta 桌子

<?php
class MyCustomData {
    public static $instance = null;

    private $connection = null;

    // Create a singleton instance of our class.
    public static function get_instance() {
        if ( null === self::$instance ) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    public function __construct() {
        $this->init_connection();
        $this->hooks();
    }

    private function init_connection() {
        // Do whatever you need to here to create your new database connection.

        // For example, you could open a PDO connection... http://php.net/manual/en/pdo.connections.php
        $this->connection = new PDO(\'connection string here\');
    }

    // Define your meta overrides.
    private function hooks() {
        add_filter( \'add_post_metadata\', [ $this, \'add_meta\' ], 10, 5 );
        update_filter( \'update_post_metadata\', [ $this, \'update_meta\' ], 10, 5 );
        delete_filter( \'delete_post_metadata\', [ $this, \'delete_meta\' ], 10, 5 );
        get_filter( \'get_post_metadata\', [ $this, \'get_meta\' ], 10, 5 );
    }

    /**
     * From the filter documentation in meta.php
     *
     * @param null|bool $check      Whether to allow adding metadata for the given type.
     * @param int       $object_id  Object ID.
     * @param string    $meta_key   Meta key.
     * @param mixed     $meta_value Meta value. Must be serializable if non-scalar.
     * @param bool      $unique     Whether the specified meta key should be unique
     */
    public function add_meta( $check, $object_id, $meta_key, $meta_value, $unique ) {

        // There may be cases where you _don\'t_ want your data going to the remote database.
        // If that happens, return null and WP will continue on it\'s merry way.
        if ( ! $this->allow_remote_db_action( $object_id ) ) {
            return null;
        }

        // Whatever logic you need to do here and then...
        $result = $this->connection->query(\'INSERT INTO ...\' );

        // Returning non-null will stop WP from doing it\'s own thing.
        if ( $result ) {
            return $result;
        }

        // Return null to let WP go on about it\'s business adding post meta.
        return null;
    }

    /**
     * The other three methods are effectively the same structure: 
     * - Prepare your data
     * - Make an action against the remote database.
     * - Return null if things didn\'t go well and you want WP to take over, or non-null
     * if you got the result you wanted and don\'t need WP to do what it was doing.
     */
}

// Kick off our class and set up the filters for post meta.
add_action( \'init\', \'MyCustomData::get_instance\' );
我强烈建议您正确地“屏蔽”您设置的功能,这意味着您应该只从远程数据库获取和发送您需要的内容,并允许WordPress处理剩余的Posteta。像这样的系统可能会产生一些不好的东西,所以要为头痛和调试会话做好准备。

结束

相关推荐

WordPress中GET_POSTS或WP_QUERY函数中的ORDERBY和ORDER过滤器无法工作

我在wordpress插件中有一个函数,它使用get\\u posts($数组)查询帖子。但我希望按降序将此设置为posts表的orderby post\\u modified字段,下面是我的代码: $arrProducts = get_the_terms($intPostId, \'products\'); if (is_array($arrProducts) && count($arrProducts)) { foreach ($

将发布数据保存在另一个数据库中 - 小码农CODE - 行之有效找到问题解决它

将发布数据保存在另一个数据库中

时间:2018-03-23 作者:Steam Second

所以我的问题是:我有一个抓取脚本,当我将信息用于我的帖子时,它会抓取信息并保存到自己的数据库中,但我所做的是复制所有信息并将其放入wp\\u帖子和wp\\u postmeta中。因此,它会创建大量重复数据,基本上这样做不是很好。所以我的问题是,我能不能让我的wordpress从其他数据库中获取数据,并使用插件(例如自定义字段)将数据写入不同的数据库,而不是Posteta表中。

感谢您的回答

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

这是有可能的,但你必须做大量的定制工作才能得到你想要的。如果希望Posteta的所有内容都来自并转到单独的数据库,可以使用以下过滤器:

  • get_{$meta_type}_metadata - 此过滤器记录在wp-includes/meta.php. 从此筛选器返回非null值将使对的调用短路get_metadata (使用人get_post_meta).

  • update_{$meta_type}_metadata - 此筛选器也位于wp-includes/meta.php. 返回非null值将使update_metadata 函数,由调用update_post_meta.

  • add_{$meta_type}_metadata - 实际上与相同update_{$meta_type}_metadata, 除非有人要求add_post_meta.

  • delete_{$meta_type}_metadata - 除用于删除元数据外,与上述所有操作相同。

使用这四个过滤器,您可以创建到另一个数据集的自定义连接器,而不必使用wp_postmeta 桌子

<?php
class MyCustomData {
    public static $instance = null;

    private $connection = null;

    // Create a singleton instance of our class.
    public static function get_instance() {
        if ( null === self::$instance ) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    public function __construct() {
        $this->init_connection();
        $this->hooks();
    }

    private function init_connection() {
        // Do whatever you need to here to create your new database connection.

        // For example, you could open a PDO connection... http://php.net/manual/en/pdo.connections.php
        $this->connection = new PDO(\'connection string here\');
    }

    // Define your meta overrides.
    private function hooks() {
        add_filter( \'add_post_metadata\', [ $this, \'add_meta\' ], 10, 5 );
        update_filter( \'update_post_metadata\', [ $this, \'update_meta\' ], 10, 5 );
        delete_filter( \'delete_post_metadata\', [ $this, \'delete_meta\' ], 10, 5 );
        get_filter( \'get_post_metadata\', [ $this, \'get_meta\' ], 10, 5 );
    }

    /**
     * From the filter documentation in meta.php
     *
     * @param null|bool $check      Whether to allow adding metadata for the given type.
     * @param int       $object_id  Object ID.
     * @param string    $meta_key   Meta key.
     * @param mixed     $meta_value Meta value. Must be serializable if non-scalar.
     * @param bool      $unique     Whether the specified meta key should be unique
     */
    public function add_meta( $check, $object_id, $meta_key, $meta_value, $unique ) {

        // There may be cases where you _don\'t_ want your data going to the remote database.
        // If that happens, return null and WP will continue on it\'s merry way.
        if ( ! $this->allow_remote_db_action( $object_id ) ) {
            return null;
        }

        // Whatever logic you need to do here and then...
        $result = $this->connection->query(\'INSERT INTO ...\' );

        // Returning non-null will stop WP from doing it\'s own thing.
        if ( $result ) {
            return $result;
        }

        // Return null to let WP go on about it\'s business adding post meta.
        return null;
    }

    /**
     * The other three methods are effectively the same structure: 
     * - Prepare your data
     * - Make an action against the remote database.
     * - Return null if things didn\'t go well and you want WP to take over, or non-null
     * if you got the result you wanted and don\'t need WP to do what it was doing.
     */
}

// Kick off our class and set up the filters for post meta.
add_action( \'init\', \'MyCustomData::get_instance\' );
我强烈建议您正确地“屏蔽”您设置的功能,这意味着您应该只从远程数据库获取和发送您需要的内容,并允许WordPress处理剩余的Posteta。像这样的系统可能会产生一些不好的东西,所以要为头痛和调试会话做好准备。

相关推荐

是否可以取消对特定帖子类型的POSTS_PER_PAGE限制?

我想知道我是否可以取消特定帖子类型的posts\\u per\\u页面限制。在存档中。php页面我显示不同的帖子类型,对于特定的“出版物”帖子类型,我想显示所有帖子。我如何在不影响传统“post”类型的情况下实现这一点?