MeoModo Meeting Finder plugin (WordPress)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
After installation, a new menu item Meeting Finder becomes available in the left admin menu

There are surely lots of non-public plugins or other solutions for listing 12 Step meetings on WordPress websites. One of these is MeoModo DWS' Meeting Finder. This plugin was custom developed for Alcoholics Anonymous in The Netherlands. As far as I am concerned, it is not supported anymore.

Data model

Meeting posts

The basic data object seems to be posts of the type aamf_meeting. E.g.:

select
   *
from
   aanl_posts
where
   post_type="aamf_meeting";

Each record is a group, and not a meeting: A multi-meeting group has only one entry in this table.

post_title

The name of the meeting: Sometimes the various meeting that make up a multi-meeting group, have different names.

post_content

Just a meeting description.

meta fields

All additional data seems to be stored in table aanl_postmeta.

To get an overview of all fields:

select distinct
   meta_key #,
   # meta_value
from
   aanl_posts
join
   aanl_postmeta
   on
   aanl_posts.ID = aanl_postmeta.post_id
where
   post_type="aamf_meeting"
order by
   meta_key;

In total, there seem to be only seven meta fields, two of which are serialised, with the meta field address comprising of several fields of its own.

meta - group_name

  • group_name (actually group but that is a reserved keyword in SQL): The name of the group
  • For multi-meeting groups where meetings have different names from groups: The group name
  • For most groups, this will be the same value as for meeting.

meta - location

A short identifier of the location. E.g. Old Catholic Church Amsterdam, or Theater Polanenstraat Amsterdam

meta - address (serialised)

  • The actual address of the group, in serialised form
  • Some of the fields are machine-intelligable, like the geographic coordinates, but some fields seem quite 'random'
  • Those 'random fields' might just be a serialised table: Every table is on its own. Fields are defined locally only, and there is no consistency.

Example of a face-to-face meeting:

a:3:
{
   s:7:"address";   s:53:"Nassau Church, De Wittenstraat 114, 1052 BB Amsterdam";
   s:3:"lat";       s:10:"52.3825978";
   s:3:"lng";       s:17:"4.877457499999991";
}

Example of a Zoom-meeting - Formatted in pairs (so that a:8: makes sense):

a:8:
{
    s:7:"address";          s:11:"Netherlands";
    s:3:"lat";              d:52.132632999999998;
    s:3:"lng";              d:5.2912659999999994;
    s:4:"zoom";             i:14;
    s:8:"place_id";         s:27:"ChIJu-SH28MJxkcRnwq9_851obM";   # What is this???
    s:4:"name";             s:11:"Netherlands";
    s:7:"country";          s:11:"Netherlands";
    s:13:"country_short";   s:2:"NL";
}

Unclear what the string after s:27: is: Zoom 'coordinates' are stored in the post_content field.

All fields:

  • address: The actual address, e.g., street, number, zip code, city, all in one string without further classification
  • country
  • country_short
  • lat Latitude, stored as string with "." as decimal separator
  • lng Longitude, stored as string with "." as decimal separator
  • name
  • place_id
  • zoom - An integer value

meta - day_of_week (serialised)

day_of_week (actually dayofweek but I like consistency), is a serialised field that indicates the days on which the meeting happens:

  • Sunday = 0
  • Monday = 1
  • Etc.

meta - start_time

Just the local start time. e.g., 17:30.

meta - end_time

Just the local start time. e.g., 18:30.

meta - gsr

A freeform text field to write whatever you want about the GSR. Usually just first name, initial & telephone number.

Tags

Don't forget the tags!

Complete dataset - Except for tags

################################################################################
### Complete dataset - Except for tags
################################################################################
#
select
   ID,
   post_date,
   post_date_gmt,
   post_content,
   post_title,
   post_status,
   post_name,
   meta_group_name.meta_value as group_name,   
   meta_address.meta_value    as address,
   meta_location.meta_value   as location,
   meta_dayofweek.meta_value  as day_of_week,
   meta_start_time.meta_value as start_time,
   meta_end_time.meta_value   as end_time,
   meta_gsr.meta_value        as gsr
from
   aanl_posts
join
   aanl_postmeta as meta_group_name
   on
   aanl_posts.ID = meta_group_name.post_id
   and
   meta_group_name.meta_key = "group"
join
   aanl_postmeta as meta_location
   on
   aanl_posts.ID = meta_location.post_id
   and
   meta_location.meta_key = "location"
join
   aanl_postmeta as meta_address
   on
   aanl_posts.ID = meta_address.post_id
   and
   meta_address.meta_key = "address"
join
   aanl_postmeta as meta_dayofweek
   on
   aanl_posts.ID = meta_dayofweek.post_id
   and
   meta_dayofweek.meta_key = "dayofweek"
join
   aanl_postmeta as meta_start_time
   on
   aanl_posts.ID = meta_start_time.post_id
   and
   meta_start_time.meta_key = "start_time"
join
   aanl_postmeta as meta_end_time
   on
   aanl_posts.ID = meta_end_time.post_id
   and
   meta_end_time.meta_key = "end_time"
join
   aanl_postmeta as meta_gsr
   on
   aanl_posts.ID = meta_gsr.post_id
   and
   meta_gsr.meta_key = "gsr"

See also

Sources