├── templates ├── .gitkeep ├── index.twig ├── _partials │ ├── comments.twig │ ├── entry │ │ ├── text.twig │ │ ├── details.twig │ │ ├── button.twig │ │ ├── media.twig │ │ └── group.twig │ ├── content.twig │ ├── footer.twig │ ├── header.twig │ ├── navigation.twig │ ├── pagination.twig │ └── cover.twig ├── 404.twig ├── pages │ ├── default.twig │ ├── posts.twig │ ├── category.twig │ └── blog.twig ├── _post.twig ├── _utilities │ ├── teaser.twig │ └── image.twig └── _layouts │ └── default.twig ├── web ├── cpresources │ └── .gitignore ├── index.php └── .htaccess ├── storage ├── config-deltas │ └── .gitignore └── .gitignore ├── .gitignore ├── config ├── project │ ├── graphql │ │ ├── graphql.yaml │ │ └── schemas │ │ │ └── 08a529f2-1255-4bc6-9680-ec89d97b23fa.yaml │ ├── siteGroups │ │ └── 0ff5ed7e-a51c-4d65-82bc-8a9b37bea3c8.yaml │ ├── users │ │ ├── groups │ │ │ └── team--c55ca0a9-4bd6-409b-afd8-c1884dafecd0.yaml │ │ ├── users.yaml │ │ └── fieldLayouts │ │ │ └── 9f8f7322-a2f3-4028-b51f-8cb31b557400.yaml │ ├── sites │ │ └── default--37938585-7d7b-4d97-94f7-73dc07d795c2.yaml │ ├── sections │ │ └── home--936d7cd3-b422-4bc9-80dd-63bdfeb5ca47.yaml │ ├── comments │ │ └── comments │ │ │ └── fieldLayouts │ │ │ └── 56b220d0-934c-4971-8369-b9e49ce2b17f.yaml │ ├── entryTypes │ │ └── home--23a3f2f7-2b22-4a38-835a-342440a6a2ce.yaml │ └── project.yaml ├── htmlpurifier │ └── Default.json ├── routes.php ├── app.php └── general.php ├── craft ├── bootstrap.php ├── .env.example.dev ├── .env.example.staging ├── .env.example.production ├── composer.json ├── LICENSE ├── README.md └── .ddev └── config.yaml /templates/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/cpresources/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/config-deltas/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.env 2 | /.idea 3 | /vendor 4 | .DS_Store 5 | web/uploads 6 | .env.web 7 | -------------------------------------------------------------------------------- /storage/.gitignore: -------------------------------------------------------------------------------- 1 | backups 2 | composer-backups 3 | config-backups 4 | logs 5 | runtime 6 | -------------------------------------------------------------------------------- /templates/index.twig: -------------------------------------------------------------------------------- 1 | {% set pageTitle = 'Home' %} 2 | 3 | {% extends "pages/blog" %} 4 | -------------------------------------------------------------------------------- /config/project/graphql/graphql.yaml: -------------------------------------------------------------------------------- 1 | publicToken: 2 | enabled: false 3 | expiryDate: null 4 | -------------------------------------------------------------------------------- /config/project/siteGroups/0ff5ed7e-a51c-4d65-82bc-8a9b37bea3c8.yaml: -------------------------------------------------------------------------------- 1 | name: 'Wordpress Starter' 2 | -------------------------------------------------------------------------------- /config/project/graphql/schemas/08a529f2-1255-4bc6-9680-ec89d97b23fa.yaml: -------------------------------------------------------------------------------- 1 | isPublic: true 2 | name: 'Public Schema' 3 | -------------------------------------------------------------------------------- /config/project/users/groups/team--c55ca0a9-4bd6-409b-afd8-c1884dafecd0.yaml: -------------------------------------------------------------------------------- 1 | description: null 2 | handle: team 3 | name: Team 4 | -------------------------------------------------------------------------------- /templates/_partials/comments.twig: -------------------------------------------------------------------------------- 1 |
2 | {{ craft.comments.render(entry.id) }} 3 |
4 | -------------------------------------------------------------------------------- /templates/_partials/entry/text.twig: -------------------------------------------------------------------------------- 1 |
2 | {{ entry.textBlock|md }} 3 |
4 | -------------------------------------------------------------------------------- /templates/_partials/content.twig: -------------------------------------------------------------------------------- 1 |
2 | {{ entry.postContent }} 3 |
4 | -------------------------------------------------------------------------------- /templates/_partials/entry/details.twig: -------------------------------------------------------------------------------- 1 |
2 | {{ entry.summary }} 3 | {{ entry.postContent }} 4 |
5 | -------------------------------------------------------------------------------- /config/project/users/users.yaml: -------------------------------------------------------------------------------- 1 | allowPublicRegistration: false 2 | defaultGroup: null 3 | photoSubpath: null 4 | photoVolumeUid: null 5 | require2fa: false 6 | requireEmailVerification: true 7 | -------------------------------------------------------------------------------- /templates/_partials/footer.twig: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /templates/_partials/entry/button.twig: -------------------------------------------------------------------------------- 1 |
2 | {{ entry.title }} 3 |
4 | -------------------------------------------------------------------------------- /templates/_partials/entry/media.twig: -------------------------------------------------------------------------------- 1 | {% import '_utilities/image' as img %} 2 | 3 |
4 | {% set assets = entry.media.eagerly().all() %} 5 | {{ img.pictures(assets) }} 6 |
7 | -------------------------------------------------------------------------------- /templates/404.twig: -------------------------------------------------------------------------------- 1 | {% extends "_layouts/default" %} 2 | 3 | {% block content %} 4 |
5 |

404 not found

