flush_rules(); } ?>

Rather than creating hundreds of pages/posts in Wordpress, simply map a URL pattern to an Airpress table using Airpress Virtual Posts. Each requests that matches the pattern will attempt to retrieve the cooresponding Airtable record and serve it using the specified Wordpress page as a 'template'. If an Airtable record is not found, a 404 is served. If a Wordpress page/post exists for the requested URL, then it will be used instead of the 'template' specified.

"New Configuration"); // $configs[] = $config; // $active_tab = count($configs)-1; // set_airpress_config("airpress_ep",$active_tab,$config); // } else { // $active_tab = $requested_tab; // } // $_GET['tab'] = $active_tab; // foreach($configs as $key => $config){ // airpress_admin_vp_tab($key,$config); // } // } // add_action( 'admin_init', 'airpress_admin_vp_tab_controller'); /***********************************************/ # TAB: DEFAULT /***********************************************/ function airpress_admin_vp_tab($key,$config) { $option_name = "airpress_ep".$key; //$options = get_option( $option_name ); $defaults = array( "name" => "New Configuration", "connection" => null, "pattern" => "^folder/([^/]+)/?$", "default" => "folder/my-unique-identifier/", "formula" => "{Your Airtable Field} = '$1'", "sort" => "", "table" => "Your Airtable Table", "view" => "", "field" => "Your Airtable Field", "field2" => "Your Airtable Field2", "template" => null, ); $options = array_merge($defaults,$config); ################################ ################################ $section_title = "Virtual Posts"; $section_name = "airpress_ep".$key; add_settings_section( $section_name, __( $section_title, 'airpress' ), "airpress_admin_vp_render_section", $option_name ); ################################ $field_name = "name"; $field_title = "Configuration Name"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_text', $option_name, $section_name, array($options,$option_name,$field_name) ); ################################ $field_name = "connection"; $field_title = "Select Connection"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_select_connections', $option_name, $section_name, array($options,$option_name,$field_name) ); ################################ ################################ $section_title = ""; $section_name = "airpress_ep".$key; $option_name = 'airpress_ep'.$key; add_settings_section( $section_name, __( $section_title, 'airpress' ), "airpress_admin_vp_render_section", $option_name ); ################################ $field_name = "pattern"; $field_title = "URL Pattern to Match"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_regex', $option_name, $section_name, array($options,$option_name,$field_name) ); ################################ $field_name = "default"; $field_title = "Test url"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_test', $option_name, $section_name, array($options,$option_name,$field_name) ); ################################ $field_name = "formula"; $field_title = "Filter by formula"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_text', $option_name, $section_name, array($options,$option_name,$field_name) ); ################################ $field_name = "sort"; $field_title = "Sort results"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_text', $option_name, $section_name, array($options,$option_name,$field_name) ); ################################ $field_name = "sort_direction"; $field_title = "Sort direction"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_select__direction', $option_name, $section_name, array($options,$option_name,$field_name) ); ################################ $field_name = "table"; $field_title = "Airtable Table Name"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_text', $option_name, $section_name, array($options,$option_name,$field_name) ); ############################### $field_name = "view"; $field_title = "Airtable Table View Name"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_text', $option_name, $section_name, array($options,$option_name,$field_name) ); ############################### $field_name = "field"; $field_title = "Airtable Field to be used as post_name"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_text', $option_name, $section_name, array($options,$option_name,$field_name) ); ############################### $field_name = "field2"; $field_title = "Airtable Field to be used as post_title"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_text', $option_name, $section_name, array($options,$option_name,$field_name) ); ################################ $field_name = "template"; $field_title = "Map to this page"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_select__page', $option_name, $section_name, array($options,$option_name,$field_name) ); ############################### $field_name = "delete"; $field_title = "Delete Configuration?"; add_settings_field( $field_name, __( $field_title, 'airpress' ), 'airpress_admin_vp_render_element_delete', $option_name, $section_name, array($options,$option_name,$field_name) ); register_setting($option_name,$option_name,"airpress_ep_validation"); } function airpress_ep_validation($config){ // global $wp_rewrite; // airpress_ep_add_rule($config); // $wp_rewrite->flush_rules(); if ( isset($config["sort"]) && $config["sort"] == "Your Airtable Field"){ $config["sort"] = ""; } return $config; } function airpress_ep_add_rule($config){ return add_rewrite_rule($config["pattern"], 'index.php?page_id='.$config["template"] , 'top'); } function airpress_ep_add_rules(){ global $wp_rewrite; $configs = get_airpress_configs("airpress_ep"); foreach($configs as $config){ if (isset($config["pattern"]) && !empty($config["pattern"])){ airpress_ep_add_rule($config); } if ( isset($config["default"]) && ! empty($config["default"]) ){ $permalink = get_permalink($config["template"]); $protocol = (empty($_SERVER["HTTPS"]))? "http" : "https"; $remove = $protocol."://".$_SERVER["HTTP_HOST"]."/"; $permalink = trim(str_replace($remove,"",$permalink),"/"); $pattern = "^".$permalink."/?"; add_rewrite_rule($pattern, "index.php?page_id=".$config["template"]."&default_vp=".rawurlencode($config["default"]) , 'top'); //die("Redirect: $pattern => ".$config["default"]); } } } function airpress_admin_vp_render_section__general() { echo '

