Каков оптимальный способ показать пользовательские данные из базы данных MSAccess на сайте Wordpress? - PullRequest
0 голосов
/ 20 мая 2019

Мне нужен совет от опытных разработчиков Wordpress.В моей организации есть внутренняя база данных MS Access, которая содержит множество таблиц, отчетов и форм ввода.Структура БД не слишком сложна (информация о лицах, событиях, информации о третьих лицах и различные отношения между ними)Мы хотели бы показать некоторую часть этой информации на нашем Wordpress-сайте, который в настоящее время имеет только раздел новостей.

Поскольку информация в нашей БД обновляется каждый день, мы также хотели бы сделать простую синхронизацию между БД MS Access и Wordpress (БД MySQL).Сейчас я пытаюсь найти лучший способ подключения MS Access и Wordpress.

В настоящее время я вижу только следующие способы, как это сделать:

  1. Выполнять запросы на экспорт и сохранять в файлы XML.
  2. Импорт в MySQL DB Wordpress.
  3. Показывать контент на сайте Wordpress с помощью функции пользовательских полей (или разрабатывать собственный плагин).

-OR-

Создайте собственную информационную систему на каком-нибудь очень легком PHP-движке (например, CodeIgniter) в том же домене, что и сайт Wordpress, который будет фактически отображать импортированный контент.

В этих вариантах требуется ежедневная передача информации между БД.И я не знаю возможностей Wordpress для отображения пользовательских данных из БД.Не могли бы вы предложить мне, какие способы вы предпочитаете использовать в моем случае?

PS MS Access используется версия 2007+ (файл .accdb).Название полей, БД и контента на русском языке.В будущем мы планируем добавить 2 новых языка (английский, украинский).БД доступа MS также содержит фотографии людей.

1 Ответ

1 голос
/ 21 мая 2019

Ваш вопрос слишком широкий. Он состоит из двух частей: 1. экспорт из Access и 2. импорт в Wordpress. Так как я не знаком с Wordpress, я могу дать вам совет только по 1 части. По крайней мере, Google показывает, что есть некоторые плагины, которые могут импортировать из CSV, как этот: https://ru.wordpress.org/plugins/wp-ultimate-csv-importer/

Вы можете создать запланированную задачу, которая запускает Access, который выполняет макрос, который выполняет функцию VBA, как описано здесь: Запуск Microsoft Access в виде запланированной задачи

В этой функции VBA вы можете использовать объект ADODB.Stream для создания CSV-файла UTF-8 с вашими данными и загрузки на FTP вашего сайта.

OR

Лично я использую скрипт Python, чтобы сделать что-то подобное. Я предпочитаю этот путь, потому что он более смирен и надежен. Вот мой код. Обратите внимание, что у меня есть два FTP-сервера: один из них только для тестирования.

# -*- coding: utf-8 -*-
# 2018-10-31
# 2018-11-28

import os
import csv
from time import sleep
from ftplib import FTP_TLS
from datetime import datetime as dt
import msaccess

FTP_REAL = {'FTP_SERVER':r'your.site.com',
            'FTP_USER':r'username',
            'FTP_PW':r'Pa$$word'
            }

FTP_WIP = {'FTP_SERVER':r'192.168.0.1',
            'FTP_USER':r'just_test',
            'FTP_PW':r'just_test'
            }

def ftp_upload(fullpath:str, ftp_folder:str, real:bool):
    ''' Upload file to FTP '''
    try:
        if real:
            ftp_set = FTP_REAL
        else:
            ftp_set = FTP_WIP
        with FTP_TLS(ftp_set['FTP_SERVER']) as ftp:
            ftp.login(user=ftp_set['FTP_USER'], passwd=ftp_set['FTP_PW'])
            ftp.prot_p()
            # Passive mode off otherwise there will be problem
            # with another upload attempt
            # my site doesn't allow active mode :(
            ftp.set_pasv(ftp_set['FTP_SERVER'].find('selcdn') > 0)
            ftp.cwd(ftp_folder)
            i = 0
            while i < 3:
                sleep(i * 5)
                i += 1
                try:
                    with open(fullpath, 'br') as f:
                        ftp.storbinary(cmd='STOR ' + os.path.basename(fullpath),
                                        fp=f)
                except OSError as e:
                    if e.errno != 0:
                        print(f'ftp.storbinary error:\n\t{repr(e)}')
                except Exception as e:
                    print(f'ftp.storbinary exception:\n\t{repr(e)}')
                filename = os.path.basename(fullpath)
                # Check if uploaded file size matches local file:
                # IDK why but single ftp.size command sometimes returns None,
                # run this first:
                ftp.size(filename)
                #input(f'overwrite it: {filename}')
                ftp_size = ftp.size(os.path.basename(fullpath))
                # import pdb; pdb.set_trace()
                if ftp_size != None:
                    if ftp_size == os.stat(fullpath).st_size:
                        print(f'File \'{filename}\' successfully uploaded')
                        break
                    else:
                        print('Transfer failed')
                        # input('Press enter for another try...')
    except OSError as e:
        if e.errno != 0:
            return False, repr(e)
    except Exception as e:
        return False, repr(e)
    return True, None

def make_file(content:str):
    ''' Make CSV file in temp directory and return True and fullpath '''
    fullpath = os.environ['tmp'] + f'\\{dt.now():%Y%m%d%H%M}.csv'
    try:
        with open(fullpath, 'wt', newline='', encoding='utf-8') as f:
            try:
                w = csv.writer(f, delimiter=';')
                w.writerows(content)
            except Exception as e:
                return False, f'csv.writer fail:\n{repr(e)}' 
    except Exception as e:
        return False, repr(e)
    return True, fullpath

def query_upload(sql:str, real:bool, ftp_folder:str, no_del:bool=False):
    ''' Run query and upload to FTP '''
    print(f'Real DB: {real}')
    status, data = msaccess.run_query(sql, real=real, headers=False)
    rec_num = len(data)
    if not status:
        print(f'run_query error:\n\t{data}')
        return False, data
    status, data = make_file(data)
    if not status:
        print(f'make_file error:\n\t{data}')
        return False, data
    fi = data
    status, data = ftp_upload(fi, ftp_folder, real)
    if not status:
        print(f'ftp_upload error:\n\t{data}')
        return False, data
    print(f'Done: {rec_num} records')
    if no_del: input('\n\nPress Enter to exit and delete file')
    os.remove(fi)
    return True, rec_num

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...