6 |
7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /config/htmlpurifier/Default.json: -------------------------------------------------------------------------------- 1 | { 2 | "Attr.AllowedFrameTargets": [ 3 | "_blank" 4 | ], 5 | "Attr.EnableID": true, 6 | "HTML.AllowedComments": [ 7 | "pagebreak" 8 | ], 9 | "HTML.SafeIframe": true, 10 | "URI.SafeIframeRegexp": "%^(https?:)?//(www.youtube.com/|player.vimeo.com/)%" 11 | } 12 | -------------------------------------------------------------------------------- /config/project/sites/default--37938585-7d7b-4d97-94f7-73dc07d795c2.yaml: -------------------------------------------------------------------------------- 1 | baseUrl: $PRIMARY_SITE_URL 2 | enabled: true 3 | handle: default 4 | hasUrls: true 5 | language: en-US 6 | name: 'Wordpress Starter' 7 | primary: true 8 | siteGroup: 0ff5ed7e-a51c-4d65-82bc-8a9b37bea3c8 # Wordpress Starter 9 | sortOrder: 1 10 | -------------------------------------------------------------------------------- /web/index.php: -------------------------------------------------------------------------------- 1 | run(); 13 | -------------------------------------------------------------------------------- /web/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | RewriteEngine On 3 | 4 | # Route 404s to index.php 5 | RewriteCond %{REQUEST_FILENAME} !-f 6 | RewriteCond %{REQUEST_FILENAME} !-d 7 | RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC] 8 | RewriteRule (.+) index.php [L] 9 | 10 | -------------------------------------------------------------------------------- /config/routes.php: -------------------------------------------------------------------------------- 1 | 6 | {% if entry is defined %} 7 | {% include '_partials/content' %} 8 | {% endif %} 9 | {% block landing %}{% endblock %} 10 | 11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /craft: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | run(); 14 | exit($exitCode); 15 | -------------------------------------------------------------------------------- /templates/_post.twig: -------------------------------------------------------------------------------- 1 | {% include [ 2 | 'pages/' ~ entry.template, 3 | 'pages/' ~ entry.section.handle ~ '/' ~ entry.slug, 4 | 'pages/' ~ entry.section.handle ~ '/' ~ entry.type.handle, 5 | 'pages/' ~ entry.section.handle ~ '/default', 6 | 'pages/' ~ entry.slug, 7 | 'pages/' ~ entry.type.handle, 8 | 'pages/' ~ entry.section.handle, 9 | 'pages/default' 10 | ] %} 11 | -------------------------------------------------------------------------------- /templates/_partials/entry/group.twig: -------------------------------------------------------------------------------- 1 | {% set styles = { 2 | 'background-color': entry.backgroundColor, 3 | 'color': entry.textColor, 4 | } | filter %} 5 | 6 | {% set css = styles | map((s, p) => "#{p}: #{s};") | join %} 7 | 8 | 13 | -------------------------------------------------------------------------------- /templates/_partials/header.twig: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /templates/_partials/navigation.twig: -------------------------------------------------------------------------------- 1 | {% set pages = craft.entries.section('pages').level(1).slug('not homepage').all() %} 2 | 9 | -------------------------------------------------------------------------------- /bootstrap.php: -------------------------------------------------------------------------------- 1 | safeLoad(); 18 | } 19 | -------------------------------------------------------------------------------- /config/project/sections/home--936d7cd3-b422-4bc9-80dd-63bdfeb5ca47.yaml: -------------------------------------------------------------------------------- 1 | defaultPlacement: end 2 | enableVersioning: true 3 | entryTypes: 4 | - 23a3f2f7-2b22-4a38-835a-342440a6a2ce # Home 5 | handle: home 6 | maxAuthors: 1 7 | name: Home 8 | previewTargets: 9 | - 10 | __assoc__: 11 | - 12 | - label 13 | - 'Primary entry page' 14 | - 15 | - urlFormat 16 | - '{url}' 17 | - 18 | - refresh 19 | - '1' 20 | propagationMethod: all 21 | siteSettings: 22 | 37938585-7d7b-4d97-94f7-73dc07d795c2: # Wordpress Starter 23 | enabledByDefault: true 24 | hasUrls: true 25 | template: index.twig 26 | uriFormat: __home__ 27 | type: single 28 | -------------------------------------------------------------------------------- /config/project/comments/comments/fieldLayouts/56b220d0-934c-4971-8369-b9e49ce2b17f.yaml: -------------------------------------------------------------------------------- 1 | tabs: 2 | - 3 | elementCondition: null 4 | elements: 5 | - 6 | dateAdded: '2024-11-12T07:37:06+00:00' 7 | elementCondition: null 8 | includeInCards: false 9 | instructions: null 10 | label: __blank__ 11 | providesThumbs: false 12 | required: true 13 | tip: null 14 | type: verbb\comments\fieldlayoutelements\CommentsField 15 | uid: a12964f8-7513-4766-9075-058fe250e15e 16 | userCondition: null 17 | warning: null 18 | name: 'Comment Form' 19 | uid: a1534220-1fed-4239-b8bd-4cd7fa06d077 20 | userCondition: null 21 | -------------------------------------------------------------------------------- /.env.example.dev: -------------------------------------------------------------------------------- 1 | # Read about configuration, here: 2 | # https://craftcms.com/docs/5.x/configure.html 3 | 4 | # The application ID used to to uniquely store session and cache data, mutex locks, and more 5 | CRAFT_APP_ID= 6 | 7 | # The environment Craft is currently running in (dev, staging, production, etc.) 8 | CRAFT_ENVIRONMENT=dev 9 | 10 | # Database connection settings 11 | CRAFT_DB_DRIVER=mysql 12 | CRAFT_DB_SERVER=127.0.0.1 13 | CRAFT_DB_PORT=3306 14 | CRAFT_DB_DATABASE= 15 | CRAFT_DB_USER=root 16 | CRAFT_DB_PASSWORD= 17 | CRAFT_DB_SCHEMA=public 18 | CRAFT_DB_TABLE_PREFIX= 19 | 20 | # General settings 21 | CRAFT_SECURITY_KEY= 22 | CRAFT_DEV_MODE=true 23 | CRAFT_ALLOW_ADMIN_CHANGES=true 24 | CRAFT_DISALLOW_ROBOTS=true 25 | -------------------------------------------------------------------------------- /.env.example.staging: -------------------------------------------------------------------------------- 1 | # Read about configuration, here: 2 | # https://craftcms.com/docs/5.x/configure.html 3 | 4 | # The application ID used to to uniquely store session and cache data, mutex locks, and more 5 | CRAFT_APP_ID= 6 | 7 | # The environment Craft is currently running in (dev, staging, production, etc.) 8 | CRAFT_ENVIRONMENT=staging 9 | 10 | # Database connection settings 11 | CRAFT_DB_DRIVER=mysql 12 | CRAFT_DB_SERVER=127.0.0.1 13 | CRAFT_DB_PORT=3306 14 | CRAFT_DB_DATABASE= 15 | CRAFT_DB_USER=root 16 | CRAFT_DB_PASSWORD= 17 | CRAFT_DB_SCHEMA=public 18 | CRAFT_DB_TABLE_PREFIX= 19 | 20 | # General settings 21 | CRAFT_SECURITY_KEY= 22 | CRAFT_DEV_MODE=false 23 | CRAFT_ALLOW_ADMIN_CHANGES=false 24 | CRAFT_DISALLOW_ROBOTS=true 25 | -------------------------------------------------------------------------------- /.env.example.production: -------------------------------------------------------------------------------- 1 | # Read about configuration, here: 2 | # https://craftcms.com/docs/5.x/configure.html 3 | 4 | # The application ID used to to uniquely store session and cache data, mutex locks, and more 5 | CRAFT_APP_ID= 6 | 7 | # The environment Craft is currently running in (dev, staging, production, etc.) 8 | CRAFT_ENVIRONMENT=production 9 | 10 | # Database connection settings 11 | CRAFT_DB_DRIVER=mysql 12 | CRAFT_DB_SERVER=127.0.0.1 13 | CRAFT_DB_PORT=3306 14 | CRAFT_DB_DATABASE= 15 | CRAFT_DB_USER=root 16 | CRAFT_DB_PASSWORD= 17 | CRAFT_DB_SCHEMA=public 18 | CRAFT_DB_TABLE_PREFIX= 19 | 20 | # General settings 21 | CRAFT_SECURITY_KEY= 22 | CRAFT_DEV_MODE=false 23 | CRAFT_ALLOW_ADMIN_CHANGES=false 24 | CRAFT_DISALLOW_ROBOTS=false 25 | -------------------------------------------------------------------------------- /templates/pages/posts.twig: -------------------------------------------------------------------------------- 1 | {% extends "_layouts/default" %} 2 | {% import '_utilities/teaser' as post %} 3 | 4 | {% block content %} 5 | {% include '_partials/cover' with { showMeta: true } %} 6 |
7 | {% include '_partials/content' %} 8 | {% include '_partials/comments' %} 9 |
10 |
11 |