' . __( 'Provides examples of the five basic element types.', 'sandbox' ) . '

'; } function airpress_admin_vp_render_section() { echo '

' . __( '', 'airpress' ) . '

'; } function airpress_admin_vp_render_element_text($args) { $options = $args[0]; $option_name = $args[1]; $field_name = $args[2]; echo ''; if ( $field_name == "name" and $options[$field_name] == "New Configuration" ){ echo "

You must change the configuration name from 'New Configuration' to something unique!

"; } } function airpress_admin_vp_render_element_regex($args) { $options = $args[0]; $option_name = $args[1]; $field_name = $args[2]; echo ''; echo "
"; echo "

To experiment with more about creating patterns, visit https://regex101.com/ — Please note that Airpress does NOT need front-slashes escaped.

"; } function airpress_admin_vp_render_element_test($args) { global $airpress; $options = $args[0]; $option_name = $args[1]; $field_name = $args[2]; echo ''; if ( isset($options["default"]) && isset($options["pattern"]) && isset($options["table"]) && isset($options["field"]) && isset($options["formula"]) ){ $request = new StdClass(); $request->request = trim($options["default"],"/")."/"; $request->matched_rule = $options["pattern"]; $query = new AirpressQuery(); $collection = $airpress->simulateVirtualPost($request,$query); if ( is_airpress_collection($collection) ){ echo "
This test URL matches ".count($collection)." records in table ".$options["table"].""; } else { echo "
No results from test url.
"; if ( $query->hasErrors() ){ echo "ERRORS:
"; foreach( $query->getErrors() as $error ){ echo "{$error['code']}: {$error['message']}
"; } } } } } function airpress_admin_vp_render_element_toggle($args) { $options = $args[0]; $option_name = $args[1]; $field_name = $args[2]; $checked = checked( 1, isset( $options[$field_name] ) ? $options[$field_name] : 0, false ); echo ''; echo ''; } function airpress_admin_vp_render_element_select__posttypes($args) { $options = $args[0]; $option_name = $args[1]; $field_name = $args[2]; $post_types = airpress_get_posttypes_available(); echo ''; } function airpress_admin_vp_render_element_select_connections($args) { $options = $args[0]; $option_name = $args[1]; $field_name = $args[2]; $connections = get_airpress_configs("airpress_cx"); echo ''; } function airpress_admin_vp_render_element_select__page($args) { $options = $args[0]; $option_name = $args[1]; $field_name = $args[2]; $pages = get_pages(); echo ''; } function airpress_admin_vp_render_element_select__direction($args) { $options = $args[0]; $option_name = $args[1]; $field_name = $args[2]; $directions = array(["value" => "asc","label" => "Ascending (A-Z)"],["value" => "desc","label" => "Descending (Z-A)"]); echo ''; } function airpress_admin_vp_render_element_delete($args) { $options = $args[0]; $option_name = $args[1]; $field_name = $args[2]; $tab = (int)$_GET["tab"]; echo "Yes, delete this configuration"; } ?>