Файловый менеджер - Редактировать - /home/infrafs/INFRABIKEIT/wp-content/plugins/ns-cloner-site-copier.tar
Назад
css/ns-cloner.css.map 0000644 00000012162 15132706043 0010525 0 ustar 00 {"version":3,"sourceRoot":"","sources":["ns-cloner.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAEF;AAAA;EAEE;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAEF;EAEE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;;AAEF;EACE;;;AAGJ;EACE;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;IAAI;;EAA2B;IAAM;;;AAGvC;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EACE;EACA;EACA;;;AAIA;EACE;;;AAIJ;AAAA;AAAA;AAIA;AACA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;IACE;IACA;IACA;IACA;;;AAIJ;EACE;IACE;IACA;;;AAIJ;EACE;IACE;;;EAEF;IACE;;;EAEF;IACE;;;AAKJ;EACE;IACE;;;EAEF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;;EAEF;IACE;IACA;;;EAEF;IACE;;;EAEF;IACE;IACA;;;AAGJ;EACE;IACE;;;AAGJ;EACE;IACE;;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AACF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;AAGI;EACE;EACA;;AAEF;EACE;;;AAKJ;EACE;;AAEF;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;;AAGJ;EACE;;AACA;EACE","file":"ns-cloner.css"} css/ns-cloner.css 0000644 00000060156 15132706043 0007757 0 ustar 00 @charset "UTF-8"; /** * Layout */ .ns-cloner-wrapper { width: 100%; display: -webkit-box; display: -ms-flexbox; display: flex; } .ns-cloner-form { margin-bottom: 40px; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; padding: 0 15px; } .ns-cloner-sidebar { width: 350px; padding: 0 30px 0 15px; } /** * Header */ .ns-cloner-header { padding: 30px 40px; background: #1f1f1f url(../images/bg-texture.png); margin: 0 0 30px -20px; } .ns-cloner-header a { text-decoration: none; } .ns-cloner-header h1, .ns-cloner-header span { display: inline-block; position: relative; left: 25px; bottom: 35px; color: #ab8718; font-size: 24px; font-weight: 400; } .ns-cloner-header span { color: white; font-size: 28px; margin-right: 25px; bottom: 36px; } .ns-cloner-header-pro { float: right; padding-top: 2px; text-align: center; line-height: 1.4em; border-left: solid 1px #303030; padding-left: 36px; } .ns-cloner-header-pro strong { display: block; color: #ccc; font-weight: 300; font-size: 17px; } .ns-cloner-header-pro a { display: inline-block; margin: 10px auto; font-size: 13px; padding: 10px 32px 12px !important; height: 18px !important; border-radius: 2px !important; } .ns-cloner-header-pro a:hover { color: #ddd; box-shadow: none !important; } /** * Section boxes + sidebar widgets */ .ns-cloner-collapse-all, .ns-cloner-expand-all { font-size: 11px !important; padding: 3px 8px !important; margin-top: -4px; cursor: pointer; border: solid #393939 1px; margin-left: 4px; background: #303030; border-radius: 2px; color: #ddd; float: right; } .ns-cloner-collapse-all small, .ns-cloner-expand-all small { padding: 0 3px; } .ns-cloner-collapse-all:hover, .ns-cloner-expand-all:hover { -webkit-box-shadow: inset 1px 1px 5px rgba(0, 0, 0, 0.3); box-shadow: inset 1px 1px 5px rgba(0, 0, 0, 0.3); } .ns-cloner-section, .ns-cloner-sidebar .ns-side-widget { -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.1); box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.1); border-radius: 2px; margin: 0 0 20px; background: #f8f8f8; } .ns-cloner-section-header { cursor: pointer; } .ns-cloner-section-header { margin: 0; padding: 20px 25px; height: 1.2em; font-size: 16px; color: white; border: solid 1px #333; border-radius: 2px 2px 0 0; background-color: #1f1f1f; font-weight: 400; } #ns-cloner-section-modes .ns-cloner-section-header { cursor: default; } .ns-cloner-section-header h4 { float: left; margin: 0; font-weight: normal; } .ns-cloner-section-collapse { cursor: pointer; } .ns-cloner-section-collapse::before { content: " "; display: block; float: right; border-style: solid; border-width: 6px 4px; border-color: transparent transparent white; margin: 0; cursor: pointer; -webkit-transition: all 0.25s; -o-transition: all 0.25s; transition: all 0.25s; } .ns-cloner-section.closed .ns-cloner-section-collapse::before { margin-top: 0.4em; -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } /** * Section contents / children */ .ns-cloner-section-content { padding: 20px 25px 25px; background: #f8f8f8; height: auto; -webkit-transition: all 0.25s; -o-transition: all 0.25s; transition: all 0.25s; border: solid 1px #fff; border-radius: 0 0 4px 4px; margin-top: -1px; position: relative; } .ns-cloner-section.closed .ns-cloner-section-content { height: 0; padding: 0 25px; border: 0; overflow: hidden; } .ns-cloner-section-content *:focus { -webkit-box-shadow: none !important; box-shadow: none !important; border-color: #ddd !important; } .ns-cloner-section-content > *:first-child, .ns-cloner-section-content > *:first-child > *:first-child { margin-top: 0 !important; } .ns-cloner-section-content > *:last-child, .ns-cloner-section-content > *:last-child > *:last-child { margin-bottom: 0 !important; } .ns-cloner-section-content h5 { font-size: 1.1em; margin: 0 0 0.7em; } .ns-cloner-section-content label + h5, .ns-cloner-section-content input + h5, .ns-cloner-section-content .description + h5, .ns-cloner-section-content .ns-cloner-input-group + h5 { margin-top: 0.7em; } .ns-cloner-section-content h5 label { margin-top: 0; } .ns-cloner-section-content p { padding: 0.4em 0; margin: 0; border: 0; } .ns-cloner-section-content .description, .ns-cloner-mode-description p { font-style: italic; } .ns-cloner-section-content .description + .description { padding-top: 0 !important; } .ns-cloner-section-content label { display: block; padding: 0.25em; margin-top: 0.5em; font-weight: 500; clear: both; } .ns-cloner-section-content input[type=text], .ns-cloner-section-content select, .ns-cloner-section-content textarea { padding: 0.5em 1em; margin: 0; height: auto; width: 100%; border-radius: 0; border-color: #bbb; } .ns-cloner-section-content strong { color: #be9719; } .ns-cloner-section-content table { width: 100%; border: solid 1px #eee; margin-bottom: 0.5em; } .ns-cloner-section-content th { padding: 10px; border-bottom: solid 1px #eee; text-align: left; } .ns-cloner-section-content th.date-col { width: 15em; } .ns-cloner-section-content th.action-col { width: 8em; text-align: center; } .ns-cloner-section-content td { padding: 5px 10px; border-bottom: solid 1px #eee; } .ns-cloner-section-content tr:last-child td { border-bottom: 0; } .ns-cloner-section-content td .button { display: block; margin: 0 auto; text-align: center; position: relative; } .ns-cloner-section-content td .button.working:after { content: url(../images/loading.gif); display: block; position: absolute; top: 3px; right: -25px; } /** * Input groups */ .ns-cloner-section-content .ns-cloner-input-group { display: flex; max-width: 100%; } .ns-cloner-section-content .ns-cloner-input-group label { background-color: #eaeaea; padding: 0.5em 1em; border: solid 1px #ccc; position: relative; display: inline-block; bottom: 0; left: 1px; height: 35px; box-sizing: border-box; color: #777; margin: 0; } .ns-cloner-section-content .ns-cloner-input-group input { flex: 1; height: 35px; } .ns-cloner-section-content .ns-cloner-input-group input + label { left: -2px; } .ns-cloner-section-content .ns-cloner-input-group > *:first-child { border-radius: 2px 0 0 2px; } .ns-cloner-section-content .ns-cloner-input-group > *:last-child { border-radius: 0 2px 2px 0; } .ns-cloner-section-content .ns-cloner-input-group + .ns-cloner-input-group { margin-top: -1px; } /** * Checkbox groups */ .ns-cloner-multi-checkbox-wrapper { border: solid 1px #ddd; border-radius: 2px; background: #fff; padding: 1em 1.4em; overflow: auto; min-height: 6em; max-height: 12em; margin: 1em 0; } .ns-cloner-multi-checkbox-wrapper.loading { opacity: 0.75; background: url(../images/spinner.gif) no-repeat center center; } .ns-cloner-multi-checkbox-wrapper label { margin-top: 0.35em; font-weight: normal; } .ns-cloner-multi-checkbox-wrapper .description { font-size: 0.9em; color: #999; } /** * Chosen (select elements) */ .ns-cloner-section .chosen-container { margin-bottom: 0.5em !important; } .ns-cloner-section .chosen-single { padding: 5px 12px !important; height: 36px !important; border-color: #ccc !important; border-radius: 2px !important; background: white !important; } .ns-cloner-section .chosen-single b { background-position: 0 7px !important; } .ns-cloner-section .chosen-choices { border-color: #ccc !important; } .ns-cloner-section .chosen-choices .search-field { padding: 5px 5px 2px !important; } .ns-cloner-section .chosen-choices .search-choice { padding: 8px 22px 8px 10px !important; } .ns-cloner-section .chosen-choices .search-choice-close { top: 10px !important; right: 5px !important; } .ns-cloner-section .chosen-container .chosen-results li { padding: 6px 8px !important; } .ns-cloner-section .chosen-container .chosen-results li.highlighted { background: #ab8718 !important; } /** * Repeaters */ .ns-repeater li { display: flex !important; } C .ns-repeater li.invisible { visibility: hidden; height: 0; overflow: hidden; margin: 0; } .ns-repeater input[type=text] { display: block; flex: 1; margin-right: -2px; height: 35px; } .ns-repeater .chosen-container { width: 100%; flex-basis: 30%; position: relative; margin: 0 10px 0 15px; bottom: 1px; } .ns-repeater-add { margin: -0.35em 0 0.7em 0 !important; } .ns-repeater-remove { background-color: #eaeaea; padding: 8px 8px; border: solid 1px #ccc; position: relative; display: inline-block; bottom: 0; left: 1px; height: 35px; box-sizing: border-box; color: #777; margin: 0; cursor: pointer; } .ns-repeater-remove:after { content: ""; font-size: 18px; font-family: "dashicons"; } /** * Inline validation */ span.ns-cloner-validating-spinner, .ns-cloner-loader-icon { margin-top: -30px; display: inline-block; float: right; } span.ns-cloner-validating-spinner:before, .ns-cloner-loader-icon:before { content: url(../images/loading.gif); padding: 0 0.5em; display: inline-block; position: relative; top: 3px; font-size: 18px; font-family: dashicons; } span.ns-cloner-validating-spinner.valid:before, .ns-cloner-loader-icon.valid:before { content: ""; color: #558855; } span.ns-cloner-validating-spinner:first-child, .ns-cloner-loader-icon:first-child { float: none; } .ns-cloner-loader-icon { float: none; } .ns-cloner-section-content .ns-cloner-input-group .ns-cloner-validating-spinner { padding-top: 5px; margin-top: 0; } /** * Sidebar */ .ns-cloner-sidebar .ns-side-widget { border: solid 1px #ddd; text-align: center; } .ns-cloner-sidebar .ns-side-widget h5 { margin: 0; padding: 12px 25px; height: 1.2em; font-size: 14px; color: white; border: solid 1px #444; border-radius: 2px 2px 0 0; background-color: #4d4d4d; font-weight: 400; } .ns-cloner-sidebar .ns-side-widget h5 a { color: #ab8718; text-decoration: none; } .ns-cloner-sidebar .ns-side-widget-content { padding: 15px; background: #f8f8f8; } .ns-side-widget-content p { padding: 0; margin: 0 0 10px; } .ns-side-widget-content p:last-child { margin-bottom: 0; } .ns-featured-widget .ns-side-widget-content { padding: 0; } .ns-random-widget .ns-side-widget-content { padding: 30px; } .ns-links-widget .ns-side-widget-content { text-align: left; } .ns-subscribe-widget form > * { text-align: center; } .ns-subscribe-widget div#ns-subscribe-form > form button { background: #ab8718 !important; font-size: 13px; border-radius: 2px !important; text-transform: uppercase; } /** * Clone button + bar */ .ns-cloner-button-wrapper { padding: 15px 20px; position: fixed; left: 160px; bottom: 0; right: 0; background: #1f1f1f; z-index: 8999; display: -webkit-box; display: -ms-flexbox; display: flex; } body.folded .ns-cloner-button-wrapper { left: 36px; } .ns-cloner-button-steps { margin: 10px 10px 0; font-size: 18px; position: relative; height: 48px; overflow: hidden; z-index: 1; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; display: -webkit-box; display: -ms-flexbox; display: flex; } .ns-cloner-button-steps:before { content: ""; border-bottom: dotted 2px #555; height: 21px; position: absolute; width: calc( 100% - 10px ); left: 0; -webkit-box-sizing: border-box; box-sizing: border-box; top: 0; } .ns-cloner-button-steps:after { content: " "; display: inline-block; border-style: solid; border-color: transparent transparent transparent #555; border-width: 6px 8px; position: absolute; top: 50%; right: 0; margin-top: -10px; } .ns-cloner-button-steps > span { background: #1f1f1f; -webkit-box-shadow: 0 0 20px #202020; box-shadow: 0 0 20px #202020; color: #555; text-transform: uppercase; margin-right: 25px; padding: 10px 15px; display: inline-block; white-space: nowrap; text-align: center; -webkit-transition: all ease-in-out 0.75s; -o-transition: all ease-in-out 0.75s; transition: all ease-in-out 0.75s; cursor: pointer; position: relative; } .ns-cloner-button-steps > span.seen { color: white; } .ns-cloner-button-steps > span:before, .ns-cloner-button-steps > span:before { content: ""; font-family: dashicons; position: absolute; left: 50%; bottom: -1px; margin-left: -5px; opacity: 0; -webkit-transition: opacity ease-in-out 0.75s; -o-transition: opacity ease-in-out 0.75s; transition: opacity ease-in-out 0.75s; } .ns-cloner-button-steps > span.invalid { color: #c85340; } .ns-cloner-button-steps > span.invalid:before { content: ""; color: #c85340; opacity: 1; } .ns-cloner-button-steps > span:after { content: " "; display: inline-block; border-style: solid; border-color: transparent transparent transparent #555; border-width: 6px 8px; position: absolute; top: 50%; right: -33px; margin-top: -10px; } .ns-cloner-button-steps > span:last-child:after { display: none; } .ns-cloner-button { float: right; background: #ab8718; padding: 16px 48px; margin-right: 10px; color: white; text-transform: uppercase; font-size: 18px; cursor: pointer; border: 0; outline: 0 !important; border-radius: 2px; -webkit-transition: all ease-out 0.25s; -o-transition: all ease-out 0.25s; transition: all ease-out 0.25s; position: relative; z-index: 1; } .ns-cloner-button:hover { -webkit-transform: scale(1.05); -ms-transform: scale(1.05); transform: scale(1.05); background: #be9719; } .ns-cloner-button.working { background-image: url(../images/gold-loading.gif); background-repeat: no-repeat; background-position: right 20px center; opacity: 0.5; cursor: default; } .ns-cloner-button.working:hover { -webkit-transform: none; -ms-transform: none; transform: none; background-color: #ab8718; } .ns-cloner-scroll-progress { background: #ab8718; position: absolute; left: 0; bottom: 0; height: 5px; -webkit-transition: width ease-in-out 0.75s; -o-transition: width ease-in-out 0.75s; transition: width ease-in-out 0.75s; } .ns-cloner-disclaimer { padding: 0.7em 0.35em 1.4em 0.35em; } .ns-cloner-disclaimer strong { color: orangered; } /** * Progress modal */ .ns-cloner-processes-modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 9999; background-color: rgba(0, 0, 0, 0.7); } .ns-cloner-processes-modal-wrapper { max-width: 1024px; width: 90%; position: absolute; top: 10%; bottom: 10%; left: 50%; padding: 40px 60px; -webkit-box-sizing: border-box; box-sizing: border-box; z-index: 9999; background-color: #f3f3f3; -webkit-transform: translateX(-50%); -ms-transform: translateX(-50%); transform: translateX(-50%); overflow-y: scroll; } .ns-cloner-processes-done { display: none; } .ns-modal-head { margin-bottom: 30px; } .ns-process-wrapper { display: block; padding: 5px 30px 30px 30px; margin-bottom: 15px; background: #fff; } .ns-modal-body { margin-bottom: 10px; } .ns-modal-refresh, .ns-modal-cancel, .ns-modal-close { margin-top: -10px; margin-left: 15px; cursor: pointer; float: right; color: #fff; outline: none; background-color: #555; padding: 10px 20px 12px; text-transform: uppercase; border-radius: 2px; text-decoration: none; text-align: center; border: 0; -webkit-box-shadow: none; box-shadow: none; height: auto; line-height: 1; } .ns-modal-cancel { background-color: #ddd; color: #555; } .ns-cloner-progress-bar { border: 1px solid #ab8718; height: 30px; background-color: #fff; border-radius: 2px; position: relative; } .ns-cloner-progress-bar-inner { background-color: #ab8718; width: 0; max-width: 100%; height: 32px; margin-top: -1px; -webkit-transition: all 2s ease-in-out; -o-transition: all 2s ease-in-out; transition: all 2s ease-in-out; background-size: 30px 30px; background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); animation: animate-stripes 3s linear infinite; } .ns-percents { font-size: 14px; line-height: 30px; font-weight: 500; text-align: center; color: #fff; position: absolute; top: -10px; width: 50px; height: 50px; z-index: 9999; background: #ab8718; left: 50%; margin-left: -20px; border-radius: 50%; padding-top: 9px; box-sizing: border-box; } .ns-cloner-progress-info { padding-top: 8px; } .ns-cloner-progress-items { display: flex; margin-top: 20px; } .ns-cloner-progress-items > div { flex: 1; text-align: center; font-size: 18px; padding: 40px; background: #f8f8f8; color: #aaa; border-right: solid 1px #ddd; } .ns-cloner-progress-items > div:last-child { border-right: 0; } .ns-cloner-progress-items em { font-style: normal; font-size: 22px; color: #333; } .ns-cloner-progress-items small { display: block; text-transform: uppercase; padding: 8px; color: #ab8718; font-size: 16px; } .ns-cloner-loading-center { position: absolute; top: 50%; left: 50%; margin: -10px 0 0 -10px; } @keyframes animate-stripes { 0% { background-position: 0 0; } 100% { background-position: 60px 0; } } /** * Report after cloning */ .ns-cloner-report { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.45); z-index: 300000; } .ns-cloner-report-content { width: 50%; background: white; max-height: 75%; overflow: auto; position: relative; left: 20%; top: 32px; padding: 3% 5% 5%; border-radius: 0 0 0.7em 0.7em; } .ns-cloner-report-content h5 { font-weight: bold; font-size: 1.4em; margin-top: 0; } .ns-cloner-report-item { clear: both; padding: 0.7em; overflow: hidden; } .ns-cloner-report-item:nth-child(odd) { background: #eee; } .ns-cloner-report-item-label { float: left; width: 20%; min-width: 10em; font-weight: bold; } /** * Copy logs box before going to support */ .ns-cloner-extra-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.45); z-index: 300000; display: none; } .ns-cloner-extra-modal-content { background: white; width: 30%; padding: 1.5em 2.5%; top: 10vh; left: 35%; position: absolute; border-radius: 2px; max-height: 70vh; box-sizing: border-box; overflow: auto; } .ns-cloner-extra-modal-content p { margin-bottom: 1.2em !important; } .ns-cloner-extra-modal-content textarea { width: 100%; white-space: nowrap; height: 8em; font-size: 12px; padding: 1em; font-family: monospace; } /** * Utility classes */ .ns-cloner-small { font-size: 0.75em; } .ns-cloner-text-center { text-align: center; } .ns-cloner-gold-link { color: #ab8718; border-bottom: dotted 1px; font-size: smaller; display: inline-block; margin: 0 5px; text-decoration: none; cursor: pointer; } .ns-cloner-no-padding { padding: 0; } .ns-cloner-clear { clear: both; } .ns-cloner-info-message, .ns-cloner-warning-message, .ns-cloner-error-message, .ns-cloner-success-message { display: block; line-height: 19px; padding: 11px 15px; font-size: 13px; text-align: left; margin: 0 0 15px; background-color: #fff; border-left: 4px solid #ffba00; -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); } .ns-cloner-info-message p, .ns-cloner-warning-message p, .ns-cloner-error-message p, .ns-cloner-success-message p { margin: 0; } .ns-cloner-info-message { border-left-color: #00a0d2; } .ns-cloner-error-message { border-left-color: #c85340; } .ns-cloner-success-message { border-left-color: #46b450; } .ns-cloner-error-message + .ns-cloner-section, .ns-cloner-warning-message + .ns-cloner-section { margin-top: 0.7em; } .disabled-description { display: none; } input[disabled] + .disabled-description { display: inline; color: #888; font-size: smaller; font-style: italic; } .ns-cloner-form-button, .ns-cloner-sidebar .button { background: #ab8718 !important; border: 0 !important; text-shadow: none !important; box-shadow: none !important; color: white !important; padding: 0.5em 1.5em !important; height: 3em !important; -webkit-transition: all 0.4s; -o-transition: all 0.4s; transition: all 0.4s; text-transform: uppercase; cursor: pointer; position: relative; } .ns-cloner-form-button:hover, .ns-cloner-sidebar .button:hover { box-shadow: 0 2px 6px #ccc !important; transform: translateY(-2px); } .ns-cloner-form-button.large { height: 40px !important; padding-left: 2em !important; padding-right: 2em !important; } .ns-cloner-checkbox-label input[type=checkbox] { margin-right: 10px; } /** * WordPress compatibility */ /* Hide update notices on cloner page */ body.toplevel_page_ns-cloner .update-nag, body[class*=ns-cloner] .update-nag { display: none; } /** * Single site adaptations */ .ns-cloner-wrapper.disabled .ns-cloner-section, .ns-cloner-wrapper.disabled .ns-cloner-disclaimer { opacity: 0.4; } .ns-cloner-wrapper.disabled .ns-cloner-button-wrapper { display: none; } /** * Media Queries */ @media (min-width: 1700px) { .ns-cloner-wrapper { background: url(../images/big-bg.jpg); background-attachment: fixed; background-repeat: no-repeat; background-position: right 60px top 0px; } } @media (min-width: 1600px) { .ns-cloner-form { flex: 0 1; flex-basis: 1000px; } } @media (max-width: 1200px) { .ns-cloner-sidebar { width: 275px; } .ns-cloner-button-steps { display: none; } .ns-cloner-button { width: 100%; } } @media (max-width: 960px) { .ns-cloner-wrapper { flex-wrap: wrap; } .ns-cloner-sidebar { width: 100%; margin-top: -30px; margin-left: 0; padding-left: 0; padding-bottom: 30px; display: flex; flex-wrap: wrap; } .ns-cloner-sidebar .ns-side-widget { flex: 1 1 45%; margin: 0 1% 20px !important; } body.auto-fold .ns-cloner-button-wrapper { left: 36px; } .ns-cloner-report-content { width: 90%; left: 5%; } } @media (max-width: 780px) { .ns-cloner-sidebar .ns-side-widget { flex-basis: 100%; } } @media (max-width: 780px) { .ns-cloner-button-wrapper { left: 0 !important; } } /** * Project: https://github.com/svichas/jquery.digitScroller.js * Author: Stefanos Vichas * License: MIT */ .__digit_scroller_digit { position: relative; display: inline-block; -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); width: 0.58em; text-align: center; } .__digit_scroller_digit._digit_up { -webkit-transform: translateY(-100%); -ms-transform: translateY(-100%); transform: translateY(-100%); } .__digit_scroller_next_digit { position: absolute; top: 100%; left: 0; } .__digit_scroller_wrap { display: inline-block; overflow: hidden; } /*=== Analytics === */ .ns-cloner-extra-modal#analytics-settings .ns-cloner-extra-modal-content { width: 50%; left: 25%; } .ns-cloner-extra-modal#analytics-settings .ns-cloner-form-button { margin-bottom: 5px; } #analytics-settings .analytics-settings-label { margin-top: 0.5em !important; } #analytics-settings .tooltip { position: relative; display: inline-block; border-bottom: 1px dotted black; } #analytics-settings .tooltip .tooltip-text { visibility: hidden; width: 200px; background-color: #555; color: #fff; text-align: center; border-radius: 6px; padding: 5px; position: absolute; z-index: 1; bottom: 125%; left: 50%; margin-left: -100px; opacity: 0; transition: opacity 0.3s; white-space: initial; text-transform: none; line-height: initial; } #analytics-settings .tooltip .tooltip-text::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: #555 transparent transparent transparent; } #analytics-settings .tooltip:hover .tooltip-text { visibility: visible; opacity: 1; } #analytics-settings .tooltip.ns-cloner-form-button { border-bottom: none; } #analytics-settings .tooltip.ns-cloner-form-button .tooltip-toggle { border-bottom: 1px dotted black; } /*# sourceMappingURL=ns-cloner.css.map */ css/ns-cloner.scss 0000644 00000062255 15132706043 0010144 0 ustar 00 /** * Layout */ .ns-cloner-wrapper { width: 100%; display: -webkit-box; display: -ms-flexbox; display: flex; } .ns-cloner-form { margin-bottom: 40px; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; padding: 0 15px; } .ns-cloner-sidebar { width: 350px; padding: 0 30px 0 15px; } /** * Header */ .ns-cloner-header { padding: 30px 40px; background: #1f1f1f url(../images/bg-texture.png); margin: 0 0 30px -20px; } .ns-cloner-header a { text-decoration: none; } .ns-cloner-header h1, .ns-cloner-header span { display: inline-block; position: relative; left: 25px; bottom: 35px; color: #ab8718; font-size: 24px; font-weight: 400; } .ns-cloner-header span { color: white; font-size: 28px; margin-right: 25px; bottom: 36px; } .ns-cloner-header-pro { float: right; padding-top: 2px; text-align: center; line-height: 1.4em; border-left: solid 1px #303030; padding-left: 36px; } .ns-cloner-header-pro strong { display: block; color: #ccc; font-weight: 300; font-size: 17px; } .ns-cloner-header-pro a { display: inline-block; margin: 10px auto; font-size: 13px; padding: 10px 32px 12px !important; height: 18px !important; border-radius: 2px !important; } .ns-cloner-header-pro a:hover { color: #ddd; box-shadow: none !important; } /** * Section boxes + sidebar widgets */ .ns-cloner-collapse-all, .ns-cloner-expand-all { font-size: 11px !important; padding: 3px 8px !important; margin-top: -4px; cursor: pointer; border: solid #393939 1px; margin-left: 4px; background: #303030; border-radius: 2px; color: #ddd; float: right; } .ns-cloner-collapse-all small, .ns-cloner-expand-all small { padding: 0 3px; } .ns-cloner-collapse-all:hover, .ns-cloner-expand-all:hover { -webkit-box-shadow: inset 1px 1px 5px rgba(0, 0, 0, .3); box-shadow: inset 1px 1px 5px rgba(0, 0, 0, .3); } .ns-cloner-section, .ns-cloner-sidebar .ns-side-widget { -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, .1); box-shadow: 1px 1px 3px rgba(0, 0, 0, .1); border-radius: 2px; margin: 0 0 20px; background: #f8f8f8; } .ns-cloner-section-header { cursor: pointer; } .ns-cloner-section-header { margin: 0; padding: 20px 25px; height: 1.2em; font-size: 16px; color: white; border: solid 1px #333; border-radius: 2px 2px 0 0; background-color: #1f1f1f; font-weight: 400; } #ns-cloner-section-modes .ns-cloner-section-header { cursor: default; } .ns-cloner-section-header h4 { float: left; margin: 0; font-weight: normal; } .ns-cloner-section-collapse { cursor: pointer; } .ns-cloner-section-collapse::before { content: ' '; display: block; float: right; border-style: solid; border-width: 6px 4px; border-color: transparent transparent white; margin: 0; cursor: pointer; -webkit-transition: all 0.25s; -o-transition: all 0.25s; transition: all 0.25s; } .ns-cloner-section.closed .ns-cloner-section-collapse::before { margin-top: .4em; -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } /** * Section contents / children */ .ns-cloner-section-content { padding: 20px 25px 25px; background: #f8f8f8; height: auto; -webkit-transition: all 0.25s; -o-transition: all 0.25s; transition: all 0.25s; border: solid 1px #fff; border-radius: 0 0 4px 4px; margin-top: -1px; position: relative; } .ns-cloner-section.closed .ns-cloner-section-content { height: 0; padding: 0 25px; border: 0; overflow: hidden; } .ns-cloner-section-content *:focus { -webkit-box-shadow: none !important; box-shadow: none !important; border-color: #ddd !important; } .ns-cloner-section-content > *:first-child, .ns-cloner-section-content > *:first-child > *:first-child { margin-top: 0 !important; } .ns-cloner-section-content > *:last-child, .ns-cloner-section-content > *:last-child > *:last-child { margin-bottom: 0 !important; } .ns-cloner-section-content h5 { font-size: 1.1em; margin: 0 0 .7em; } .ns-cloner-section-content label + h5, .ns-cloner-section-content input + h5, .ns-cloner-section-content .description + h5, .ns-cloner-section-content .ns-cloner-input-group + h5 { margin-top: 0.7em; } .ns-cloner-section-content h5 label { margin-top: 0; } .ns-cloner-section-content p { padding: .4em 0; margin: 0; border: 0; } .ns-cloner-section-content .description, .ns-cloner-mode-description p { font-style: italic; } .ns-cloner-section-content .description + .description { padding-top: 0 !important; } .ns-cloner-section-content label { display: block; padding: .25em; margin-top: .5em; font-weight: 500; clear: both; } .ns-cloner-section-content input[type=text], .ns-cloner-section-content select, .ns-cloner-section-content textarea { padding: .5em 1em; margin: 0; height: auto; width: 100%; border-radius: 0; border-color: #bbb; } .ns-cloner-section-content strong { color: #be9719; } .ns-cloner-section-content table { width: 100%; border: solid 1px #eee; margin-bottom: .5em; } .ns-cloner-section-content th { padding: 10px; border-bottom: solid 1px #eee; text-align: left; } .ns-cloner-section-content th.date-col { width: 15em; } .ns-cloner-section-content th.action-col { width: 8em; text-align: center; } .ns-cloner-section-content td { padding: 5px 10px; border-bottom: solid 1px #eee; } .ns-cloner-section-content tr:last-child td { border-bottom: 0; } .ns-cloner-section-content td .button { display: block; margin: 0 auto; text-align: center; position: relative; } .ns-cloner-section-content td .button.working:after { content: url(../images/loading.gif); display: block; position: absolute; top: 3px; right: -25px; } /** * Input groups */ .ns-cloner-section-content .ns-cloner-input-group { display: flex; max-width: 100%; } .ns-cloner-section-content .ns-cloner-input-group label { background-color: #eaeaea; padding: .5em 1em; border: solid 1px #ccc; position: relative; display: inline-block; bottom: 0; left: 1px; height: 35px; box-sizing: border-box; color: #777; margin: 0; } .ns-cloner-section-content .ns-cloner-input-group input { flex: 1; height: 35px; } .ns-cloner-section-content .ns-cloner-input-group input + label { left: -2px; } .ns-cloner-section-content .ns-cloner-input-group > *:first-child { border-radius: 2px 0 0 2px; } .ns-cloner-section-content .ns-cloner-input-group > *:last-child { border-radius: 0 2px 2px 0; } .ns-cloner-section-content .ns-cloner-input-group + .ns-cloner-input-group { margin-top: -1px; } /** * Checkbox groups */ .ns-cloner-multi-checkbox-wrapper { border: solid 1px #ddd; border-radius: 2px; background: #fff; padding: 1em 1.4em; overflow: auto; min-height: 6em; max-height: 12em; margin: 1em 0; } .ns-cloner-multi-checkbox-wrapper.loading { opacity: 0.75; background: url(../images/spinner.gif) no-repeat center center; } .ns-cloner-multi-checkbox-wrapper label { margin-top: .35em; font-weight: normal; } .ns-cloner-multi-checkbox-wrapper .description { font-size: .9em; color: #999; } /** * Chosen (select elements) */ .ns-cloner-section .chosen-container { margin-bottom: .5em !important; } .ns-cloner-section .chosen-single { padding: 5px 12px !important; height: 36px !important; border-color: #ccc !important; border-radius: 2px !important; background: white !important; } .ns-cloner-section .chosen-single b { background-position: 0 7px !important; } .ns-cloner-section .chosen-choices { border-color: #ccc !important; } .ns-cloner-section .chosen-choices .search-field { padding: 5px 5px 2px !important; } .ns-cloner-section .chosen-choices .search-choice { padding: 8px 22px 8px 10px !important; } .ns-cloner-section .chosen-choices .search-choice-close { top: 10px !important; right: 5px !important; } .ns-cloner-section .chosen-container .chosen-results li { padding: 6px 8px !important; } .ns-cloner-section .chosen-container .chosen-results li.highlighted { background: #ab8718 !important; } /** * Repeaters */ .ns-repeater li { display: flex !important; } C .ns-repeater li.invisible { visibility: hidden; height: 0; overflow: hidden; margin: 0; } .ns-repeater input[type=text] { display: block; flex: 1; margin-right: -2px; height: 35px; } .ns-repeater .chosen-container { width: 100%; flex-basis: 30%; position: relative; margin: 0 10px 0 15px; bottom: 1px; } .ns-repeater-add { margin: -.35em 0 .7em 0 !important; } .ns-repeater-remove { background-color: #eaeaea; padding: 8px 8px; border: solid 1px #ccc; position: relative; display: inline-block; bottom: 0; left: 1px; height: 35px; box-sizing: border-box; color: #777; margin: 0; cursor: pointer; } .ns-repeater-remove:after { content: "\f335"; font-size: 18px; font-family: 'dashicons'; } /** * Inline validation */ span.ns-cloner-validating-spinner, .ns-cloner-loader-icon { margin-top: -30px; display: inline-block; float: right; &:before { content: url(../images/loading.gif); padding: 0 .5em; display: inline-block; position: relative; top: 3px; font-size: 18px; font-family: dashicons; } &.valid:before { content: '\f147'; color: #558855; } &:first-child { float: none; } } .ns-cloner-loader-icon{ float: none; } .ns-cloner-section-content .ns-cloner-input-group .ns-cloner-validating-spinner { padding-top: 5px; margin-top: 0; } /** * Sidebar */ .ns-cloner-sidebar .ns-side-widget { border: solid 1px #ddd; text-align: center; } .ns-cloner-sidebar .ns-side-widget h5 { margin: 0; padding: 12px 25px; height: 1.2em; font-size: 14px; color: white; border: solid 1px #444; border-radius: 2px 2px 0 0; background-color: #4d4d4d; font-weight: 400; } .ns-cloner-sidebar .ns-side-widget h5 a { color: #ab8718; text-decoration: none; } .ns-cloner-sidebar .ns-side-widget-content { padding: 15px; background: #f8f8f8; } .ns-side-widget-content p { padding: 0; margin: 0 0 10px; } .ns-side-widget-content p:last-child { margin-bottom: 0; } .ns-featured-widget .ns-side-widget-content { padding: 0; } .ns-random-widget .ns-side-widget-content { padding: 30px; } .ns-links-widget .ns-side-widget-content { text-align: left; } .ns-subscribe-widget form > * { text-align: center; } .ns-subscribe-widget div#ns-subscribe-form > form button { background: #ab8718 !important; font-size: 13px; border-radius: 2px !important; text-transform: uppercase; } /** * Clone button + bar */ .ns-cloner-button-wrapper { padding: 15px 20px; position: fixed; left: 160px; bottom: 0; right: 0; background: #1f1f1f; z-index: 8999; display: -webkit-box; display: -ms-flexbox; display: flex; } body.folded .ns-cloner-button-wrapper { left: 36px; } .ns-cloner-button-steps { margin: 10px 10px 0; font-size: 18px; position: relative; height: 48px; overflow: hidden; z-index: 1; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; display: -webkit-box; display: -ms-flexbox; display: flex; } .ns-cloner-button-steps:before { content: ''; border-bottom: dotted 2px #555; height: 21px; position: absolute; width: calc( 100% - 10px ); left: 0; -webkit-box-sizing: border-box; box-sizing: border-box; top: 0; } .ns-cloner-button-steps:after { content: ' '; display: inline-block; border-style: solid; border-color: transparent transparent transparent #555; border-width: 6px 8px; position: absolute; top: 50%; right: 0; margin-top: -10px; } .ns-cloner-button-steps > span { background: #1f1f1f; -webkit-box-shadow: 0 0 20px #202020; box-shadow: 0 0 20px #202020; color: #555; text-transform: uppercase; margin-right: 25px; padding: 10px 15px; display: inline-block; white-space: nowrap; text-align: center; -webkit-transition: all ease-in-out 0.75s; -o-transition: all ease-in-out 0.75s; transition: all ease-in-out 0.75s; cursor: pointer; position: relative; } .ns-cloner-button-steps > span.seen { color: white; } .ns-cloner-button-steps > span:before, .ns-cloner-button-steps > span:before { content: ''; font-family: dashicons; position: absolute; left: 50%; bottom: -1px; margin-left: -5px; opacity: 0; -webkit-transition: opacity ease-in-out 0.75s; -o-transition: opacity ease-in-out 0.75s; transition: opacity ease-in-out 0.75s; } .ns-cloner-button-steps > span.invalid { color: #c85340; } .ns-cloner-button-steps > span.invalid:before { content: "\f335"; color: #c85340; opacity: 1; } .ns-cloner-button-steps > span:after { content: ' '; display: inline-block; border-style: solid; border-color: transparent transparent transparent #555; border-width: 6px 8px; position: absolute; top: 50%; right: -33px; margin-top: -10px; } .ns-cloner-button-steps > span:last-child:after { display: none; } .ns-cloner-button { float: right; background: #ab8718; padding: 16px 48px; margin-right: 10px; color: white; text-transform: uppercase; font-size: 18px; cursor: pointer; border: 0; outline: 0 !important; border-radius: 2px; -webkit-transition: all ease-out 0.25s; -o-transition: all ease-out 0.25s; transition: all ease-out 0.25s; position: relative; z-index: 1; } .ns-cloner-button:hover { -webkit-transform: scale(1.05); -ms-transform: scale(1.05); transform: scale(1.05); background: #be9719; } .ns-cloner-button.working { background-image: url(../images/gold-loading.gif); background-repeat: no-repeat; background-position: right 20px center; opacity: 0.5; cursor: default; } .ns-cloner-button.working:hover { -webkit-transform: none; -ms-transform: none; transform: none; background-color: #ab8718; } .ns-cloner-scroll-progress { background: #ab8718; position: absolute; left: 0; bottom: 0; height: 5px; -webkit-transition: width ease-in-out 0.75s; -o-transition: width ease-in-out 0.75s; transition: width ease-in-out 0.75s; } .ns-cloner-disclaimer { padding: .7em .35em 1.4em .35em; } .ns-cloner-disclaimer strong { color: orangered; } /** * Progress modal */ .ns-cloner-processes-modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 9999; background-color: rgba(0, 0, 0, 0.7); } .ns-cloner-processes-modal-wrapper { max-width: 1024px; width: 90%; position: absolute; top: 10%; bottom: 10%; left: 50%; padding: 40px 60px; -webkit-box-sizing: border-box; box-sizing: border-box; z-index: 9999; background-color: #f3f3f3; -webkit-transform: translateX(-50%); -ms-transform: translateX(-50%); transform: translateX(-50%); overflow-y: scroll; } .ns-cloner-processes-done { display: none; } .ns-modal-head { margin-bottom: 30px; } .ns-process-wrapper { display: block; padding: 5px 30px 30px 30px; margin-bottom: 15px; background: #fff; } .ns-modal-body { margin-bottom: 10px; } .ns-modal-refresh, .ns-modal-cancel, .ns-modal-close { margin-top: -10px; margin-left: 15px; cursor: pointer; float: right; color: #fff; outline: none; background-color: #555; padding: 10px 20px 12px; text-transform: uppercase; border-radius: 2px; text-decoration: none; text-align: center; border: 0; -webkit-box-shadow: none; box-shadow: none; height: auto; line-height: 1; } .ns-modal-cancel { background-color: #ddd; color: #555; } .ns-cloner-progress-bar { border: 1px solid #ab8718; height: 30px; background-color: #fff; border-radius: 2px; position: relative; } .ns-cloner-progress-bar-inner { background-color: #ab8718; width: 0; max-width: 100%; height: 32px; margin-top: -1px; -webkit-transition: all 2s ease-in-out; -o-transition: all 2s ease-in-out; transition: all 2s ease-in-out; background-size: 30px 30px; background-image: linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); animation: animate-stripes 3s linear infinite; } .ns-percents { font-size: 14px; line-height: 30px; font-weight: 500; text-align: center; color: #fff; position: absolute; top: -10px; width: 50px; height: 50px; z-index: 9999; background: #ab8718; left: 50%; margin-left: -20px; border-radius: 50%; padding-top: 9px; box-sizing: border-box; } .ns-cloner-progress-info { padding-top: 8px; } .ns-cloner-progress-items { display: flex; margin-top: 20px; } .ns-cloner-progress-items > div { flex: 1; text-align: center; font-size: 18px; padding: 40px; background: #f8f8f8; color: #aaa; border-right: solid 1px #ddd; } .ns-cloner-progress-items > div:last-child { border-right: 0; } .ns-cloner-progress-items em { font-style: normal; font-size: 22px; color: #333; } .ns-cloner-progress-items small { display: block; text-transform: uppercase; padding: 8px; color: #ab8718; font-size: 16px; } .ns-cloner-loading-center { position: absolute; top: 50%; left: 50%; margin: -10px 0 0 -10px; } @keyframes animate-stripes { 0% {background-position: 0 0;} 100% {background-position: 60px 0;} } /** * Report after cloning */ .ns-cloner-report { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, .45); z-index: 300000; } .ns-cloner-report-content { width: 50%; background: white; max-height: 75%; overflow: auto; position: relative; left: 20%; top: 32px; padding: 3% 5% 5%; border-radius: 0 0 .7em .7em; } .ns-cloner-report-content h5 { font-weight: bold; font-size: 1.4em; margin-top: 0; } .ns-cloner-report-item { clear: both; padding: .7em; overflow: hidden; } .ns-cloner-report-item:nth-child(odd) { background: #eee; } .ns-cloner-report-item-label { float: left; width: 20%; min-width: 10em; font-weight: bold; } /** * Copy logs box before going to support */ .ns-cloner-extra-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, .45); z-index: 300000; display: none; } .ns-cloner-extra-modal-content { background: white; width: 30%; padding: 1.5em 2.5%; top: 10vh; left: 35%; position: absolute; border-radius: 2px; max-height: 70vh; box-sizing: border-box; overflow: auto; } .ns-cloner-extra-modal-content p { margin-bottom: 1.2em !important; } .ns-cloner-extra-modal-content textarea { width: 100%; white-space: nowrap; height: 8em; font-size: 12px; padding: 1em; font-family: monospace; } /** * Utility classes */ .ns-cloner-small { font-size: 0.75em; } .ns-cloner-text-center { text-align: center; } .ns-cloner-gold-link { color: #ab8718; border-bottom: dotted 1px; font-size: smaller; display: inline-block; margin: 0 5px; text-decoration: none; cursor: pointer; } .ns-cloner-no-padding { padding: 0; } .ns-cloner-clear { clear: both; } .ns-cloner-info-message, .ns-cloner-warning-message, .ns-cloner-error-message, .ns-cloner-success-message { display: block; line-height: 19px; padding: 11px 15px; font-size: 13px; text-align: left; margin: 0 0 15px; background-color: #fff; border-left: 4px solid #ffba00; -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1); box-shadow: 0 1px 1px 0 rgba(0,0,0,.1); } .ns-cloner-info-message p, .ns-cloner-warning-message p, .ns-cloner-error-message p, .ns-cloner-success-message p { margin: 0; } .ns-cloner-info-message { border-left-color: #00a0d2; } .ns-cloner-error-message { border-left-color: #c85340; } .ns-cloner-success-message { border-left-color: #46b450; } .ns-cloner-error-message + .ns-cloner-section, .ns-cloner-warning-message + .ns-cloner-section { margin-top: .7em; } .disabled-description { display: none; } input[disabled] + .disabled-description { display: inline; color: #888; font-size: smaller; font-style: italic; } .ns-cloner-form-button, .ns-cloner-sidebar .button { background: #ab8718 !important; border: 0 !important; text-shadow: none !important; box-shadow: none !important; color: white !important; padding: .5em 1.5em !important; height: 3em !important; -webkit-transition: all 0.4s; -o-transition: all 0.4s; transition: all 0.4s; text-transform: uppercase; cursor: pointer; position: relative; } .ns-cloner-form-button:hover, .ns-cloner-sidebar .button:hover { box-shadow: 0 2px 6px #ccc !important; transform: translateY( -2px ); } .ns-cloner-form-button.large { height: 40px !important; padding-left: 2em !important; padding-right: 2em !important; } .ns-cloner-checkbox-label{ input[type="checkbox"] { margin-right: 10px; } } /** * WordPress compatibility */ /* Hide update notices on cloner page */ body.toplevel_page_ns-cloner .update-nag, body[class*=ns-cloner] .update-nag { display: none; } /** * Single site adaptations */ .ns-cloner-wrapper.disabled .ns-cloner-section, .ns-cloner-wrapper.disabled .ns-cloner-disclaimer { opacity: 0.4; } .ns-cloner-wrapper.disabled .ns-cloner-button-wrapper { display: none; } /** * Media Queries */ @media ( min-width:1700px ){ .ns-cloner-wrapper { background: url(../images/big-bg.jpg); background-attachment: fixed; background-repeat: no-repeat; background-position: right 60px top 0px; } } @media ( min-width:1600px ) { .ns-cloner-form { flex: 0 1; flex-basis: 1000px; } } @media ( max-width: 1200px ){ .ns-cloner-sidebar { width: 275px; } .ns-cloner-button-steps { display: none; } .ns-cloner-button { width: 100%; } } @media ( max-width: 960px ) { .ns-cloner-wrapper { flex-wrap: wrap; } .ns-cloner-sidebar { width: 100%; margin-top: -30px; margin-left: 0; padding-left: 0; padding-bottom: 30px; display: flex; flex-wrap: wrap; } .ns-cloner-sidebar .ns-side-widget { flex: 1 1 45%; margin: 0 1% 20px !important; } body.auto-fold .ns-cloner-button-wrapper { left: 36px; } .ns-cloner-report-content { width: 90%; left: 5%; } } @media( max-width: 780px ){ .ns-cloner-sidebar .ns-side-widget { flex-basis: 100%; } } @media( max-width: 780px ){ .ns-cloner-button-wrapper { left: 0 !important; } } /** * Project: https://github.com/svichas/jquery.digitScroller.js * Author: Stefanos Vichas * License: MIT */ .__digit_scroller_digit { position: relative; display: inline-block; -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); width: .58em; text-align: center; } .__digit_scroller_digit._digit_up { -webkit-transform: translateY(-100%); -ms-transform: translateY(-100%); transform: translateY(-100%); } .__digit_scroller_next_digit { position: absolute; top: 100%; left: 0; } .__digit_scroller_wrap { display: inline-block; overflow: hidden; } /*=== Analytics === */ .ns-cloner-extra-modal{ &#analytics-settings{ .ns-cloner-extra-modal-content{ width: 50%; left: 25%; } .ns-cloner-form-button{ margin-bottom: 5px; } } } #analytics-settings{ .analytics-settings-label{ margin-top: 0.5em !important; } .tooltip{ position: relative; display: inline-block; border-bottom: 1px dotted black; .tooltip-text{ visibility: hidden; width: 200px; background-color: #555; color: #fff; text-align: center; border-radius: 6px; padding: 5px; position: absolute; z-index: 1; bottom: 125%; left: 50%; margin-left: -100px; opacity: 0; transition: opacity 0.3s; white-space: initial; text-transform: none; line-height: initial; &::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: #555 transparent transparent transparent; } } &:hover{ .tooltip-text{ visibility: visible; opacity: 1; } } &.ns-cloner-form-button{ border-bottom: none; .tooltip-toggle{ border-bottom: 1px dotted black; } } } } composer.json 0000644 00000000332 15132706043 0007265 0 ustar 00 { "minimum-stability": "dev", "prefer-stable": true, "require": { "kint-php/kint": "^4.0", "harvesthq/chosen": "^1.8", "a5hleyrich/wp-background-processing": "^1.0" } } composer.lock 0000644 00000015403 15132706043 0007251 0 ustar 00 { "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "e54f90dca6effa5eda8d79a5b8e53c43", "packages": [ { "name": "a5hleyrich/wp-background-processing", "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/deliciousbrains/wp-background-processing.git", "reference": "2cbee1abd1b49e1133cd8f611df4d4fc5a8b9800" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/deliciousbrains/wp-background-processing/zipball/2cbee1abd1b49e1133cd8f611df4d4fc5a8b9800", "reference": "2cbee1abd1b49e1133cd8f611df4d4fc5a8b9800", "shasum": "" }, "require": { "php": ">=5.2" }, "suggest": { "coenjacobs/mozart": "Easily wrap this library with your own prefix, to prevent collisions when multiple plugins use this library" }, "type": "library", "autoload": { "classmap": [ "classes/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "GPL-2.0-or-later" ], "authors": [ { "name": "Delicious Brains", "email": "nom@deliciousbrains.com" } ], "description": "WP Background Processing can be used to fire off non-blocking asynchronous requests or as a background processing tool, allowing you to queue tasks.", "time": "2020-07-31T07:00:11+00:00" }, { "name": "harvesthq/chosen", "version": "v1.8.7", "source": { "type": "git", "url": "https://github.com/harvesthq/chosen-package.git", "reference": "ad86732b668627c131e61ee8f0e6e9ed52e4db8d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/harvesthq/chosen-package/zipball/ad86732b668627c131e61ee8f0e6e9ed52e4db8d", "reference": "ad86732b668627c131e61ee8f0e6e9ed52e4db8d", "shasum": "" }, "type": "library", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Koen Punt", "homepage": "https://github.com/koenpunt" }, { "name": "Patrick Filler", "homepage": "https://github.com/pfiller" }, { "name": "Christophe Coevoet", "homepage": "https://github.com/stof" }, { "name": "Ken Earley", "homepage": "https://github.com/kenearley" } ], "description": "Chosen is a JavaScript plugin that makes select boxes user-friendly. It is currently available in both jQuery and Prototype flavors.", "homepage": "https://harvesthq.github.io/chosen/", "keywords": [ "dropdown", "form", "input", "multiselect", "select", "ui" ], "time": "2018-06-28T20:32:51+00:00" }, { "name": "kint-php/kint", "version": "4.0-alpha1", "source": { "type": "git", "url": "https://github.com/kint-php/kint.git", "reference": "5dea34eb550f0dd1ef582f3b785158c13f9c4fd4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/kint-php/kint/zipball/5dea34eb550f0dd1ef582f3b785158c13f9c4fd4", "reference": "5dea34eb550f0dd1ef582f3b785158c13f9c4fd4", "shasum": "" }, "require": { "php": ">=5.6" }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.0", "phpspec/prophecy-phpunit": "^2", "phpunit/phpunit": "^9.0", "seld/phar-utils": "^1.0", "symfony/finder": "^3.0 || ^4.0 || ^5.0", "vimeo/psalm": "dev-master" }, "suggest": { "ext-ctype": "Simple data type tests", "ext-iconv": "Provides fallback detection for ambiguous legacy string encodings such as the Windows and ISO 8859 code pages", "ext-mbstring": "Provides string encoding detection", "kint-php/kint-js": "Provides a simplified dump to console.log()", "kint-php/kint-twig": "Provides d() and s() functions in twig templates", "symfony/polyfill-ctype": "Replacement for ext-ctype if missing", "symfony/polyfill-iconv": "Replacement for ext-iconv if missing", "symfony/polyfill-mbstring": "Replacement for ext-mbstring if missing" }, "type": "library", "autoload": { "files": [ "init.php" ], "psr-4": { "Kint\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jonathan Vollebregt", "homepage": "https://github.com/jnvsor" }, { "name": "Rokas Šleinius", "homepage": "https://github.com/raveren" }, { "name": "Contributors", "homepage": "https://github.com/kint-php/kint/graphs/contributors" } ], "description": "Kint - debugging tool for PHP developers", "homepage": "https://kint-php.github.io/kint/", "keywords": [ "debug", "kint", "php" ], "time": "2020-11-25T20:18:13+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "dev", "stability-flags": [], "prefer-stable": true, "prefer-lowest": false, "platform": [], "platform-dev": [], "plugin-api-version": "1.1.0" } class-ns-cloner-request.php 0000644 00000023735 15132706043 0011761 0 ustar 00 <?php /** * Cloner Request class. * * @package NS_Cloner */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * NS_Cloner_Request class * * Utility class to define and access request data - settings for the current cloning operation * that are usually submitted via a POST request (but could be manually set) and then are saved * in a site option for the duration of that cloning process, and cleared at the end. Should * generally be the go-to source for POST and GET data rather than referring to those directly. * * Also handles calculating basic variables - like db prefixes, upload dirs, etc. - for cloning * operations and search/replace values. */ final class NS_Cloner_Request { /** * Request Data * * @var array */ private $request = []; /** * Option key to save stored request to * * @var string */ private static $option_key = 'ns_cloner_saved_request'; /** * List of default variables to be defined for source and target sites * * @var array */ private static $vars = [ 'prefix', 'upload_dir', 'upload_url', 'url', 'url_short', ]; /** * Singleton instance of this class * * @var NS_Cloner_Request */ private static $instance; /** * NS_Cloner_Request constructor. */ private function __construct() { // Load request from saved request option if present, enabling background processes to stay in sync. $request = (array) get_site_option( 'ns_cloner_saved_request', [] ); // Enable $_GET and $_POST to override / fill in gaps in the saved request. // Verifying the nonce here shouldn't be needed, because it is checked elsewhere before performing any actions. // However, this check is here as a safety precaution so the cloner request object can't ever somehow get injected. $nonce = isset( $_REQUEST['clone_nonce'] ) ? $_REQUEST['clone_nonce'] : ''; if ( wp_verify_nonce( $nonce, 'ns_cloner' ) ) { $request = array_merge( $request, wp_unslash( $_GET ), wp_unslash( $_POST ) ); } $this->request = $request; } /** * Disable cloning */ private function __clone() { } /** * Disable unserialize */ public function __wakeup() { } /** * Get singleton instance * * @return NS_Cloner_Request */ public static function instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } /** * Reload the request from the saved version in the database * * @return $this */ public function refresh() { $this->request = (array) get_site_option( 'ns_cloner_saved_request', [] ); return $this; } /** * Get all current request variables * * @return array */ public function get_request() { return $this->request; } /** * Get a request variable * * @param string $key Key of request array. * @param mixed $default Default value. * * @return null */ public function get( $key, $default = null ) { return isset( $this->request[ $key ] ) ? $this->request[ $key ] : $default; } /** * Set a request variable * * @param string $key Key of request array. * @param string $value Value to set. */ public function set( $key, $value ) { $this->request[ $key ] = $value; ns_cloner()->log->log( [ "SETTING REQUEST VAR '$key' to:", $value ] ); } /** * Save the current request into site options for later reference by background processes */ public function save() { update_site_option( self::$option_key, $this->request ); ns_cloner()->log->log( [ 'SAVING REQUEST:', $this->request ] ); } /** * Save the current request into site options for later reference by background processes */ public function delete() { delete_site_option( self::$option_key ); ns_cloner()->log->log( 'DELETING REQUEST' ); } /** * Generate definitions for site variables * * If null, 'network', or another string is provided as the site_id, it defaults to the main site * (either the only site for single installs, or the main site on the network for multisite). * Teleport uses this to provide a string (remote site url) rather than an ID, and then uses * the filter at the bottom to return the correct variables. * * IMPORTANT: This cannot be called for target values during the middle of a cloning operation, * because the target options table could be empty and site_url() will return empty. * * @param int $site_id Blog id of site to get variables for. * @return array */ public function define_vars( $site_id = null ) { $is_subsite = is_multisite() && ! is_null( $site_id ) && is_numeric( $site_id ); if ( $is_subsite ) { switch_to_blog( $site_id ); } // Get site url directly rather than with site_url(), because option/object // caching can result in a blank value for a newly created site. $option_q = 'SELECT option_value FROM ' . ns_cloner()->db->options . " WHERE option_name='siteurl'"; $site_url = set_url_scheme( ns_cloner()->db->get_var( $option_q ) ); // Past Cloner versions had manual checking/overrides for wp_upload_dir. // However, it seems that wp_upload_dir() is now more reliable, whereas the // overrides were beginning to cause problems. If a fix is needed on a case // by case basis for when wp_upload_dir() is overwritten by a filter (e.g. // compatibility with another plugin), we could add a small patch plugin OR // add a filter in ns-compatibility.php to filter ns_cloner_request_define_vars. $upload_dir = wp_upload_dir(); // If the upload_url_path option is blank, _wp_upload_dir will use WP_CONTENT_URL, // with the domain set to the network domain, not the current blog's domain, so fix it. $upload_url = str_replace( WP_CONTENT_URL, $site_url, $upload_dir['baseurl'] ); // These definitions should all work both for multisite (after using switch_blog above // so they have the correct sub-site values) as well as single site / whole network. $vars = [ 'prefix' => ns_cloner()->db->prefix, 'upload_dir' => $upload_dir['basedir'], 'upload_dir_relative' => str_replace( ABSPATH, '', $upload_dir['basedir'] ), 'upload_url' => $upload_url, 'upload_url_relative' => str_replace( $site_url, '', $upload_url ), 'url' => $site_url, 'url_short' => untrailingslashit( preg_replace( '|^(https?:)?//|', '', $site_url ) ), ]; if ( $is_subsite ) { restore_current_blog(); } return apply_filters( 'ns_cloner_request_define_vars', $vars, $site_id ); } /** * Add source and target vars to the current cloner request * * Take definitions from define_vars() for source and target ids, if applicable, * and add them to the current cloner request array. */ public function set_up_vars() { $source_id = $this->get( 'source_id' ); if ( $source_id ) { foreach ( $this->define_vars( $source_id ) as $key => $value ) { $this->set( "source_{$key}", $value ); } } $target_id = $this->get( 'target_id' ); if ( $target_id ) { foreach ( $this->define_vars( $target_id ) as $key => $value ) { $this->set( "target_{$key}", $value ); } } if ( $source_id && $target_id ) { $this->set_up_search_replace( $source_id, $target_id ); } } /** * Set up search / replace value arrays * * @param int|null $source_id ID of source site. * @param int|null $target_id ID of target site. */ public function set_up_search_replace( $source_id = null, $target_id = null ) { $source_id = $source_id ?: $this->get( 'source_id' ); $target_id = $target_id ?: $this->get( 'target_id' ); $option_key = "ns_cloner_search_{$source_id}_replace_{$target_id}"; // Generate arrays and save if not. $search = [ $this->request['source_upload_dir_relative'], $this->request['source_upload_url'], $this->request['source_url_short'], $this->request['source_prefix'] . 'user_roles', ]; $replace = [ $this->request['target_upload_dir_relative'], $this->request['target_upload_url'], $this->request['target_url_short'], $this->request['target_prefix'] . 'user_roles', ]; $search = apply_filters( 'ns_cloner_search_items_before_sequence', $search ); $replace = apply_filters( 'ns_cloner_replace_items_before_sequence', $replace ); // Sort and filter replacements to intelligently avoid compounding replacement issues. ns_set_search_replace_sequence( $search, $replace ); // Add filters that enable custom replacements to be applied. $search_replace = [ 'search' => apply_filters( 'ns_cloner_search_items', $search ), 'replace' => apply_filters( 'ns_cloner_replace_items', $replace ), ]; // Save in settings for use by background processes. update_site_option( $option_key, $search_replace ); ns_cloner()->log->log( [ "SETTING search/replace for source *$source_id* and target *$target_id*:", $search_replace ] ); } /** * Get saved search / replace value arrays * * @param int|null $source_id ID of source site. * @param int|null $target_id ID of target site. * @return array */ public function get_search_replace( $source_id = null, $target_id = null ) { $source_id = $source_id ?: $this->get( 'source_id' ); $target_id = $target_id ?: $this->get( 'target_id' ); $option_key = "ns_cloner_search_{$source_id}_replace_{$target_id}"; return get_site_option( $option_key ); } /** * Shortcut to check if the current mode is equal to a provided one (or in a provided list). * * @param string|array $mode_id Mode id or array of them to compare to the current mode. * @return bool */ public function is_mode( $mode_id ) { if ( is_array( $mode_id ) ) { return in_array( $this->get( 'clone_mode' ), $mode_id, true ); } else { return $this->get( 'clone_mode' ) === $mode_id; } } } /** * Get the current singleton request instance * * @return NS_Cloner_Request */ function ns_cloner_request() { return NS_Cloner_Request::instance(); } ns-compatibility.php 0000644 00000010535 15132706043 0010551 0 ustar 00 <?php /** * Cloner Compatibility filters / functions. * * Location for any plugin-specific fixes, filters, or patches to keep them from cluttering up the main plugin. * * @package NS_Cloner */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Add known plugins with global tables to the global table list */ add_filter( 'ns_cloner_global_table_patterns', function( $global_patterns ) { $plugin_patterns = [ 'domain_mapping.*', // Domain mapping tables. '3wp_broadcast_.*', // 3wp broadcast tables. 'bp_.*', // BuddyPress tables. ]; return array_merge( $global_patterns, $plugin_patterns ); } ); /** * Don't drop main slimstat table because it will cause a foreign key error * NOTE: this may cause problems in clone over mode - will have to address that down the road if necessary */ add_filter( 'ns_cloner_do_drop_target_table', function( $do, $table ) { if ( strpos( $table, 'slim_stats' ) !== false ) { $do = false; } return $do; }, 10, 2 ); /** * Skip copying options certain plugin options, because they will be created first * by the plugin and will result in a duplicate key error, or cause some other problem. */ add_filter( 'ns_cloner_do_copy_row', function( $do, $row ) { $plugin_opts = []; // Collisimo Shipping Methods for WooCommerce. $plugin_opts = array_merge( $plugin_opts, [ 'lpc_db_version' ] ); // Jetpack. $plugin_opts = array_merge( $plugin_opts, [ 'jetpack_activated', 'jetpack_private_options' ] ); // WC Multilingual. $plugin_opts = array_merge( $plugin_opts, [ 'wcml_currency_switcher_template_objects' ] ); // WP Mail SMTP. $plugin_opts = array_merge( $plugin_opts, [ 'mail_bank_update_database', 'mail-bank-version-number', 'mb_admin_notice' ] ); // WordFence. $plugin_opts = array_merge( $plugin_opts, [ 'wordfence_installed' ] ); // Yoast WP SEO. $plugin_opts = array_merge( $plugin_opts, [ 'wpseo_ryte' ] ); // Woo Discount Rules. $plugin_opts = array_merge( $plugin_opts, [ 'awdr_activity_log_version' ] ); // Freemius. $plugin_opts = array_merge( $plugin_opts, [ 'fs_accounts' ] ); // Skip copying any of the above listed option rows. if ( isset( $row['option_name'] ) && in_array( $row['option_name'], $plugin_opts, true ) ) { $do = false; } // Handle other patterns that should be excluded. if ( isset( $row['option_name'] ) && preg_match( '/^gadwp_cache/', $row['option_name'] ) ) { $do = false; } return $do; }, 10, 2 ); /** * Skip copying options certain plugin options, because they will be created first * by the plugin and will result in a duplicate key error, or cause some other problem. */ add_filter( 'ns_cloner_do_search_replace', function( $do, $row ) { $excluded_meta = []; // WP Simple Pay has Stripe plan objects encoded. $excluded_meta = array_merge( $excluded_meta, [ '_single_plan_object' ] ); // Skip doing search/replace on any of the above listed meta rows. if ( isset( $row['meta_key'] ) && in_array( $row['meta_key'], $excluded_meta, true ) ) { $do = false; } return $do; }, 10, 2 ); /** * Clear WP Engine cache on completion because cloned sites won't use the correct * theme + options without flushing if object caching is enabled. * Based from https://github.com/a7/wpe-cache-flush/ and issue #1 on that repo. */ add_action( 'ns_cloner_process_finish', function() { if ( defined( 'PWP_NAME' ) ) { $wpe_nonce = wp_create_nonce( PWP_NAME . '-config' ); $wpe_endpoint = 'admin.php?page=wpengine-common&purge-all=1&_wpnonce=' . $wpe_nonce; wp_remote_get( is_multisite() ? network_admin_url( $wpe_endpoint ) : admin_url( $wpe_endpoint ) ); } }, 10, 99 ); /** * SEO by Rank Math Pro runs activation that triggers a fatal error. * Have to remove manually because Rank Math doesn't give any hook or access to use remove_action. */ add_action( 'ns_cloner_process_init', function() { if ( class_exists( '\RankMathPro\Installer' ) ) { global $wp_filter; foreach ( $wp_filter['wpmu_new_blog']->callbacks as $priority => $callbacks ) { foreach ( $callbacks as $key => $fn ) { if ( preg_match( '/activate_blog$/', $key ) ) { unset( $wp_filter['wpmu_new_blog']->callbacks[ $priority ][ $key ] ); } } } } } ); class-ns-cloner-report.php 0000644 00000007500 15132706043 0011574 0 ustar 00 <?php /** * Cloner Reporting class. * * @package NS_Cloner */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * NS_Cloner_Report class. * * Utility class to store pieces of data about the cloning process (objects cloned, etc) * that should be reported to the user at the end of the process. */ class NS_Cloner_Report { /** * Options key to save report under * * @var string */ private $report_key = 'ns_cloner_report'; /** * Save a single report item * * @param string $key Key of report data item. * @param mixed $value Value of report data item. * * @return bool */ public function add_report( $key, $value ) { $reports = $this->get_all_reports(); $reports[ $key ] = $value; return update_site_option( $this->report_key, $reports ); } /** * Increase the count for a numeric report item * * @param string $key Key of report item. * @param int $value Amount to increase it. */ public function increment_report( $key, $value ) { $reports = $this->get_all_reports(); if ( isset( $reports[ $key ] ) ) { $value = $reports[ $key ] + $value; } $this->add_report( $key, $value ); } /** * Add a non-fatal warning to the report * * @param string $message Text to display in notice. */ public function add_notice( $message ) { ns_cloner()->log->log( [ 'WRITING notice:', $message ] ); $notices = $this->get_report( '_notices' ) ?: []; $notices[] = $message; $this->add_report( '_notices', $notices ); } /** * Get single report item * * @param string $key Key of report data item. * @return mixed|null */ public function get_report( $key ) { $reports = $this->get_all_reports(); return isset( $reports[ $key ] ) ? $reports[ $key ] : null; } /** * Get an array of all saved report items * * @return array */ public function get_all_reports() { return get_site_option( $this->report_key ); } /** * Get an HTML template containing rendered report data * * @return string */ public function get_html() { ob_start(); ns_cloner()->render( 'report' ); return ob_get_clean(); } /** * Delete all saved report items * * @return void */ public function clear_all_reports() { delete_site_option( $this->report_key ); } /** * Save the start time for this cloning process */ public function set_start_time() { $this->add_report( '_start_time', microtime( true ) ); } /** * Get the start time for this cloning process * * @param bool $prepared Whether to format the raw timestamp before returning. * @return string */ public function get_start_time( $prepared = true ) { $start_time = $this->get_report( '_start_time' ); return $prepared ? $this->prepare_time( $start_time ) : $start_time; } /** * Save the end time for this cloning process */ public function set_end_time() { $this->add_report( '_end_time', microtime( true ) ); } /** * Get the end time for this cloning process * * @param bool $prepared Whether to format the raw timestamp before returning. * @return string */ public function get_end_time( $prepared = true ) { $end_time = $this->get_report( '_end_time' ); return $prepared ? $this->prepare_time( $end_time ) : $end_time; } /** * Get the amount of time elapsed since the saved start time * * @return float */ public function get_elapsed_time() { return microtime( true ) - $this->get_start_time( false ); } /** * Get date from miliseconds * * @param int $time Raw time value (in ms) to format. * @return string */ public function prepare_time( $time ) { $date = DateTime::createFromFormat( 'U.u', $time ); return $date ? $date->format( 'Y-m-d H:i:s' ) : ''; } } languages/ns-cloner.pot 0000644 00000040550 15132706043 0011143 0 ustar 00 # Copyright (C) 2019 Never Settle # This file is distributed under the same license as the NS Cloner - Site Copier plugin. msgid "" msgstr "" "Project-Id-Version: NS Cloner - Site Copier 4.0.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ns-cloner-site-copier\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: 2019-07-22T21:51:55+02:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.2.0\n" "X-Domain: ns-cloner\n" #. Plugin Name of the plugin msgid "NS Cloner - Site Copier" msgstr "" #. Plugin URI of the plugin #. Author URI of the plugin msgid "https://neversettle.it" msgstr "" #. Description of the plugin msgid "The amazing NS Cloner creates a new site as an exact clone / duplicate / copy of an existing site with theme and all plugins and settings intact in just a few steps. Check out NS Cloner Pro for additional powerful add-ons and features!" msgstr "" #. Author of the plugin msgid "Never Settle" msgstr "" #: class-ns-cloner-process-manager.php:146 msgid "Validation errors found." msgstr "" #: class-ns-cloner-process-manager.php:255 msgid "Start Time" msgstr "" #: class-ns-cloner-process-manager.php:256 msgid "End Time" msgstr "" #: class-ns-cloner-process-manager.php:257 msgid "Total Time" msgstr "" #. translators: number of items copied in clone operation #: class-ns-cloner-process-manager.php:270 msgid "%d item processed" msgid_plural "%d items processed" msgstr[0] "" msgstr[1] "" #. translators: number of text replacements made on site content #: class-ns-cloner-process-manager.php:278 msgid "%d replacement made" msgid_plural "%d replacements made" msgstr[0] "" msgstr[1] "" #: class-ns-cloner-process-manager.php:279 msgid "Replacements" msgstr "" #: class-ns-cloner-process-manager.php:309 #: templates/ns-template-logs.php:117 msgid "Log File" msgstr "" #: class-ns-cloner-process-manager.php:388 msgid "Source and target prefix the same. Cannot clone tables." msgstr "" #: class-ns-cloner-process-manager.php:456 msgid "An unknown error occurred. Check the logs for info." msgstr "" #: ns-cloner.php:254 msgid "Standard Clone" msgstr "" #: ns-cloner.php:255 msgid "Clone" msgstr "" #: ns-cloner.php:256 msgid "Take an existing site and create a brand new copy of it at another url." msgstr "" #: ns-cloner.php:264 msgid "Site cloned successfully!" msgstr "" #: ns-cloner.php:267 msgid "Source Site" msgstr "" #: ns-cloner.php:270 msgid "Target Site" msgstr "" #: ns-cloner.php:356 #: ns-cloner.php:357 msgid "NS Cloner" msgstr "" #: ns-cloner.php:371 #: ns-cloner.php:372 msgid "Logs / Status" msgstr "" #: ns-cloner.php:497 msgid "You don't have sufficient permissions for this action." msgstr "" #: processes/class-ns-cloner-files-process.php:31 msgid "Files" msgstr "" #: processes/class-ns-cloner-rows-process.php:31 msgid "Rows" msgstr "" #: processes/class-ns-cloner-tables-process.php:31 msgid "Tables" msgstr "" #: sections/class-ns-cloner-section-additional-settings.php:44 msgid "Additional Settings" msgstr "" #: sections/class-ns-cloner-section-additional-settings.php:46 msgid "Debugging" msgstr "" #: sections/class-ns-cloner-section-additional-settings.php:49 msgid "Enable logging" msgstr "" #: sections/class-ns-cloner-section-additional-settings.php:53 msgid "Logs may contain sensitive information from your database." msgstr "" #: sections/class-ns-cloner-section-additional-settings.php:54 msgid "If you enable logging, it's recommended to go to NS Cloner > Logs and clear your logs when you are finished." msgstr "" #: sections/class-ns-cloner-section-advertise-pro.php:46 msgid "Copy Tables" msgstr "" #: sections/class-ns-cloner-section-advertise-pro.php:48 msgid "All database tables will be copied by default. " msgstr "" #. translators: URL to plugin info page #: sections/class-ns-cloner-section-advertise-pro.php:52 msgid "For more efficiency and precise control over which tables are cloned, check out <a href=\"%s\" target=\"_blank\">NS Cloner Pro</a>." msgstr "" #: sections/class-ns-cloner-section-advertise-pro.php:61 msgid "Post Types" msgstr "" #: sections/class-ns-cloner-section-advertise-pro.php:63 msgid "All post types will be copied by default. " msgstr "" #. translators: URL to plugin info page #: sections/class-ns-cloner-section-advertise-pro.php:67 msgid "With <a href=\"%s\" target=\"_blank\">NS Cloner Pro</a> you can customize which post types are cloned, giving you even more powerful flexibility." msgstr "" #: sections/class-ns-cloner-section-advertise-pro.php:76 msgid "Search and Replace" msgstr "" #: sections/class-ns-cloner-section-advertise-pro.php:78 msgid "By default, the site name and URL will be replaced in all cloned content and settings. " msgstr "" #. translators: URL to plugin info page #: sections/class-ns-cloner-section-advertise-pro.php:82 msgid " <a href=\"%s\" target=\"_blank\">NS Cloner Pro</a> offers the ability to perform an unlimited number of additional custom search and replace operations." msgstr "" #: sections/class-ns-cloner-section-advertise-pro.php:91 msgid "Copy Users" msgstr "" #: sections/class-ns-cloner-section-advertise-pro.php:93 msgid "By default, just the current admin user (you) will be automatically added as a user on the new site. " msgstr "" #. translators: URL to plugin info page #: sections/class-ns-cloner-section-advertise-pro.php:97 msgid "With <a href=\"%s\" target=\"_blank\">NS Cloner Pro</a> you can auto-generate new admin users, as well as have the option to clone all the existing users." msgstr "" #: sections/class-ns-cloner-section-advertise-pro.php:106 msgid "Copy Media Files" msgstr "" #: sections/class-ns-cloner-section-advertise-pro.php:108 msgid "By default, all media library files will be copied by default to the new site, and links referring to them updated. " msgstr "" #. translators: URL to plugin info page #: sections/class-ns-cloner-section-advertise-pro.php:112 msgid "<a href=\"%s\" target=\"_blank\">NS Cloner Pro</a> enables you to control uploads cloning, so your cloned site could optionally continue to refer to the source site's media files." msgstr "" #: sections/class-ns-cloner-section-create-target.php:47 msgid "Create New Site" msgstr "" #: sections/class-ns-cloner-section-create-target.php:47 msgid "Create Site" msgstr "" #: sections/class-ns-cloner-section-create-target.php:49 msgid "Give the target site a title" msgstr "" #: sections/class-ns-cloner-section-create-target.php:52 msgid "New Site Title" msgstr "" #: sections/class-ns-cloner-section-create-target.php:53 msgid "Site title" msgstr "" #: sections/class-ns-cloner-section-create-target.php:56 msgid "Give the target site a URL" msgstr "" #: sections/class-ns-cloner-section-create-target.php:60 #: sections/class-ns-cloner-section-create-target.php:64 msgid "Site URL" msgstr "" #: sections/class-ns-cloner-section-select-source.php:44 msgid "Select Source" msgstr "" #: sections/class-ns-cloner-section-select-source.php:47 #: sections/class-ns-cloner-section-select-source.php:52 msgid "The cloning source is set to the current site." msgstr "" #: sections/class-ns-cloner-section-select-source.php:48 msgid "This is configurable for WordPress multisite, but here you only have one site installed to choose from, so it's been automatically selected for you." msgstr "" #: sections/class-ns-cloner-section-select-source.php:53 msgid "You can use this plugin in Network mode to choose from other source sites." msgstr "" #: sections/class-ns-cloner-section-select-source.php:60 msgid "Select a site to clone" msgstr "" #: sections/class-ns-cloner-section-select-source.php:76 msgid "If you haven't already, now is a great time to set up a \"template\" site exactly the way you want the new clone site to start out (theme, plugins, settings, etc.)." msgstr "" #: templates/ns-template-logs.php:24 msgid "Logs & Status" msgstr "" #: templates/ns-template-logs.php:33 msgid "Scheduled Operations" msgstr "" #: templates/ns-template-logs.php:37 msgid "No scheduled cloning operations." msgstr "" #: templates/ns-template-logs.php:41 msgid "Scheduled" msgstr "" #: templates/ns-template-logs.php:42 msgid "Type" msgstr "" #: templates/ns-template-logs.php:43 msgid "Created" msgstr "" #: templates/ns-template-logs.php:44 #: templates/ns-template-logs.php:62 #: templates/ns-template-logs.php:119 msgid "View" msgstr "" #: templates/ns-template-logs.php:45 #: templates/ns-template-logs.php:73 msgid "Delete" msgstr "" #: templates/ns-template-logs.php:81 msgid "Scheduled operations are created when someone clicks the clone button while another cloning operation is still running." msgstr "" #: templates/ns-template-logs.php:82 msgid " They may also be created via the command line or by frontend cloning (from member registrations) with Cloner Pro." msgstr "" #: templates/ns-template-logs.php:89 msgid "Manage Logs" msgstr "" #: templates/ns-template-logs.php:93 #: templates/ns-template-logs.php:112 msgid "No logs currently saved." msgstr "" #: templates/ns-template-logs.php:96 msgid "Logs may contain sensitive information from your database, so it's good security practice to clear them once no longer needed." msgstr "" #: templates/ns-template-logs.php:97 msgid "Make sure that you don't need them for support or debugging, though, because they will be deleted permanently once cleared." msgstr "" #: templates/ns-template-logs.php:100 msgid "Delete All Logs" msgstr "" #: templates/ns-template-logs.php:108 msgid "View Logs" msgstr "" #: templates/ns-template-logs.php:116 msgid "Date" msgstr "" #: templates/ns-template-logs.php:118 msgid "Size" msgstr "" #: templates/ns-template-logs.php:136 msgid "View Log" msgstr "" #: templates/ns-template-main.php:29 msgid "Select Cloning Mode" msgstr "" #: templates/ns-template-main.php:31 msgid "Collapse All" msgstr "" #: templates/ns-template-main.php:35 msgid "Expand All" msgstr "" #: templates/ns-template-main.php:40 msgid "No cloning modes are currently available for this site." msgstr "" #: templates/ns-template-main.php:61 msgid "WARNING:" msgstr "" #: templates/ns-template-main.php:62 msgid "We have made an incredibly complex process ridiculously easy with this powerful plugin. We have tested thoroughly and used this exact tool in our own live multisite environments. However, our comfort level should not dictate your precautions. If you're confident in your testing and back-up scheme - which you should have in place anyway ;) - then by all means - start cloning like there's no tomorrow!" msgstr "" #: templates/ns-template-main.php:81 msgid "Refresh" msgstr "" #: templates/ns-template-main.php:82 msgid "Cancel" msgstr "" #: templates/ns-template-main.php:93 msgid "started..." msgstr "" #: templates/ns-template-main.php:98 msgid "Current status" msgstr "" #: templates/ns-template-main.php:107 msgid "items processed" msgstr "" #: templates/ns-template-main.php:115 msgid "Close" msgstr "" #: templates/ns-template-main.php:116 msgid "finished..." msgstr "" #: templates/ns-template-sidebar-sub.php:16 #: templates/ns-template-sidebar.php:16 msgid "Support" msgstr "" #: templates/ns-template-sidebar-sub.php:19 #: templates/ns-template-sidebar.php:19 msgid "Have any issues with the Cloner, or ideas on how to make it better? We'd love to hear from you." msgstr "" #: templates/ns-template-sidebar-sub.php:23 #: templates/ns-template-sidebar.php:23 msgid "Support & Feature Requests" msgstr "" #: templates/ns-template-sidebar-sub.php:30 #: templates/ns-template-sidebar.php:44 msgid "Don't Miss Anything!" msgstr "" #: templates/ns-template-sidebar-sub.php:32 #: templates/ns-template-sidebar.php:46 msgid "Receive updates, beta invites, articles and more!" msgstr "" #: templates/ns-template-sidebar-sub.php:43 #: templates/ns-template-sidebar.php:113 msgid "Before you go..." msgstr "" #: templates/ns-template-sidebar-sub.php:45 #: templates/ns-template-sidebar.php:115 msgid "If you're going to open a support request, could you please copy the log urls listed below and paste them at the bottom of your support request so we can give you better and faster help? Thank you!" msgstr "" #: templates/ns-template-sidebar-sub.php:48 #: templates/ns-template-sidebar.php:118 msgid "(Please send privately, not on a forum - some sensitive info from your database could be included in the logs.)" msgstr "" #: templates/ns-template-sidebar-sub.php:52 #: templates/ns-template-sidebar.php:122 msgid "Continue to Support" msgstr "" #: templates/ns-template-sidebar.php:30 msgid "Do you like NS Cloner?" msgstr "" #: templates/ns-template-sidebar.php:33 msgid "If the Cloner has saved you lots of time, tell everyone with a 5-star rating!" msgstr "" #: templates/ns-template-sidebar.php:37 msgid "Rate it 5 Stars" msgstr "" #: templates/ns-template-sidebar.php:71 msgid "Highlighted Plugin" msgstr "" #: templates/ns-template-sidebar.php:94 msgid "Built by" msgstr "" #. translators: URL to plugin info page #: templates/ns-template-warnings.php:32 msgid "Your current version of <a href=\"%s\" target=\"_blank\">NS Cloner Pro</a> is not supported. Please update to access all Pro features." msgstr "" #: templates/ns-template-warnings.php:43 msgid "The free version of NS Cloner only works on WordPress Multisite." msgstr "" #. translators: URL to network cloner page #: templates/ns-template-warnings.php:47 msgid "The free version of NS Cloner only works as a Multisite Network plugin (<a href=\"%s\">go here to access the Network Cloner page</a>)." msgstr "" #. translators: URL to network plugins page #: templates/ns-template-warnings.php:53 msgid "The free version of NS Cloner only works as a Network Activated plugin. Go to <a href=\"%s\">Network Admin > Plugins</a> to activate it." msgstr "" #. translators: URL to plugin info page #: templates/ns-template-warnings.php:58 msgid "For cloning to and from single sites, check out <a href=\"%s\" target=\"_blank\">NS Cloner Pro</a>." msgstr "" #. translators: URL to network cloner page #: templates/ns-template-warnings.php:70 msgid "Just a heads up: the NS Cloner is most powerful and has additional features available when used as a Multisite Network plugin. You can <a href=\"%s\">go here to access the Network Cloner page</a>." msgstr "" #. translators: URL to network plugins page #: templates/ns-template-warnings.php:77 msgid "Just a heads up: the NS Cloner is most powerful and has additional features available as a Network Activated plugin. You can go to <a href=\"%s\">Network Admin > Plugins</a> to activate it." msgstr "" #. translators: %s: path to logs directory. #: templates/ns-template-warnings.php:90 msgid "The logs directory for NS Cloner (<code>%s</code>) is not writable by the server. The Cloner will still work, but logs won't be available in case anything needs debugging." msgstr "" #. translators: %d: max execution time in seconds. #: templates/ns-template-warnings.php:104 msgid "This host's max_execution_time is set to %d seconds - we generally recommend at least 60 seconds for running the Cloner." msgstr "" #. translators: %d: max execution time in seconds. #: templates/ns-template-warnings.php:105 msgid "You may want to increase the max_execution_time in php.ini (or wherever your host supports PHP configuration updates) to avoid any timeout errors." msgstr "" #. translators: %d: memory limit in megabytes. #: templates/ns-template-warnings.php:114 msgid "This host's memory_limit is set to %dMB - we generally recommend at least 128MB for running the Cloner." msgstr "" #. translators: %d: memory limit in megabytes. #: templates/ns-template-warnings.php:115 msgid "You may want to increase the memory_limit in php.ini (or wherever your host supports PHP configuration updates) to avoid any out-of-memory errors." msgstr "" #. translators: %s: url to network setup page. #: templates/ns-template-warnings.php:139 msgid "Please check the recommended htaccess settings <a href=\"%s\" target=\"_blank\">here</a> and make sure your .htaccess file matches." msgstr "" readme.txt 0000644 00000030072 15132706043 0006545 0 ustar 00 === NS Cloner - Site Copier === Contributors: neversettle Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=53JXD4ENC8MM2&rm=2 Tags: automate, duplicate, copy, copier, clone, cloner, multisite, network, template Requires at least: 4.0.0 Tested up to: 5.8 Requires PHP: 7.0 Stable tag: 4.1.9.3 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html The NS Cloner saves multisite admins and developers TONS of time by cloning existing sites in a multisite network to a completely new site in a few seconds. == Description == This is by far the easiest, fastest, and most user-friendly way you will ever create fully configured sites on your multisite networks. The NS Cloner will take any existing site on your WordPress multisite network and clone it into a new site that is completely identical in theme & theme settings, plugins & plugin configurations, content, pictures, videos, and site settings. Everything is preserved and intelligent replacements are made so that the new site settings reflect your choices for the name and title, and have automatic URL replacements and other background updates to make sure the new site works exactly the same way as if you had taken the time to set it all up manually. **Important:** this plugin *only* works with WordPress Multisite (although the pro version works for single sites as well). You will find its menu in your network administration dashboard (wp-admin/network). = Typical Workflow for using the NS Cloner = 1. Set up 1 or more sites exactly the way you want your clones to start out. 2. Go to your Network Dashboard > NS Cloner. 3. Select the site you that want to clone, and enter the desired URL and title of the new site. 4. Clone away with one click! Yes, it really is that easy. = Primary Use Cases = * Developers who host and manage multiple client sites in their own multisite environment - this will allow you to rapidly roll out new baseline sites with all your favorite standard plugins and configurations in place. No more tedious manual repetitive entry! * Designers who want to be able to create several versions of sites to test and play with different theme designs in parallel, without wasting time with unnecessary duplication. * Teams who want to have a quick way to set up staging sites for collaboration, or effortlessly duplicate content for regional versions of sites, etc. * Organizations which provide "member" sites and want to be able to reduce the site spin up time to almost nothing. * Affiliates that host numerous sites through multisite and are looking for a way to increase reach and decrease deployment times. == Features == = Core Features = * Copies an entire site in seconds * Works in subdomain or subdirectory mode * Copies all widgets, menus, and theme and plugin settings * Copies all pages, posts, custom post types and taxonomies * Copies all uploaded media files and associated data * Works in the background to avoid timeouts or memory shortages on large sites * You can close your tab without interrupting cloning, or stay and watch the progress live * Advanced validation and preemptive issue detection * Robust process logging to help with troubleshooting * Hook-rich cloning pipeline for developers to extend * Translation ready = Pro Features = For even more powerful functionality, [check out NS Cloner Pro](https://neversettle.it/buy/wordpress-plugins/ns-cloner-pro/). In addition to all the free core features, Pro includes: * **Teleport** *(new)* - remote cloning power: clone a subsite to a remote network, or even teleport an entire multisite network to a remote location. * **Single Site** *(new)* - gain the ability to clone standard single sites, not just multisite, and even clone between single and multisite or vice versa. * **WP CLI Addon** *(new)* - easily copy sites directly from the command line. * **Search & Replace** - perform unlimited, effortless custom search and replace on cloned content. * **Table Manager** - easily manage exactly which database tables are cloned. * **Users Cloning** - ability to clone all WordPress users and their permissions, or instantly create new users for cloned sites. * **Presets** - save commonly used cloning settings as shortcuts for even ore time savings. == Installation == 1. Log in to your WordPress network as a multisite super admin and go to /wp-admin/network 2. Use the Dashboard > Plugins > Add New tools to install NS Cloner from the WordPress.org repository or install by uploading the zip file 3. Network Activate the NS Cloner through the 'Plugins' menu in WordPress 4. Access the NS Cloner from its main menu on the Network Dashboard (/wp-admin/network) = Standard Precautions and Notes = * Unlike some other tools, NS Cloner supports cloning the root site (ID=1). When cloning the root site, the Cloner will automatically exclude all global network WordPress tables (like wp_blogs) as well as global tables for some common network plugins like BuddyPress. It's impossible, though, for the Cloner to recognize every network-level table for every plugin out there, so it's possible that some network-level plugin tables could be copied by the Cloner incorrectly, which could result in issues, depending on the plugin. The table manager add-on included in pro is perfect for unique scenarios where you need total table-level cloning control. * We always try to help (and you can see the proof of that in the plugin support forum here), but we cannot promise support to users for this free version, especially with issues resulting from non-standard environments. * We have used the NS Cloner on production systems for years without issues. That doesn't mean your scenario won't find some new condition that could cause you some headaches. Unlikely, but always possible. We recommend getting familiar with it on a test system before you deploy it to a critical network. * And for the love - backup your data. This plugin operates at the database level to work its magic. We've run it hundreds of times on our own sites and client sites, and tested it thoroughly. It's safe. But don't take our word for it. == Frequently Asked Questions == = How do I contact support, provide feedback, or make a feature request? = You can browse our Knowledge Base, add or vote on Feature Requests, or contact us with an issue at [support.neversettle.it](http://support.neversettle.it/) = Where can I find more documentation? = [See these articles](https://neversettle.it/documentation/ns-cloner/) for additional information on using NS Cloner. = What exactly does the NS Cloner copy? = The Cloner copies everything you need to have a totally identical twin site: all media uploads, posts, pages, custom post types, taxonomies, comments, menus, WordPress options, theme and plugin settings (including which ones are active). Users and roles are not copied (that's a pro feature), and theme/plugin files are not copied because the same files are shared by the whole multisite network, so there's no need to copy them when cloning inside a network. = Can I clone an individual site that's not part of a network (non-multisite)? = That is a pro feature - so, yes! With Pro you can easily clone a single WordPress site to another single site. You can even clone a site out of a network to its own individual install or vice versa. = What happens if my site is really large? = You're in luck! NS Cloner V4 has new background cloning capability, so you should be able to clone a site of almost any size without running into a "white screen of death" from timeouts or memory limits. You can even close your browser and come back to check on it later without interrupting the clone! == Screenshots == 1. Main cloning options. 2. Cloning in progress. == Changelog == = 4.1.9.3 - 2022.01.06 = * Optimize with reduction of unnecessary all hook when not cloning = 4.1.9.2 - 2022.01.03 = * Fix compatibility issue with WP Simple Pay = 4.1.9.1 - 2021.12.23 = * Optimize performance by preventing initialization for non-admin requests * Fix unnecessary object cache flushes and add filter to disable entirely = 4.1.8 - 2021.09.30 = * Optimize WP site list for networks with large numbers of sites * Add proactive resolution attempts for duplicate option keys during cloning * Fix misc. other plugin compatibility issues = 4.1.7 - 2021.09.02 = * Apply styling tweaks to admin interface * Fix bug with networks where the root/main blog ID is not equal to 1 * Fix bug with "Delete All Plugin Data" reset button not working fully * Fix compatibility issue with Collisimo Shipping Methods plugin = 4.1.6 - 2021.05.31 = * Update composer dependencies for PHP 8 compatibility = 4.1.5.3 - 2021.02.10 = * Fix compatibility error with SEO by Rank Math Pro = 4.1.5.2 - 2021.02.03 = * Fix bug with new site title not being applied after cloning = 4.1.5.1 - 2021.02.02 = * Fix slug change that broke compatibility with pro version = 4.1.5 - 2021.01.31 = * Add wp_cache_flush() call to resolve object caching issues * Add option to clear plugin data for stuck processes * Update internationalization to follow WP recommendations * Fix misc. warnings, typos = 4.1.4 - 2020.12.30 = * Fix visibility error on magic wakeup method * Fix cache clearing mechanism for WP Engine sites * Fix conflict with Woo Discount Rules = 4.1.3 - 2020.11.17 = * Add new options to help avoid database view / constraint errors * Make compatible with pro SFTP transfer feature * Fix inefficient database calls, unresponsive analytics setting UI = 4.1.0 - 2020.09.25 = * Add productivity statistics capture and analytics * Fix jQuery 1.8 compatibility, debug notices, more misc. bugfixes = 4.0.9 - 2020.06.15 = * Add new performance control options * Simplify and improve new site URL validation * Fix handling for memory limit of -1 * Fix compatibility issue with Yoast WP SEO * Fix other bugs with stalled clone recovery, notices from options table, etc. = 4.0.8 - 2020.06.11 = * Add automatic cache flush after cloning * Add new filters for performance tweaking and search/replace control * Fix upload_path replacement for root site with hardcoded upload_path * Fix sites with non-latin chars in site title being unavailable for cloning * Fix other bugs with failed finishes, database prefix irregularities, etc. = 4.0.7 - 2020.01.30 = * Fix non-prefixed custom tables being included in root site clone * Fix private/public blog property not being reflected on cloned sites = 4.0.6 - 2020.01.13 = * Update admin styles for WP 5.3 UI changes * Add new recovery capability for stalled cloning processes * Fix bugs with serialized search/replace updates, unnecessary sitemeta cloning = 4.0.5 - 2019.10.17 = * Enable number-only site names * Add automatic cache-flush at end of cloning for WPEngine sites * Fix memory/time overload when queueing very large tables * Fix misc. plugin compatibility issues = 4.0.4 - 2019.09.02 = * Fix database handling for null values * Fix fatal site creation error in pre-5.1 WordPress * Fix error on servers that don't allow multiple SQL statements in one query * Fix misc other bugs and plugin compatibility issues = 4.0.3 - 2019.08.19 = * Fix missing rows due to lost insert or incorrect row query * Fix max_allowed_packet database error = 4.0.2 - 2019.08.15 = * Fix timing conflicts for cleanup tasks. * Fix issue where process would keep running after manually cancelling. * Rewrite row processing class for much better performance and fewer queries. * Add fallback AJAX process dispatching for environments where background requests stall. * Add queue batching for large tables. * Improve debug logging. = 4.0.1 - 2019.07.26 = * Fix lock timing on background processes to prevent frozen or conflicting processes. * Fix handling for SQL views - exclude from table cloning and create at end instead. * Fix empty target site url caused by object caching on some servers. = 4.0.0 - 2019.07.22 = * Release all new rebuilt V4. = Pre V4.0 - see changelog.txt = == Upgrade Notice == = 4.0.0 = All new V4, with upgrades to everything - enhanced stability, power, interface and features. sections/class-ns-cloner-section-create-target.php 0000644 00000005060 15132706043 0016300 0 ustar 00 <?php /** * Create Target Section Class * * @package NS_Cloner */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Class NS_Cloner_Section_Create_Target * * Adds and validates options for url and title of the new subsite to be created. */ class NS_Cloner_Section_Create_Target extends NS_Cloner_Section { /** * Mode ids that this section should be visible and active for. * * @var array */ public $modes_supported = array( 'core' ); /** * DOM id for section box. * * @var string */ public $id = 'create_target'; /** * Priority relative to other section boxes in UI. * * @var int */ public $ui_priority = 300; /** * Output content for section settings box on admin page. */ public function render() { if ( ! is_multisite() ) { return; } $this->open_section_box( __( 'Create New Site', 'ns-cloner-site-copier' ), __( 'Create Site', 'ns-cloner-site-copier' ) ); ?> <h5><label for="target_title"><?php esc_html_e( 'Give the target site a title', 'ns-cloner-site-copier' ); ?></label></h5> <div class="ns-cloner-input-group"> <input type="text" name="target_title" placeholder="<?php esc_attr_e( 'New Site Title', 'ns-cloner-site-copier' ); ?>" data-label="<?php esc_attr_e( 'Site title', 'ns-cloner-site-copier' ); ?>" data-required="1" /> </div> <h5><label for="target_name"><?php esc_html_e( 'Give the target site a URL', 'ns-cloner-site-copier' ); ?></label></h5> <div class="ns-cloner-input-group"> <?php if ( is_subdomain_install() ) : ?> <label><?php echo is_ssl() ? 'https://' : 'http://'; ?></label> <input type="text" name="target_name" class="ns-cloner-quick-validate" data-label="<?php esc_attr_e( 'Site URL', 'ns-cloner-site-copier' ); ?>" /> <label>.<?php echo esc_html( preg_replace( '|^www\.|', '', get_current_site()->domain ) ); ?></label> <?php else : ?> <label><?php echo esc_url( trailingslashit( site_url() ) ); ?></label> <input type="text" name="target_name" class="ns-cloner-quick-validate" data-label="<?php esc_attr_e( 'Site URL', 'ns-cloner-site-copier' ); ?>" /> <?php endif; ?> </div> <?php $this->close_section_box(); } /** * Check ns_cloner_request() and any validation error messages to $this->errors. */ public function validate() { $site_errors = ns_wp_validate_site( ns_cloner_request()->get( 'target_name' ), ns_cloner_request()->get( 'target_title' ) ); foreach ( $site_errors as $error ) { $this->errors[] = $error; } } } sections/class-ns-cloner-section-advertise-pro.php 0000644 00000007460 15132706043 0016343 0 ustar 00 <?php /** * Advertise Pro Section Class * * @package NS_Cloner */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Class NS_Cloner_Section_Advertise_Pro * * Add several dummy sections to advertise Pro features. */ class NS_Cloner_Section_Advertise_Pro extends NS_Cloner_Section { /** * Mode ids that this section should be visible and active for. * * @var array */ public $modes_supported = [ 'core' ]; /** * DOM id for section box. * * @var string */ public $id = 'advertise_pro'; /** * Priority relative to other section boxes in UI. * * @var int */ public $ui_priority = 750; /** * Output content for section settings box on admin page. */ public function render() { // Tables. $this->open_section_box( __( 'Copy Tables', 'ns-cloner-site-copier' ) ); echo '<p>'; esc_html_e( 'All database tables will be copied by default. ', 'ns-cloner-site-copier' ); printf( wp_kses( /* translators: URL to plugin info page */ __( 'For more efficiency and precise control over which tables are cloned, check out <a href="%s" target="_blank">NS Cloner Pro</a>.', 'ns-cloner-site-copier' ), ns_wp_kses_allowed() ), esc_url( NS_CLONER_PRO_URL ) ); echo '</p>'; $this->close_section_box(); // Post types. $this->open_section_box( __( 'Post Types', 'ns-cloner-site-copier' ) ); echo '<p>'; esc_html_e( 'All post types will be copied by default. ', 'ns-cloner-site-copier' ); printf( wp_kses( /* translators: URL to plugin info page */ __( 'With <a href="%s" target="_blank">NS Cloner Pro</a> you can customize which post types are cloned, giving you even more powerful flexibility.', 'ns-cloner-site-copier' ), ns_wp_kses_allowed() ), esc_url( NS_CLONER_PRO_URL ) ); echo '</p>'; $this->close_section_box(); // Search and replace. $this->open_section_box( __( 'Search and Replace', 'ns-cloner-site-copier' ) ); echo '<p>'; esc_html_e( 'By default, the site name and URL will be replaced in all cloned content and settings. ', 'ns-cloner-site-copier' ); printf( wp_kses( /* translators: URL to plugin info page */ __( ' <a href="%s" target="_blank">NS Cloner Pro</a> offers the ability to perform an unlimited number of additional custom search and replace operations.', 'ns-cloner-site-copier' ), ns_wp_kses_allowed() ), esc_url( NS_CLONER_PRO_URL ) ); echo '</p>'; $this->close_section_box(); // Users. $this->open_section_box( __( 'Copy Users', 'ns-cloner-site-copier' ) ); echo '<p>'; esc_html_e( 'By default, just the current admin user (you) will be automatically added as a user on the new site. ', 'ns-cloner-site-copier' ); printf( wp_kses( /* translators: URL to plugin info page */ __( 'With <a href="%s" target="_blank">NS Cloner Pro</a> you can auto-generate new admin users, as well as have the option to clone all the existing users.', 'ns-cloner-site-copier' ), ns_wp_kses_allowed() ), esc_url( NS_CLONER_PRO_URL ) ); echo '</p>'; $this->close_section_box(); // Media files. $this->open_section_box( __( 'Copy Media Files', 'ns-cloner-site-copier' ) ); echo '<p>'; esc_html_e( 'By default, all media library files will be copied by default to the new site, and links referring to them updated. ', 'ns-cloner-site-copier' ); printf( wp_kses( /* translators: URL to plugin info page */ __( '<a href="%s" target="_blank">NS Cloner Pro</a> enables you to control uploads cloning, so your cloned site could optionally continue to refer to the source site\'s media files.', 'ns-cloner-site-copier' ), ns_wp_kses_allowed() ), esc_url( NS_CLONER_PRO_URL ) ); echo '</p>'; $this->close_section_box(); } } sections/class-ns-cloner-section-additional-settings.php 0000644 00000013103 15132706043 0017514 0 ustar 00 <?php /** * Additional Settings Section class * * @package NS_Cloner */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Class NS_Cloner_Section_Additional_Settings * * Adds extra settings box to all modes (checkbox to enable additional detailed debug logging, etc. */ class NS_Cloner_Section_Additional_Settings extends NS_Cloner_Section { /** * Mode ids that this section should be visible and active for. * * @var array */ public $modes_supported = [ 'core', 'clone_over', 'search_replace', 'clone_teleport' ]; /** * DOM id for section box. * * @var string */ public $id = 'additional_settings'; /** * Priority relative to other section boxes in UI. * * @var int */ public $ui_priority = 1000; /** * Do any setup before starting the cloning process (like hooks to modify the process). */ public function process_init() { add_filter( 'ns_cloner_rows_per_query', [ $this, 'filter_rows_per_query' ] ); add_filter( 'ns_cloner_progress_update_interval', [ $this, 'filter_progress_update_interval' ] ); add_filter( 'ns_cloner_skip_views', [ $this, 'filter_skip_views' ] ); add_filter( 'ns_cloner_skip_constraints', [ $this, 'filter_skip_constraints' ] ); } /** * Output content for section settings box on admin page. */ public function render() { $this->open_section_box( __( 'Additional Settings', 'ns-cloner-site-copier' ) ); ?> <h5><?php esc_html_e( 'Debugging', 'ns-cloner-site-copier' ); ?></h5> <label> <input type="checkbox" name="debug" /> <?php esc_html_e( 'Enable logging', 'ns-cloner-site-copier' ); ?> </label> <p class="description"> <strong> <?php esc_html_e( 'Logs may contain sensitive information from your database.', 'ns-cloner-site-copier' ); ?> <?php esc_html_e( 'If you enable logging, it\'s recommended to go to NS Cloner > Logs and clear your logs when you are finished.', 'ns-cloner-site-copier' ); ?> </strong> </p> <h5><?php esc_html_e( 'Performance', 'ns-cloner-site-copier' ); ?></h5> <div class="ns-cloner-input-group"> <label class="before"><?php esc_html_e( 'Rows per query', 'ns-cloner-site-copier' ); ?></label> <input type="number" name="rows_per_query" placeholder="50" /> </div> <p class="description"> <?php esc_html_e( 'This controls how many database records will be copied at one time.', 'ns-cloner-site-copier' ); ?> <?php esc_html_e( 'You can make cloning faster by increasing this number, but if it\'s too large for your server to handle you\'ll see SQL errors and need to reduce this setting again.', 'ns-cloner-site-copier' ); ?> </p> <div class="ns-cloner-input-group"> <label class="before"><?php esc_html_e( 'Progress update interval', 'ns-cloner-site-copier' ); ?></label> <input type="number" name="progress_update_interval" placeholder="5" /> </div> <p class="description"> <?php esc_html_e( 'This is the number of items (rows or files) to clone in between updating the progress values.', 'ns-cloner-site-copier' ); ?> <?php esc_html_e( 'You can make cloning faster by increasing this number, but the higher it is the more jumpy and less smooth/accurate the progress bar will be.', 'ns-cloner-site-copier' ); ?> </p> <h5><?php esc_html_e( 'Database', 'ns-cloner-site-copier' ); ?></h5> <label> <input type="checkbox" name="skip_views"/> <?php esc_html_e( 'Skip views?', 'ns-cloner-site-copier' ); ?> </label> <p class="description"> <strong> <?php esc_html_e( 'This will prevent attempting to clone any SQL views along with tables, which can be required by plugins but can sometimes result in permissions errors.', 'ns-cloner-site-copier' ); ?> </strong> </p> <label> <input type="checkbox" name="skip_constraints"/> <?php esc_html_e( 'Skip constraints?', 'ns-cloner-site-copier' ); ?> </label> <p class="description"> <strong> <?php esc_html_e( 'This will prevent trying to re-apply any SQL constraints to cloned tables, which help ensure data integrity but can sometimes result in permissions errors.', 'ns-cloner-site-copier' ); ?> </strong> </p> <?php $this->close_section_box(); } /** * Adjust the number of records to include in a single query. * * @param int $default Number of rows. * @return int */ public function filter_rows_per_query( $default ) { $custom = (int) ns_cloner_request()->get( 'rows_per_query' ); return $custom > 0 ? $custom : $default; } /** * Adjust the number of items to clone in between updating progress. * * @param int $default Number of items. * @return int */ public function filter_progress_update_interval( $default ) { $custom = (int) ns_cloner_request()->get( 'progress_update_interval' ); return $custom > 0 ? $custom : $default; } /** * Apply checkbox value to whether to skip SQL views when cloning tables. * * @param bool $default Whether to skip * @return bool */ public function filter_skip_views( $default ) { return (bool) ns_cloner_request()->get( 'skip_views', false ); } /** * Apply checkbox value to whether to skip re-applying SQL constraints to cloned tables. * * @param bool $default * @return bool */ public function filter_skip_constraints( $default ) { return (bool) ns_cloner_request()->get( 'skip_constraints', false ); } } sections/class-ns-cloner-section-select-source.php 0000644 00000005743 15132706043 0016336 0 ustar 00 <?php /** * Select Source Section Class * * @package NS_Cloner */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Class NS_Cloner_Section_Select_Source * * Adds settings section for selecting source site to clone from. */ class NS_Cloner_Section_Select_Source extends NS_Cloner_Section { /** * Mode ids that this section should be visible and active for. * * @var array */ public $modes_supported = [ 'core', 'clone_over', 'clone_teleport' ]; /** * DOM id for section box. * * @var string */ public $id = 'select_source'; /** * Priority relative to other section boxes in UI. * * @var int */ public $ui_priority = 200; /** * Output content for section settings box on admin page. */ public function render() { $this->open_section_box( __( 'Select Source', 'ns-cloner-site-copier' ), __( 'Select Source', 'ns-cloner-site-copier' ) ); if ( ! is_multisite() ) { ?> <h5><?php esc_html_e( 'The cloning source is set to the current site.', 'ns-cloner-site-copier' ); ?></h5> <p><?php esc_html_e( 'This is configurable for WordPress multisite, but here you only have one site installed to choose from, so it\'s been automatically selected for you.', 'ns-cloner-site-copier' ); ?></p> <?php } elseif ( ! is_network_admin() ) { ?> <h5><?php esc_html_e( 'The cloning source is set to the current site.', 'ns-cloner-site-copier' ); ?></h5> <p><?php esc_html_e( 'You can use this plugin in Network mode to choose from other source sites.', 'ns-cloner-site-copier' ); ?></p> <select name="source_id" class="ns-cloner-site-select no-chosen" style="display:none"> <option value="<?php echo esc_attr( get_current_blog_id() ); ?>"></option> </select> <?php } else { ?> <h5><?php esc_html_e( 'Select a site to clone', 'ns-cloner-site-copier' ); ?></h5> <select name="source_id" class="ns-cloner-site-select"> <?php foreach ( ns_wp_get_sites_list() as $id => $label ) : ?> <?php // Pre-select saved 'default' template if applicable. $saved = get_site_option( 'ns_cloner_default_template' ); // Enable GET source var to override default, used by quick clone links on network sites page. $default = ns_cloner_request()->get( 'source', $saved ); ?> <option value="<?php echo esc_attr( $id ); ?>" <?php echo selected( esc_attr( $id ), $default ); ?>> <?php echo $label; // Don't escape this with esc_html b/c non-latin chars can result in totally empty string. ?> </option> <?php endforeach; ?> </select> <p class="description ns-cloner-clear"> <?php esc_html_e( 'Choose an existing source site to clone.' ); ?> <?php esc_html_e( 'If you haven\'t already, now is a great time to set up a "template" site exactly the way you want the new clone site to start out (theme, plugins, settings, etc.).', 'ns-cloner-site-copier' ); ?> </p> <?php } $this->close_section_box(); } } changelog.txt 0000644 00000025754 15132706043 0007252 0 ustar 00 = 4.1.9.3 - 2022.01.06 = * Optimize with reduction of unnecessary all hook when not cloning = 4.1.9.2 - 2022.01.03 = * Fix compatibility issue with WP Simple Pay = 4.1.9.1 - 2021.12.23 = * Optimize performance by preventing initialization for non-admin requests * Fix unnecessary object cache flushes and add filter to disable entirely = 4.1.8 - 2021.09.30 = * Optimize WP site list for networks with large numbers of sites * Add proactive resolution attempts for duplicate option keys during cloning * Fix misc. other plugin compatibility issues = 4.1.7 - 2021.09.02 = * Apply styling tweaks to admin interface * Fix bug with networks where the root/main blog ID is not equal to 1 * Fix bug with "Delete All Plugin Data" reset button not working fully * Fix compatibility issue with Collisimo Shipping Methods plugin = 4.1.6 - 2021.05.31 = * Update composer dependencies for PHP 8 compatibility = 4.1.5.3 - 2021.02.10 = * Fix compatibility error with SEO by Rank Math Pro = 4.1.5.2 - 2021.02.03 = * Fix bug with new site title not being applied after cloning = 4.1.5.1 - 2021.02.02 = * Fix slug change that broke compatibility with pro version = 4.1.5 - 2021.01.31 = * Add wp_cache_flush() call to resolve object caching issues * Add option to clear plugin data for stuck processes * Update internationalization to follow WP recommendations * Fix misc. warnings, typos = 4.1.4 - 2020.12.30 = * Fix visibility error on magic wakeup method * Fix cache clearing mechanism for WP Engine sites * Fix conflict with Woo Discount Rules = 4.1.3 - 2020.11.17 = * Add new options to help avoid database view / constraint errors * Make compatible with pro SFTP transfer feature * Fix inefficient database calls, unresponsive analytics setting UI = 4.1.0 - 2020.09.25 = * Add productivity statistics capture and analytics * Fix jQuery 1.8 compatibility, debug notices, more misc. bugfixes = 4.0.9 - 2020.06.15 = * Add new performance control options * Simplify and improve new site URL validation * Fix handling for memory limit of -1 * Fix compatibility issue with Yoast WP SEO * Fix other bugs with stalled clone recovery, notices from options table, etc. = 4.0.8 - 2020.06.11 = * Add automatic cache flush after cloning * Add new filters for performance tweaking and search/replace control * Fix upload_path replacement for root site with hardcoded upload_path * Fix sites with non-latin chars in site title being unavailable for cloning * Fix other bugs with failed finishes, database prefix irregularities, etc. = 4.0.7 - 2020.01.30 = * Fix non-prefixed custom tables being included in root site clone * Fix private/public blog property not being reflected on cloned sites = 4.0.6 - 2020.01.13 = * Update admin styles for WP 5.3 UI changes * Add new recovery capability for stalled cloning processes * Fix bugs with serialized search/replace updates, unnecessary sitemeta cloning = 4.0.5 - 2019.10.17 = * Enable number-only site names * Add automatic cache-flush at end of cloning for WPEngine sites * Fix memory/time overload when queueing very large tables * Fix misc. plugin compatibility issues = 4.0.4 - 2019.09.02 = * Fix database handling for null values * Fix fatal site creation error in pre-5.1 WordPress * Fix error on servers that don't allow multiple SQL statements in one query * Fix misc other bugs and plugin compatibility issues = 4.0.3 - 2019.08.19 = * Fix missing rows due to lost insert or incorrect row query * Fix max_allowed_packet database error = 4.0.2 - 2019.08.15 = * Fix timing conflicts for cleanup tasks. * Fix issue where process would keep running after manually cancelling. * Rewrite row processing class for much better performance and fewer queries. * Add fallback AJAX process dispatching for environments where background requests stall. * Add queue batching for large tables. * Improve debug logging. = 4.0.1 - 2019.07.26 = * Fix lock timing on background processes to prevent frozen or conflicting processes. * Fix handling for SQL views - exclude from table cloning and create at end instead. * Fix empty target site url caused by object caching on some servers. = 4.0.0 - 2019.07.22 = * Release all new rebuilt V4. = 3.0.7 = * Replaced deprecated wp_get_sites() with get_sites() = 3.0.6.0 = * Fixed an issue where some serial arrays get treated as objects instead of arrays and search/replace was getting missed * Updated Kint library to resolve issues on some rare environments running OPCache and XCache = 3.0.5.9 = * Updated PHP 7 compatibility to use proper global variable variable emulation = 3.0.5.8 = * Fixed bug with search and replace preventing multiple replacements in rare cases where the search is different but the replace value is the same. = 3.0.5.7 = * Added new feature to save default site template for re-use in cloning every time = 3.0.5.6 = * Update to prevent kint classes from causing fatal error when autoloaded by another plugin or tool = 3.0.5.5 = * Update to work around WP version changes that prevent site names with dashes in the wpmu_validate_blog_signup() check = 3.0.5.4 = * Fixed issue with latest version of WP where a test validation site name containing only numbers is no longer valid = 3.0.5.3 = * Small formatting fix to sidebar * Fixed php Notice: Undefined variable: query when WP_DEBUG is true under certain conditions * Updated README = 3.0.5.2 = * Fixed mysql errors for unquoted numeric strings and empty values = 3.0.5.1 = * Fixed INSERT logic bug that resulted in some rows not being copied * Fixed extra characters in sites cloned via quick clone link * Better javascript error reporting = 3.0.5 = * Refactored MySQL INSERT commands to increase performance and resolve duplicate value issues with several plugins * Added better MySQL CONSTRAINT handling to fix compatibility issues with several plugins * Added fix for sites using the Wishlist Member plugin = 3.0.4.9 = * Fixed title replacement bug = 3.0.4.8 = * Fixed one-click cloning issue * Fixed a few bugs relating to upload paths and replacements = 3.0.4.7 = * Added WP 4.1 compatibility status * Added additional error handling for systems that can't read external feeds for the sidebar = 3.0.4.6 = * Added compatibility fix for CSS & Javascript Toolbox plugin = 3.0.4.5 = * Adding compatibility fix for User Access Manager plugin * Removed site title find/replace functionality = 3.0.4.4 = * Added support for new feature and setting in Content and Users Add-on to send notifications to new users = 3.0.4.3 = * Added another condition on ensuring kintParser is not already loaded from somewhere else = 3.0.4.2 = * Added condition to only load Kint (used for logging) if no other plugin already has = 3.0.4.1 = * Fixed minor issue and removed [[ *Notice*: Undefined variable: default_db_creds ]] showing up with WP_DEBUG turned on * Corrected mismatched version between plugin and logs * Added basic, disabled feature for emailing new users with site login and password (not currently active - primarily preparation for a new Registration Templates Add-on feature and option) = 3.0.4 = * Added one-click cloning from Manage Sites page * Added pre WP 3.7 compatibility * New search selector for source sites * Revamped logs for better utility/readability * Centralized ns_cloner_addon class for maintability = 3.0.3.1 = * Fixed bug introduced in 3.0.3 affecting subdirectory mode = 3.0.3 = * Added exception for subsite names to include dashes * Updates to support new Registration Templates add-on = 3.0.2 = * Fixed conflicts with some other multisite plugins that were triggering validation errors when attempting a clone * Raised number of sites shown by default in "Select Source" dropdown from 100 to 1000 and made parameters for that query filterable = 3.0.1 = * Fixed www vs. non-www issue on subdomain installs that were using www and generating sites like site.www.domain.com * Added robust new detection system for identifying WP version and uploads location even under abnormal edge cases * Added advanced validation and preemptive issue detection * Added robust system configuration and action logging to help with troubleshooting * Added All new Custom Add-on Architecture * Added All new hook-rich cloning pipeline for developers to extend * Added All new dynamic, responsive admin interface = 2.1.4.9 = * Fixed several small bugs reported to support that impacted specific scenarios, configurations, and plugin combinations. = 2.1.4.8 = * Fixed bug that was causing UTF-8 and DB character encoding issues in some environments. Primarily affected non-English sites. = 2.1.4.7 = * Fixed critical bug that prevented user roles from getting cloned when cloning the ROOT site only = 2.1.4.6 = * Fixed critical bug that was causing incompatibilities with some plugins that install their own tables to the database and in some cases the cloning operation was leaving a single custom table behind in the clone. This primarily affected Calendar plugins or other plugins where the table name began with higher letters (a, b, c) after the prefix like wp_a*, wp_b*, wp_c* = 2.1.4.5 = * Added support for cloning the root site with ID 1 (YAY! PLEASE SEE STANDARD PRECAUTIONS AND NOTES ON DESCRIPTION PAGE) * Added support for WP Multisite when installed in a subdirectory rather than at the root of a domain (there were previously issues in this scenario) * Added validation to enforce lowercase and only allowed characters in the site name field * Added validation to enforce replacement rules that aren't always obvious (you don't want the old site name to be contained in the new site domain or the cloner's automated data replacement will corrupt your new clone's data) * Fixed permalink bug in subdirectory mode * Updated the way the status is returned after cloning to fix issues where the status exceeds URL length restrictions * [EXPERIMENTAL] Added support for the ThreeWP Broadcast plugin based on user contribution (thank you John @ propanestudio.com and Aamir!) * Many other small tweaks, updates, and fixes = 2.1.4.4 = * Enhanced media file copy handling from 2.1.4.3 = 2.1.4.3 = * Added better media file copy handling in cases where themes or plugins alter wp_upload_dir() and it is returning bad paths = 2.1.4.2 = * Fixed bug reported by Christian (Thank you!) where some upload file paths containing the same numbers as site IDs were getting mangled = 2.1.4.1 = * Fixed 2.1.4 to make file copies compatible with the new uploads structure in native WP 3.5 installs * ANNOUNCING NS Cloner Pro is now Available [HERE](https://neversettle.iljmp.com/1/ns-cloner-pro) = 2.1.4 = * Fixed bug in 2.1.3 that caused file copies to fail in some cases where the target folders already existed = 2.1.3 = * Fixed bug in 2.1.2 that forced subdirectory mode = 2.1.2 = * Added Auto-detect of Multisite mode and Subdirectory site support! * Added Automatic Copy of all media files in blogs.dir/## * Fixed some image loading fails in certain scenarios = 2.1.1 = * First public release images/ns-cloner-top-logo.png 0000644 00000013521 15132706043 0012160 0 ustar 00 �PNG IHDR >