Other articles

12 | {% set posts = craft.entries.section('posts').id('not ' ~ entry.id).limit(3).all() %} 13 | {% for post in posts %} 14 | {{ post.teaser(post) }} 15 | {% endfor %} 16 |
17 |
18 |
19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /templates/_utilities/teaser.twig: -------------------------------------------------------------------------------- 1 | {% macro teaser(data) %} 2 | {% import '_utilities/image' as img %} 3 |
4 | {% if data.featuredImage %} 5 |
6 | {% set assets = data.featuredImage.eagerly().all() %} 7 | 8 | {{ img.pictures(assets) }} 9 | 10 |
11 | {% endif %} 12 |

{{ data.title }}

13 | {% if data.excerpt %} 14 |

{{ data.excerpt }}

15 | {% endif %} 16 |

17 | 18 |

19 |
20 | {% endmacro %} 21 | -------------------------------------------------------------------------------- /templates/pages/category.twig: -------------------------------------------------------------------------------- 1 | {% extends "_layouts/default" %} 2 | {% import '_utilities/teaser' as post %} 3 | {% set postQuery = craft.entries.relatedTo(category).limit(10) %} 4 | {% paginate postQuery as pageInfo, posts %} 5 | 6 | {% block content %} 7 | {% include '_partials/cover' %} 8 |
9 | {% if category.description %} 10 |
11 | {{ category.description }} 12 |
13 | {% endif %} 14 |
15 | {% for post in posts %} 16 | {{ post.teaser(post) }} 17 | {% endfor %} 18 | {% include '_partials/pagination' with { pageInfo: pageInfo } %} 19 |
20 |
21 | {% endblock %} 22 | -------------------------------------------------------------------------------- /templates/pages/blog.twig: -------------------------------------------------------------------------------- 1 | {% extends "pages/default" %} 2 | {% import '_utilities/teaser' as post %} 3 | {% set postQuery = craft.entries 4 | .section('posts') 5 | .orderBy('sticky DESC, postDate DESC') 6 | .limit(10) %} 7 | {% paginate postQuery as pageInfo, posts %} 8 | 9 | {% block title %} 10 | {{ parent() }} 11 | {%- if pageInfo.currentPage > 1 -%} 12 | {%- if pageInfo.getPrevUrl() or pageInfo.getNextUrl() %}, Page {{ pageInfo.currentPage }} of {{ pageInfo.totalPages }} 13 | {% endif %} 14 | {%- endif -%} 15 | {% endblock %} 16 | 17 | {% block landing %} 18 |
19 | {% for post in posts %} 20 | {{ post.teaser(post) }} 21 | {% else %} 22 |

No posts, yet!

23 | {% endfor %} 24 | {% include '_partials/pagination' with { pageInfo: pageInfo } %} 25 |
26 | {% endblock %} 27 | -------------------------------------------------------------------------------- /config/app.php: -------------------------------------------------------------------------------- 1 | App::env('CRAFT_APP_ID') ?: 'CraftCMS', 27 | ]; 28 | -------------------------------------------------------------------------------- /templates/_partials/pagination.twig: -------------------------------------------------------------------------------- 1 | {% if pageInfo.getPrevUrl() or pageInfo.getNextUrl() %} 2 | 14 | {% endif %} 15 | -------------------------------------------------------------------------------- /config/general.php: -------------------------------------------------------------------------------- 1 | defaultWeekStartDay(1) 17 | // Prevent generated URLs from including "index.php" 18 | ->omitScriptNameInUrls() 19 | // Preload Single entries as Twig variables 20 | ->preloadSingles() 21 | // Prevent user enumeration attacks 22 | ->preventUserEnumeration() 23 | // Set the @webroot alias so the clear-caches command knows where to find CP resources 24 | ->aliases([ 25 | '@webroot' => dirname(__DIR__) . '/web', 26 | ]) 27 | ; 28 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "minimum-stability": "dev", 3 | "prefer-stable": true, 4 | "require": { 5 | "craftcms/ckeditor": "^4.9", 6 | "craftcms/cms": "^5.8", 7 | "verbb/comments": "^3.0.7", 8 | "vlucas/phpdotenv": "^5.4.0" 9 | }, 10 | "require-dev": { 11 | "craftcms/generator": "^2.0.0", 12 | "craftcms/wp-import": "dev-main", 13 | "yiisoft/yii2-shell": "^2.0.3" 14 | }, 15 | "config": { 16 | "allow-plugins": { 17 | "craftcms/plugin-installer": true, 18 | "yiisoft/yii2-composer": true 19 | }, 20 | "sort-packages": true, 21 | "optimize-autoloader": true, 22 | "platform": { 23 | "php": "8.2" 24 | } 25 | }, 26 | "scripts": { 27 | "post-root-package-install": [ 28 | "@php -r \"file_exists('.env') || copy('.env.example.dev', '.env');\"" 29 | ] 30 | }, 31 | "repositories": [ 32 | { 33 | "type": "composer", 34 | "url": "https://composer.craftcms.com", 35 | "canonical": false 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /templates/_utilities/image.twig: -------------------------------------------------------------------------------- 1 | {% macro pictures(photos, decorative = false) %} 2 | 3 | {% for photo in photos %} 4 | {% if photo.extension == 'svg' %} 5 | {% set alt = decorative ? null : (photo.alt ?? null) %} 6 | {% set role = decorative ? null : 'img' %} 7 | {{ svg(photo)|attr({ role: role, 'aria-label': alt }) }} 8 | {% else %} 9 | {% set outputWidths = [640, 1024, 1920] %} 10 | {% set srcset = [] %} 11 | {% for outputWidth in outputWidths %} 12 | {% if outputWidth <= photo.width %} 13 | {% set srcset = srcset | merge([photo.url({ width: outputWidth }) ~ ' ' ~ outputWidth ~ 'w']) %} 14 | {% endif %} 15 | {% endfor %} 16 | 17 | 20 | 27 | 28 | {% endif %} 29 | {% endfor %} 30 | {% endmacro %} 31 | -------------------------------------------------------------------------------- /templates/_partials/cover.twig: -------------------------------------------------------------------------------- 1 | {% set showMeta = showMeta ?? false %} 2 | {% set title = title ?? entry.title ?? category.title ?? null %} 3 | {% set category = entry.categories.eagerly().one() ?? null %} 4 | {% set tags = entry.tags.eagerly().all() ?? null %} 5 | 6 |
7 |

{{ title }}

8 | {% if showMeta %} 9 |
10 |
11 |

{% if category %}{{ category.title }} | {% endif %}

12 | {% if entry.author.fullName %}

By {{ entry.author.fullName }}

{% endif %} 13 |
14 | {% if tags %} 15 | 23 | {% endif %} 24 |
25 | {% endif %} 26 |
27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /config/project/entryTypes/home--23a3f2f7-2b22-4a38-835a-342440a6a2ce.yaml: -------------------------------------------------------------------------------- 1 | color: null 2 | fieldLayouts: 3 | a0633445-1f10-4bbd-8332-8e2015b292bd: 4 | tabs: 5 | - 6 | elementCondition: null 7 | elements: 8 | - 9 | autocapitalize: true 10 | autocomplete: false 11 | autocorrect: true 12 | class: null 13 | dateAdded: '2024-11-12T08:08:50+00:00' 14 | disabled: false 15 | elementCondition: null 16 | id: null 17 | includeInCards: false 18 | inputType: null 19 | instructions: null 20 | label: null 21 | max: null 22 | min: null 23 | name: null 24 | orientation: null 25 | placeholder: null 26 | providesThumbs: false 27 | readonly: false 28 | required: true 29 | size: null 30 | step: null 31 | tip: null 32 | title: null 33 | type: craft\fieldlayoutelements\entries\EntryTitleField 34 | uid: 6c5d26dd-4c27-4ad3-b179-9a4bcbc3c198 35 | userCondition: null 36 | warning: null 37 | width: 100 38 | name: Content 39 | uid: d419f32f-2565-4324-bc15-dbbdb26377f6 40 | userCondition: null 41 | handle: home 42 | hasTitleField: true 43 | icon: house 44 | name: Home 45 | showSlugField: true 46 | showStatusField: true 47 | slugTranslationKeyFormat: null 48 | slugTranslationMethod: site 49 | titleFormat: '' 50 | titleTranslationKeyFormat: null 51 | titleTranslationMethod: site 52 | -------------------------------------------------------------------------------- /templates/_layouts/default.twig: -------------------------------------------------------------------------------- 1 | {% set global = craft.entries.section('global').one() %} 2 | {% set pageTitle = pageTitle ?? entry.title ?? siteName %} 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | {% block title %}{{ pageTitle }}{% endblock %}{% if pageTitle != siteName %} | {{ siteName }}{% endif %} 17 | 18 | 19 | {# Include Tailwind Play CDN for basic styling #} 20 | 21 | 22 | 78 | 79 | 80 | Skip to main content 81 | 82 | {% include "_partials/header" %} 83 | 84 |
85 | {% block content %}{% endblock %} 86 |
87 | 88 | {% include "_partials/footer" %} 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /config/project/users/fieldLayouts/9f8f7322-a2f3-4028-b51f-8cb31b557400.yaml: -------------------------------------------------------------------------------- 1 | tabs: 2 | - 3 | elementCondition: null 4 | elements: 5 | - 6 | autocapitalize: true 7 | autocomplete: false 8 | autocorrect: true 9 | class: null 10 | dateAdded: '2024-11-07T01:09:01+00:00' 11 | disabled: false 12 | elementCondition: null 13 | id: null 14 | includeInCards: false 15 | inputType: null 16 | instructions: null 17 | label: null 18 | max: null 19 | min: null 20 | name: null 21 | orientation: null 22 | placeholder: null 23 | providesThumbs: false 24 | readonly: false 25 | requirable: false 26 | size: null 27 | step: null 28 | tip: null 29 | title: null 30 | type: craft\fieldlayoutelements\users\UsernameField 31 | uid: 2089871e-73e1-4a43-a20e-b641d4b5d25b 32 | userCondition: null 33 | warning: null 34 | width: 100 35 | - 36 | attribute: fullName 37 | autocapitalize: true 38 | autocomplete: false 39 | autocorrect: true 40 | class: null 41 | dateAdded: '2024-11-07T01:09:01+00:00' 42 | disabled: false 43 | elementCondition: null 44 | id: null 45 | includeInCards: false 46 | inputType: null 47 | instructions: null 48 | label: null 49 | max: null 50 | min: null 51 | name: null 52 | orientation: null 53 | placeholder: null 54 | providesThumbs: false 55 | readonly: false 56 | requirable: true 57 | required: false 58 | size: null 59 | step: null 60 | tip: null 61 | title: null 62 | type: craft\fieldlayoutelements\users\FullNameField 63 | uid: 3395598a-37e4-456b-b9d0-d970914b05d1 64 | userCondition: null 65 | warning: null 66 | width: 100 67 | - 68 | dateAdded: '2024-11-07T01:09:01+00:00' 69 | elementCondition: null 70 | id: null 71 | includeInCards: false 72 | instructions: null 73 | label: null 74 | orientation: null 75 | providesThumbs: false 76 | requirable: false 77 | tip: null 78 | type: craft\fieldlayoutelements\users\PhotoField 79 | uid: 184ef975-f667-4fd1-a9c9-c322a83d1534 80 | userCondition: null 81 | warning: null 82 | width: 100 83 | - 84 | autocapitalize: true 85 | autocomplete: false 86 | autocorrect: true 87 | class: null 88 | dateAdded: '2024-11-07T01:09:01+00:00' 89 | disabled: false 90 | elementCondition: null 91 | id: null 92 | includeInCards: false 93 | inputType: null 94 | instructions: null 95 | label: null 96 | max: null 97 | min: null 98 | name: null 99 | orientation: null 100 | placeholder: null 101 | providesThumbs: false 102 | readonly: false 103 | requirable: false 104 | size: null 105 | step: null 106 | tip: null 107 | title: null 108 | type: craft\fieldlayoutelements\users\EmailField 109 | uid: ed7157b2-3e81-43f7-a8ed-7630c10ae5a8 110 | userCondition: null 111 | width: 100 112 | name: Content 113 | uid: a3aba2ec-58b5-4072-8579-1d7b4cf9308b 114 | userCondition: null 115 | -------------------------------------------------------------------------------- /config/project/project.yaml: -------------------------------------------------------------------------------- 1 | dateModified: 1751442934 2 | email: 3 | fromEmail: travis@pixelandtonic.com 4 | fromName: travis@pixelandtonic.com 5 | replyToEmail: null 6 | template: null 7 | transportSettings: 8 | command: '/usr/local/bin/mailpit sendmail -t --smtp-addr 127.0.0.1:1025' 9 | transportType: craft\mail\transportadapters\Sendmail 10 | fs: 11 | uploads: 12 | hasUrls: true 13 | name: Uploads 14 | settings: 15 | path: '@webroot/uploads' 16 | type: craft\fs\Local 17 | url: /uploads 18 | meta: 19 | __names__: 20 | 0ff5ed7e-a51c-4d65-82bc-8a9b37bea3c8: 'Wordpress Starter' # Wordpress Starter 21 | 08a529f2-1255-4bc6-9680-ec89d97b23fa: 'Public Schema' # Public Schema 22 | 23a3f2f7-2b22-4a38-835a-342440a6a2ce: Home # Home 23 | 936d7cd3-b422-4bc9-80dd-63bdfeb5ca47: Home # Home 24 | 37938585-7d7b-4d97-94f7-73dc07d795c2: 'Wordpress Starter' # Wordpress Starter 25 | c55ca0a9-4bd6-409b-afd8-c1884dafecd0: Team # Team 26 | plugins: 27 | ckeditor: 28 | edition: standard 29 | enabled: true 30 | schemaVersion: 3.0.0.0 31 | comments: 32 | edition: standard 33 | enabled: true 34 | licenseKey: GTB6N9BJ9LJ9MWDKLCZUPN45 35 | schemaVersion: 1.2.1 36 | settings: 37 | allowFlagging: true 38 | allowGuest: false 39 | allowGuestFlagging: false 40 | allowGuestVoting: false 41 | allowVoting: true 42 | autoCloseDays: null 43 | closed: false 44 | defaultQueryStatus: 45 | - approved 46 | downvoteCommentLimit: 5 47 | enableGravatar: false 48 | enableSpamChecks: true 49 | flaggedCommentLimit: 5 50 | guestNotice: null 51 | guestRequireEmailName: true 52 | guestShowEmailName: true 53 | hideVotingForThreshold: false 54 | indexSidebarGroup: true 55 | indexSidebarIndividualElements: false 56 | indexSidebarLimit: 25 57 | maxReplyDepth: null 58 | maxUserComments: null 59 | moderatorExcluded: true 60 | moderatorUserGroup: null 61 | notificationAdminEnabled: false 62 | notificationAuthorEnabled: true 63 | notificationFlaggedEnabled: false 64 | notificationModeratorApprovedEnabled: false 65 | notificationModeratorEditEnabled: false 66 | notificationModeratorEnabled: false 67 | notificationReplyEnabled: true 68 | notificationSubscribeAuto: false 69 | notificationSubscribeCommentEnabled: false 70 | notificationSubscribeDefault: true 71 | notificationSubscribeEnabled: false 72 | orderBy: desc 73 | outputDefaultCss: true 74 | outputDefaultJs: true 75 | permissions: 76 | __assoc__: 77 | - 78 | - craft\elements\Asset 79 | - '*' 80 | - 81 | - craft\elements\Category 82 | - '*' 83 | - 84 | - craft\elements\Entry 85 | - '*' 86 | - 87 | - craft\elements\User 88 | - '*' 89 | placeholderAvatar: null 90 | pluginName: Comments 91 | recaptchaEnabled: false 92 | recaptchaKey: null 93 | recaptchaMinScore: 0.5 94 | recaptchaSecret: null 95 | requireModeration: true 96 | securityBanned: null 97 | securityFlooding: null 98 | securityMatchExact: false 99 | securityMaxLength: null 100 | securityModeration: null 101 | securitySpamlist: null 102 | showAvatar: true 103 | showCustomFieldInstructions: false 104 | showCustomFieldNames: false 105 | showTimeAgo: true 106 | sortDefaultDirection: asc 107 | sortDefaultKey: structure 108 | structureUid: 8487d65a-a2c4-4395-bebd-987bc761fa11 109 | templateEmail: null 110 | templateFolderOverride: null 111 | useQueueForNotifications: false 112 | system: 113 | edition: team 114 | live: true 115 | name: 'Wordpress Starter' 116 | retryDuration: null 117 | schemaVersion: 5.8.0.3 118 | timeZone: America/Los_Angeles 119 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WordPress Starter Project for Craft CMS 2 | 3 | This repository contains a complete [Craft CMS](https://craftcms.com) application, configured to closely mirror a default [WordPress](https://wordpress.org) installation. It can be used as an introduction to Craft’s content tools, or as a way to quickly import content from an existing WordPress site. 4 | 5 | > [!TIP] 6 | > See our [Craft CMS for WordPress Developers](https://craftcms.com/knowledge-base/for-wordpress-devs) article for additional information about making the switch to Craft! 7 | 8 | ## Features 9 | 10 | - Sensible defaults that match WordPress content structure; 11 | - Ready-to-use templates for common WordPress content types; 12 | - Live Preview configured out of the box; 13 | - Pre-packaged with our official WordPress [import tool](#importing-content); 14 | 15 | ## Prerequisites 16 | 17 | - [DDEV](https://ddev.com/) or an equivalent local development environment that meets Craft’s [system requirements](https://craftcms.com/docs/5.x/requirements.html); 18 | - A publicly-reachable WordPress site to migrate from, with [administrator-level](https://learn.wordpress.org/lesson/user-management-2/) access; 19 | 20 | ## Installation 21 | 22 | 1. Clone this repository and move into the folder: 23 | 24 | ```bash 25 | git clone https://github.com/craftcms/starter-wordpress.git 26 | cd starter-wordpress/ 27 | ``` 28 | 29 | 2. Start DDEV: 30 | 31 | ```bash 32 | ddev start 33 | ``` 34 | 35 | 3. Install dependencies: 36 | 37 | ```bash 38 | ddev composer install 39 | ``` 40 | 41 | 4. Run the Craft setup wizard: 42 | 43 | ```bash 44 | ddev craft install 45 | ``` 46 | 47 | Congratulations—Craft has been installed! You can explore the control panel by opening `https://starter-wordpress.ddev.site/admin` in your browser, or continue reading to import existing content. 48 | 49 | > [!NOTE] 50 | > If you want to use a different subdomain/prefix for this DDEV project, update the `name` key in `.ddev/config.yaml`. 51 | 52 | ## Preparing Your WordPress Site 53 | 54 | Before migration, you'll need to prepare your WordPress site. See the [wp-import repository](https://github.com/craftcms/wp-import) for complete documentation. 55 | 56 | 1. Install the import helper: 57 | - Save [`plugins/wp-import-helper.php`](https://github.com/craftcms/wp-import/blob/main/plugins/wp-import-helper.php) to your WordPress site's `wp-content/plugins/` folder 58 | - Log into WP Admin Dashboard 59 | - Navigate to **Plugins** and activate "wp-import helper" 60 | 61 | 2. Create an application password: 62 | - In WP Admin Dashboard, go to Users 63 | - Edit an administrator's account 64 | - Scroll to "Application Passwords" 65 | - Enter "Craft CMS" as the name 66 | - Click "Add New Application Password" 67 | - Save the username and generated password for later use (you'll need it on the import step) 68 | 69 | 3. Configure custom post types (if applicable): 70 | - Ensure `'show_in_rest' => true` is set in any calls to `register_post_type()` 71 | 72 | 4. Configure ACF fields (if applicable): 73 | - Enable "Show in REST API" for each field group 74 | 75 | ## Importing Content 76 | 77 | The import process is covered in detail in our Craft CMS for WordPress Developers article, but the critical steps are as follows: 78 | 79 | 1. Run the import script: 80 | 81 | ```bash 82 | ddev craft wp-import 83 | ``` 84 | 85 | 2. Enter your WordPress site details when prompted: 86 | 87 | - WordPress site URL 88 | - Admin username 89 | - Application password (created earlier) 90 | 91 | The importer will create: 92 | 93 | - A "Posts" section for your posts 94 | - A "Pages" section for your pages 95 | - An "Uploads" filesystem and volume for your media 96 | - A "Post Content" CKEditor field with nested entry types for non-HTML block data 97 | 98 | See the [wp-import repository](https://github.com/craftcms/wp-import) for complete documentation, command options, and compatible fields. 99 | 100 | ## Next Steps 101 | 102 | We encourage you to explore the control panel at your own pace—if you need some guidance, check out this [post-import tour](https://craftcms.com/knowledge-base/for-wordpress-devs#tour). 103 | 104 | ### Start Templating 105 | 106 | This project includes a bare-bones front-end built with Craft’s native template system, [Twig](https://craftcms.com/docs/5.x/development/twig.html). Templates are stored in the `templates/` directory—you are welcome to use them as-is, modify them to suit, or remove them entirely and experiment with the [GraphQL API](https://craftcms.com/docs/5.x/development/graphql.html)! 107 | 108 | > [!NOTE] 109 | > Some template names and locations are significant—they may be factored in to [routing](https://craftcms.com/docs/5.x/system/routing.html), or used by a [section](https://craftcms.com/docs/5.x/reference/element-types/entries.html#sections). 110 | 111 | ### Push Changes 112 | 113 | To push the code to your own repository, you must replace the default _remote_: 114 | 115 | ```bash 116 | git remote remove origin 117 | git remote add https://github.com/my-organization/my-repo.git 118 | ``` 119 | 120 | If the importer created any new resources (typically resulting in new or updated files in `config/project/`), commit those before pushing! 121 | 122 | ### Deploy 123 | 124 | Read our guide on [hosting and deployment](https://craftcms.com/docs/5.x/deploy.html), or get started with our first-party hosting platform [Craft Cloud](https://craftcms.com/cloud) by spinning up a 7-day free trial: 125 | 126 | 1. Run the Cloud setup command: 127 | 128 | ```bash 129 | ddev craft cloud/setup 130 | ``` 131 | 132 | 1. Commit and [push](#push-changes) those changes to a repository you control; 133 | 1. Sign up for [Craft Console](https://console.craftcms.com); 134 | 1. Create a new Cloud project; 135 | 136 | See our [Getting Started on Craft Cloud](https://craftcms.com/knowledge-base/cloud-getting-started) for details. 137 | 138 | ## Getting Help 139 | 140 | If you have any questions or suggestions, you can always reach us at or [post a GitHub issue](https://github.com/craftcms/starter-wordpress/issues). 141 | 142 | Thanks for trying Craft! 143 | 144 | :lemon: 145 | -------------------------------------------------------------------------------- /.ddev/config.yaml: -------------------------------------------------------------------------------- 1 | name: starter-wordpress 2 | type: craftcms 3 | docroot: web 4 | php_version: "8.2" 5 | webserver_type: nginx-fpm 6 | xdebug_enabled: false 7 | additional_hostnames: [] 8 | additional_fqdns: [] 9 | database: 10 | type: mysql 11 | version: "8.0" 12 | use_dns_when_possible: true 13 | composer_version: "2" 14 | web_environment: [] 15 | corepack_enable: false 16 | 17 | # Key features of DDEV's config.yaml: 18 | 19 | # name: # Name of the project, automatically provides 20 | # http://projectname.ddev.site and https://projectname.ddev.site 21 | 22 | # type: # backdrop, craftcms, django4, drupal, drupal6, drupal7, laravel, magento, magento2, php, python, shopware6, silverstripe, typo3, wordpress 23 | # See https://ddev.readthedocs.io/en/stable/users/quickstart/ for more 24 | # information on the different project types 25 | # "drupal" covers recent Drupal 8+ 26 | 27 | # docroot: # Relative path to the directory containing index.php. 28 | 29 | # php_version: "8.2" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3", "8.4" 30 | 31 | # You can explicitly specify the webimage but this 32 | # is not recommended, as the images are often closely tied to DDEV's' behavior, 33 | # so this can break upgrades. 34 | 35 | # webimage: # nginx/php docker image. 36 | 37 | # database: 38 | # type: # mysql, mariadb, postgres 39 | # version: # database version, like "10.11" or "8.0" 40 | # MariaDB versions can be 5.5-10.8, 10.11, and 11.4. 41 | # MySQL versions can be 5.5-8.0. 42 | # PostgreSQL versions can be 9-17. 43 | 44 | # router_http_port: # Port to be used for http (defaults to global configuration, usually 80) 45 | # router_https_port: # Port for https (defaults to global configuration, usually 443) 46 | 47 | # xdebug_enabled: false # Set to true to enable Xdebug and "ddev start" or "ddev restart" 48 | # Note that for most people the commands 49 | # "ddev xdebug" to enable Xdebug and "ddev xdebug off" to disable it work better, 50 | # as leaving Xdebug enabled all the time is a big performance hit. 51 | 52 | # xhprof_enabled: false # Set to true to enable Xhprof and "ddev start" or "ddev restart" 53 | # Note that for most people the commands 54 | # "ddev xhprof" to enable Xhprof and "ddev xhprof off" to disable it work better, 55 | # as leaving Xhprof enabled all the time is a big performance hit. 56 | 57 | # webserver_type: nginx-fpm, apache-fpm, or nginx-gunicorn 58 | 59 | # timezone: Europe/Berlin 60 | # If timezone is unset, DDEV will attempt to derive it from the host system timezone 61 | # using the $TZ environment variable or the /etc/localtime symlink. 62 | # This is the timezone used in the containers and by PHP; 63 | # it can be set to any valid timezone, 64 | # see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 65 | # For example Europe/Dublin or MST7MDT 66 | 67 | # composer_root: 68 | # Relative path to the Composer root directory from the project root. This is 69 | # the directory which contains the composer.json and where all Composer related 70 | # commands are executed. 71 | 72 | # composer_version: "2" 73 | # You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1 74 | # to use the latest major version available at the time your container is built. 75 | # It is also possible to use each other Composer version channel. This includes: 76 | # - 2.2 (latest Composer LTS version) 77 | # - stable 78 | # - preview 79 | # - snapshot 80 | # Alternatively, an explicit Composer version may be specified, for example "2.2.18". 81 | # To reinstall Composer after the image was built, run "ddev debug rebuild". 82 | 83 | # nodejs_version: "20" 84 | # change from the default system Node.js version to any other version. 85 | # See https://ddev.readthedocs.io/en/stable/users/configuration/config/#nodejs_version for more information 86 | # and https://www.npmjs.com/package/n#specifying-nodejs-versions for the full documentation, 87 | # Note that using of 'ddev nvm' is discouraged because "nodejs_version" is much easier to use, 88 | # can specify any version, and is more robust than using 'nvm'. 89 | 90 | # corepack_enable: false 91 | # Change to 'true' to 'corepack enable' and gain access to latest versions of yarn/pnpm 92 | 93 | # additional_hostnames: 94 | # - somename 95 | # - someothername 96 | # would provide http and https URLs for "somename.ddev.site" 97 | # and "someothername.ddev.site". 98 | 99 | # additional_fqdns: 100 | # - example.com 101 | # - sub1.example.com 102 | # would provide http and https URLs for "example.com" and "sub1.example.com" 103 | # Please take care with this because it can cause great confusion. 104 | 105 | # upload_dirs: "custom/upload/dir" 106 | # 107 | # upload_dirs: 108 | # - custom/upload/dir 109 | # - ../private 110 | # 111 | # would set the destination paths for ddev import-files to /custom/upload/dir 112 | # When Mutagen is enabled this path is bind-mounted so that all the files 113 | # in the upload_dirs don't have to be synced into Mutagen. 114 | 115 | # disable_upload_dirs_warning: false 116 | # If true, turns off the normal warning that says 117 | # "You have Mutagen enabled and your 'php' project type doesn't have upload_dirs set" 118 | 119 | # ddev_version_constraint: "" 120 | # Example: 121 | # ddev_version_constraint: ">= 1.22.4" 122 | # This will enforce that the running ddev version is within this constraint. 123 | # See https://github.com/Masterminds/semver#checking-version-constraints for 124 | # supported constraint formats 125 | 126 | # working_dir: 127 | # web: /var/www/html 128 | # db: /home 129 | # would set the default working directory for the web and db services. 130 | # These values specify the destination directory for ddev ssh and the 131 | # directory in which commands passed into ddev exec are run. 132 | 133 | # omit_containers: [db, ddev-ssh-agent] 134 | # Currently only these containers are supported. Some containers can also be 135 | # omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit 136 | # the "db" container, several standard features of DDEV that access the 137 | # database container will be unusable. In the global configuration it is also 138 | # possible to omit ddev-router, but not here. 139 | 140 | # performance_mode: "global" 141 | # DDEV offers performance optimization strategies to improve the filesystem 142 | # performance depending on your host system. Should be configured globally. 143 | # 144 | # If set, will override the global config. Possible values are: 145 | # - "global": uses the value from the global config. 146 | # - "none": disables performance optimization for this project. 147 | # - "mutagen": enables Mutagen for this project. 148 | # - "nfs": enables NFS for this project. 149 | # 150 | # See https://ddev.readthedocs.io/en/stable/users/install/performance/#nfs 151 | # See https://ddev.readthedocs.io/en/stable/users/install/performance/#mutagen 152 | 153 | # fail_on_hook_fail: False 154 | # Decide whether 'ddev start' should be interrupted by a failing hook 155 | 156 | # host_https_port: "59002" 157 | # The host port binding for https can be explicitly specified. It is 158 | # dynamic unless otherwise specified. 159 | # This is not used by most people, most people use the *router* instead 160 | # of the localhost port. 161 | 162 | # host_webserver_port: "59001" 163 | # The host port binding for the ddev-webserver can be explicitly specified. It is 164 | # dynamic unless otherwise specified. 165 | # This is not used by most people, most people use the *router* instead 166 | # of the localhost port. 167 | 168 | # host_db_port: "59002" 169 | # The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic 170 | # unless explicitly specified. 171 | 172 | # mailpit_http_port: "8025" 173 | # mailpit_https_port: "8026" 174 | # The Mailpit ports can be changed from the default 8025 and 8026 175 | 176 | # host_mailpit_port: "8025" 177 | # The mailpit port is not normally bound on the host at all, instead being routed 178 | # through ddev-router, but it can be bound directly to localhost if specified here. 179 | 180 | # webimage_extra_packages: [php7.4-tidy, php-bcmath] 181 | # Extra Debian packages that are needed in the webimage can be added here 182 | 183 | # dbimage_extra_packages: [telnet,netcat] 184 | # Extra Debian packages that are needed in the dbimage can be added here 185 | 186 | # use_dns_when_possible: true 187 | # If the host has internet access and the domain configured can 188 | # successfully be looked up, DNS will be used for hostname resolution 189 | # instead of editing /etc/hosts 190 | # Defaults to true 191 | 192 | # project_tld: ddev.site 193 | # The top-level domain used for project URLs 194 | # The default "ddev.site" allows DNS lookup via a wildcard 195 | # If you prefer you can change this to "ddev.local" to preserve 196 | # pre-v1.9 behavior. 197 | 198 | # ngrok_args: --basic-auth username:pass1234 199 | # Provide extra flags to the "ngrok http" command, see 200 | # https://ngrok.com/docs/ngrok-agent/config or run "ngrok http -h" 201 | 202 | # disable_settings_management: false 203 | # If true, DDEV will not create CMS-specific settings files like 204 | # Drupal's settings.php/settings.ddev.php or TYPO3's additional.php 205 | # In this case the user must provide all such settings. 206 | 207 | # You can inject environment variables into the web container with: 208 | # web_environment: 209 | # - SOMEENV=somevalue 210 | # - SOMEOTHERENV=someothervalue 211 | 212 | # no_project_mount: false 213 | # (Experimental) If true, DDEV will not mount the project into the web container; 214 | # the user is responsible for mounting it manually or via a script. 215 | # This is to enable experimentation with alternate file mounting strategies. 216 | # For advanced users only! 217 | 218 | # bind_all_interfaces: false 219 | # If true, host ports will be bound on all network interfaces, 220 | # not the localhost interface only. This means that ports 221 | # will be available on the local network if the host firewall 222 | # allows it. 223 | 224 | # default_container_timeout: 120 225 | # The default time that DDEV waits for all containers to become ready can be increased from 226 | # the default 120. This helps in importing huge databases, for example. 227 | 228 | #web_extra_exposed_ports: 229 | #- name: nodejs 230 | # container_port: 3000 231 | # http_port: 2999 232 | # https_port: 3000 233 | #- name: something 234 | # container_port: 4000 235 | # https_port: 4000 236 | # http_port: 3999 237 | # Allows a set of extra ports to be exposed via ddev-router 238 | # Fill in all three fields even if you don’t intend to use the https_port! 239 | # If you don’t add https_port, then it defaults to 0 and ddev-router will fail to start. 240 | # 241 | # The port behavior on the ddev-webserver must be arranged separately, for example 242 | # using web_extra_daemons. 243 | # For example, with a web app on port 3000 inside the container, this config would 244 | # expose that web app on https://.ddev.site:9999 and http://.ddev.site:9998 245 | # web_extra_exposed_ports: 246 | # - name: myapp 247 | # container_port: 3000 248 | # http_port: 9998 249 | # https_port: 9999 250 | 251 | #web_extra_daemons: 252 | #- name: "http-1" 253 | # command: "/var/www/html/node_modules/.bin/http-server -p 3000" 254 | # directory: /var/www/html 255 | #- name: "http-2" 256 | # command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000" 257 | # directory: /var/www/html 258 | 259 | # override_config: false 260 | # By default, config.*.yaml files are *merged* into the configuration 261 | # But this means that some things can't be overridden 262 | # For example, if you have 'use_dns_when_possible: true'' you can't override it with a merge 263 | # and you can't erase existing hooks or all environment variables. 264 | # However, with "override_config: true" in a particular config.*.yaml file, 265 | # 'use_dns_when_possible: false' can override the existing values, and 266 | # hooks: 267 | # post-start: [] 268 | # or 269 | # web_environment: [] 270 | # or 271 | # additional_hostnames: [] 272 | # can have their intended affect. 'override_config' affects only behavior of the 273 | # config.*.yaml file it exists in. 274 | 275 | # Many DDEV commands can be extended to run tasks before or after the 276 | # DDEV command is executed, for example "post-start", "post-import-db", 277 | # "pre-composer", "post-composer" 278 | # See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more 279 | # information on the commands that can be extended and the tasks you can define 280 | # for them. Example: 281 | #hooks: 282 | --------------------------------------------------------------------------------