Version Description
Download this release
Release Info
Developer | phpaddicted |
Plugin | RSS Post Importer |
Version | 2.0.2 |
Comparing to | |
See all releases |
Code changes from version 2.0.1 to 2.0.2
- app/assets/css/style.css +36 -25
- app/class-rss-post-importer.php +127 -123
- app/classes/admin/class-rss-pi-admin-processor.php +214 -213
- app/classes/admin/class-rss-pi-admin.php +232 -173
- app/classes/front/class-rss-pi-front.php +66 -0
- app/classes/import/class-rss-pi-engine.php +374 -365
- app/templates/feed-table-row.php +129 -94
- app/templates/settings-table.php +171 -155
- index.php +67 -64
- readme.txt +9 -3
app/assets/css/style.css
CHANGED
@@ -1,25 +1,36 @@
|
|
1 |
-
/*!
|
2 |
-
* Font Awesome 3.2.1
|
3 |
-
* the iconic font designed for Bootstrap
|
4 |
-
* ------------------------------------------------------------------------------
|
5 |
-
* The full suite of pictographic icons, examples, and documentation can be
|
6 |
-
* found at http://fontawesome.io. Stay up to date on Twitter at
|
7 |
-
* http://twitter.com/fontawesome.
|
8 |
-
*
|
9 |
-
* License
|
10 |
-
* ------------------------------------------------------------------------------
|
11 |
-
* - The Font Awesome font is licensed under SIL OFL 1.1 -
|
12 |
-
* http://scripts.sil.org/OFL
|
13 |
-
* - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
|
14 |
-
* http://opensource.org/licenses/mit-license.html
|
15 |
-
* - Font Awesome documentation licensed under CC BY 3.0 -
|
16 |
-
* http://creativecommons.org/licenses/by/3.0/
|
17 |
-
* - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
|
18 |
-
* "Font Awesome by Dave Gandy - http://fontawesome.io"
|
19 |
-
*
|
20 |
-
* Author - Dave Gandy
|
21 |
-
* ------------------------------------------------------------------------------
|
22 |
-
* Email: dave@fontawesome.io
|
23 |
-
* Twitter: http://twitter.com/davegandy
|
24 |
-
* Work: Lead Product Designer @ Kyruus - http://kyruus.com
|
25 |
-
*/@font-face{font-family:FontAwesome;src:url(../font/fontawesome-webfont.eot?v=3.2.1);src:url(../font/fontawesome-webfont.eot?#iefix&v=3.2.1) format('embedded-opentype'),url(../font/fontawesome-webfont.woff?v=3.2.1) format('woff'),url(../font/fontawesome-webfont.ttf?v=3.2.1) format('truetype'),url(../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1) format('svg');font-weight:400;font-style:normal}[class^=icon-],[class*=" icon-"]{font-family:FontAwesome;font-weight:400;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;}[class^=icon-]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none}.icon-large:before{vertical-align:-10%;font-size:1.33333333em}a [class^=icon-],a [class*=" icon-"]{display:inline}[class^=icon-].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.14285714em;text-align:right;padding-right:.28571429em}[class^=icon-].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.42857143em}.icons-ul{margin-left:2.14285714em;list-style-type:none}.icons-ul>li{position:relative}.icons-ul .icon-li{position:absolute;left:-2.14285714em;width:2.14285714em;text-align:center;line-height:inherit}[class^=icon-].hide,[class*=" icon-"].hide{display:none}.icon-muted{color:#eee}.icon-light{color:#fff}.icon-dark{color:#333}.icon-border{border:solid 1px #eee;padding:.2em .25em .15em;-webkit-border-top-right-radius:3px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;border-top-right-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.icon-2x{font-size:2em}.icon-2x.icon-border{border-width:2px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.icon-3x{font-size:3em}.icon-3x.icon-border{border-width:3px;-webkit-border-top-right-radius:5px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;-moz-border-radius-topright:5px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;border-top-right-radius:5px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.icon-4x{font-size:4em}.icon-4x.icon-border{border-width:4px;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;border-top-right-radius:6px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.icon-5x{font-size:5em}.icon-5x.icon-border{border-width:5px;-webkit-border-top-right-radius:7px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;-moz-border-radius-topright:7px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;border-top-right-radius:7px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.pull-right{float:right}.pull-left{float:left}[class^=icon-].pull-left,[class*=" icon-"].pull-left{margin-right:.3em}[class^=icon-].pull-right,[class*=" icon-"].pull-right{margin-left:.3em}.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%}.icon-stack [class^=icon-],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;}.icon-stack .icon-stack-base{font-size:2em;}.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear}a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1)}.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2)}.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}.icon-flip-horizontal:before{-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.icon-flip-vertical:before{-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block}.icon-glass:before{content:"\f000"}.icon-music:before{content:"\f001"}.icon-search:before{content:"\f002"}.icon-envelope-alt:before{content:"\f003"}.icon-heart:before{content:"\f004"}.icon-star:before{content:"\f005"}.icon-star-empty:before{content:"\f006"}.icon-user:before{content:"\f007"}.icon-film:before{content:"\f008"}.icon-th-large:before{content:"\f009"}.icon-th:before{content:"\f00a"}.icon-th-list:before{content:"\f00b"}.icon-ok:before{content:"\f00c"}.icon-remove:before{content:"\f00d"}.icon-zoom-in:before{content:"\f00e"}.icon-zoom-out:before{content:"\f010"}.icon-power-off:before,.icon-off:before{content:"\f011"}.icon-signal:before{content:"\f012"}.icon-gear:before,.icon-cog:before{content:"\f013"}.icon-trash:before{content:"\f014"}.icon-home:before{content:"\f015"}.icon-file-alt:before{content:"\f016"}.icon-time:before{content:"\f017"}.icon-road:before{content:"\f018"}.icon-download-alt:before{content:"\f019"}.icon-download:before{content:"\f01a"}.icon-upload:before{content:"\f01b"}.icon-inbox:before{content:"\f01c"}.icon-play-circle:before{content:"\f01d"}.icon-rotate-right:before,.icon-repeat:before{content:"\f01e"}.icon-refresh:before{content:"\f021"}.icon-list-alt:before{content:"\f022"}.icon-lock:before{content:"\f023"}.icon-flag:before{content:"\f024"}.icon-headphones:before{content:"\f025"}.icon-volume-off:before{content:"\f026"}.icon-volume-down:before{content:"\f027"}.icon-volume-up:before{content:"\f028"}.icon-qrcode:before{content:"\f029"}.icon-barcode:before{content:"\f02a"}.icon-tag:before{content:"\f02b"}.icon-tags:before{content:"\f02c"}.icon-book:before{content:"\f02d"}.icon-bookmark:before{content:"\f02e"}.icon-print:before{content:"\f02f"}.icon-camera:before{content:"\f030"}.icon-font:before{content:"\f031"}.icon-bold:before{content:"\f032"}.icon-italic:before{content:"\f033"}.icon-text-height:before{content:"\f034"}.icon-text-width:before{content:"\f035"}.icon-align-left:before{content:"\f036"}.icon-align-center:before{content:"\f037"}.icon-align-right:before{content:"\f038"}.icon-align-justify:before{content:"\f039"}.icon-list:before{content:"\f03a"}.icon-indent-left:before{content:"\f03b"}.icon-indent-right:before{content:"\f03c"}.icon-facetime-video:before{content:"\f03d"}.icon-picture:before{content:"\f03e"}.icon-pencil:before{content:"\f040"}.icon-map-marker:before{content:"\f041"}.icon-adjust:before{content:"\f042"}.icon-tint:before{content:"\f043"}.icon-edit:before{content:"\f044"}.icon-share:before{content:"\f045"}.icon-check:before{content:"\f046"}.icon-move:before{content:"\f047"}.icon-step-backward:before{content:"\f048"}.icon-fast-backward:before{content:"\f049"}.icon-backward:before{content:"\f04a"}.icon-play:before{content:"\f04b"}.icon-pause:before{content:"\f04c"}.icon-stop:before{content:"\f04d"}.icon-forward:before{content:"\f04e"}.icon-fast-forward:before{content:"\f050"}.icon-step-forward:before{content:"\f051"}.icon-eject:before{content:"\f052"}.icon-chevron-left:before{content:"\f053"}.icon-chevron-right:before{content:"\f054"}.icon-plus-sign:before{content:"\f055"}.icon-minus-sign:before{content:"\f056"}.icon-remove-sign:before{content:"\f057"}.icon-ok-sign:before{content:"\f058"}.icon-question-sign:before{content:"\f059"}.icon-info-sign:before{content:"\f05a"}.icon-screenshot:before{content:"\f05b"}.icon-remove-circle:before{content:"\f05c"}.icon-ok-circle:before{content:"\f05d"}.icon-ban-circle:before{content:"\f05e"}.icon-arrow-left:before{content:"\f060"}.icon-arrow-right:before{content:"\f061"}.icon-arrow-up:before{content:"\f062"}.icon-arrow-down:before{content:"\f063"}.icon-mail-forward:before,.icon-share-alt:before{content:"\f064"}.icon-resize-full:before{content:"\f065"}.icon-resize-small:before{content:"\f066"}.icon-plus:before{content:"\f067"}.icon-minus:before{content:"\f068"}.icon-asterisk:before{content:"\f069"}.icon-exclamation-sign:before{content:"\f06a"}.icon-gift:before{content:"\f06b"}.icon-leaf:before{content:"\f06c"}.icon-fire:before{content:"\f06d"}.icon-eye-open:before{content:"\f06e"}.icon-eye-close:before{content:"\f070"}.icon-warning-sign:before{content:"\f071"}.icon-plane:before{content:"\f072"}.icon-calendar:before{content:"\f073"}.icon-random:before{content:"\f074"}.icon-comment:before{content:"\f075"}.icon-magnet:before{content:"\f076"}.icon-chevron-up:before{content:"\f077"}.icon-chevron-down:before{content:"\f078"}.icon-retweet:before{content:"\f079"}.icon-shopping-cart:before{content:"\f07a"}.icon-folder-close:before{content:"\f07b"}.icon-folder-open:before{content:"\f07c"}.icon-resize-vertical:before{content:"\f07d"}.icon-resize-horizontal:before{content:"\f07e"}.icon-bar-chart:before{content:"\f080"}.icon-twitter-sign:before{content:"\f081"}.icon-facebook-sign:before{content:"\f082"}.icon-camera-retro:before{content:"\f083"}.icon-key:before{content:"\f084"}.icon-gears:before,.icon-cogs:before{content:"\f085"}.icon-comments:before{content:"\f086"}.icon-thumbs-up-alt:before{content:"\f087"}.icon-thumbs-down-alt:before{content:"\f088"}.icon-star-half:before{content:"\f089"}.icon-heart-empty:before{content:"\f08a"}.icon-signout:before{content:"\f08b"}.icon-linkedin-sign:before{content:"\f08c"}.icon-pushpin:before{content:"\f08d"}.icon-external-link:before{content:"\f08e"}.icon-signin:before{content:"\f090"}.icon-trophy:before{content:"\f091"}.icon-github-sign:before{content:"\f092"}.icon-upload-alt:before{content:"\f093"}.icon-lemon:before{content:"\f094"}.icon-phone:before{content:"\f095"}.icon-unchecked:before,.icon-check-empty:before{content:"\f096"}.icon-bookmark-empty:before{content:"\f097"}.icon-phone-sign:before{content:"\f098"}.icon-twitter:before{content:"\f099"}.icon-facebook:before{content:"\f09a"}.icon-github:before{content:"\f09b"}.icon-unlock:before{content:"\f09c"}.icon-credit-card:before{content:"\f09d"}.icon-rss:before{content:"\f09e"}.icon-hdd:before{content:"\f0a0"}.icon-bullhorn:before{content:"\f0a1"}.icon-bell:before{content:"\f0a2"}.icon-certificate:before{content:"\f0a3"}.icon-hand-right:before{content:"\f0a4"}.icon-hand-left:before{content:"\f0a5"}.icon-hand-up:before{content:"\f0a6"}.icon-hand-down:before{content:"\f0a7"}.icon-circle-arrow-left:before{content:"\f0a8"}.icon-circle-arrow-right:before{content:"\f0a9"}.icon-circle-arrow-up:before{content:"\f0aa"}.icon-circle-arrow-down:before{content:"\f0ab"}.icon-globe:before{content:"\f0ac"}.icon-wrench:before{content:"\f0ad"}.icon-tasks:before{content:"\f0ae"}.icon-filter:before{content:"\f0b0"}.icon-briefcase:before{content:"\f0b1"}.icon-fullscreen:before{content:"\f0b2"}.icon-group:before{content:"\f0c0"}.icon-link:before{content:"\f0c1"}.icon-cloud:before{content:"\f0c2"}.icon-beaker:before{content:"\f0c3"}.icon-cut:before{content:"\f0c4"}.icon-copy:before{content:"\f0c5"}.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6"}.icon-save:before{content:"\f0c7"}.icon-sign-blank:before{content:"\f0c8"}.icon-reorder:before{content:"\f0c9"}.icon-list-ul:before{content:"\f0ca"}.icon-list-ol:before{content:"\f0cb"}.icon-strikethrough:before{content:"\f0cc"}.icon-underline:before{content:"\f0cd"}.icon-table:before{content:"\f0ce"}.icon-magic:before{content:"\f0d0"}.icon-truck:before{content:"\f0d1"}.icon-pinterest:before{content:"\f0d2"}.icon-pinterest-sign:before{content:"\f0d3"}.icon-google-plus-sign:before{content:"\f0d4"}.icon-google-plus:before{content:"\f0d5"}.icon-money:before{content:"\f0d6"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-columns:before{content:"\f0db"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-envelope:before{content:"\f0e0"}.icon-linkedin:before{content:"\f0e1"}.icon-rotate-left:before,.icon-undo:before{content:"\f0e2"}.icon-legal:before{content:"\f0e3"}.icon-dashboard:before{content:"\f0e4"}.icon-comment-alt:before{content:"\f0e5"}.icon-comments-alt:before{content:"\f0e6"}.icon-bolt:before{content:"\f0e7"}.icon-sitemap:before{content:"\f0e8"}.icon-umbrella:before{content:"\f0e9"}.icon-paste:before{content:"\f0ea"}.icon-lightbulb:before{content:"\f0eb"}.icon-exchange:before{content:"\f0ec"}.icon-cloud-download:before{content:"\f0ed"}.icon-cloud-upload:before{content:"\f0ee"}.icon-user-md:before{content:"\f0f0"}.icon-stethoscope:before{content:"\f0f1"}.icon-suitcase:before{content:"\f0f2"}.icon-bell-alt:before{content:"\f0f3"}.icon-coffee:before{content:"\f0f4"}.icon-food:before{content:"\f0f5"}.icon-file-text-alt:before{content:"\f0f6"}.icon-building:before{content:"\f0f7"}.icon-hospital:before{content:"\f0f8"}.icon-ambulance:before{content:"\f0f9"}.icon-medkit:before{content:"\f0fa"}.icon-fighter-jet:before{content:"\f0fb"}.icon-beer:before{content:"\f0fc"}.icon-h-sign:before{content:"\f0fd"}.icon-plus-sign-alt:before{content:"\f0fe"}.icon-double-angle-left:before{content:"\f100"}.icon-double-angle-right:before{content:"\f101"}.icon-double-angle-up:before{content:"\f102"}.icon-double-angle-down:before{content:"\f103"}.icon-angle-left:before{content:"\f104"}.icon-angle-right:before{content:"\f105"}.icon-angle-up:before{content:"\f106"}.icon-angle-down:before{content:"\f107"}.icon-desktop:before{content:"\f108"}.icon-laptop:before{content:"\f109"}.icon-tablet:before{content:"\f10a"}.icon-mobile-phone:before{content:"\f10b"}.icon-circle-blank:before{content:"\f10c"}.icon-quote-left:before{content:"\f10d"}.icon-quote-right:before{content:"\f10e"}.icon-spinner:before{content:"\f110"}.icon-circle:before{content:"\f111"}.icon-mail-reply:before,.icon-reply:before{content:"\f112"}.icon-github-alt:before{content:"\f113"}.icon-folder-close-alt:before{content:"\f114"}.icon-folder-open-alt:before{content:"\f115"}.icon-expand-alt:before{content:"\f116"}.icon-collapse-alt:before{content:"\f117"}.icon-smile:before{content:"\f118"}.icon-frown:before{content:"\f119"}.icon-meh:before{content:"\f11a"}.icon-gamepad:before{content:"\f11b"}.icon-keyboard:before{content:"\f11c"}.icon-flag-alt:before{content:"\f11d"}.icon-flag-checkered:before{content:"\f11e"}.icon-terminal:before{content:"\f120"}.icon-code:before{content:"\f121"}.icon-reply-all:before{content:"\f122"}.icon-mail-reply-all:before{content:"\f122"}.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123"}.icon-location-arrow:before{content:"\f124"}.icon-crop:before{content:"\f125"}.icon-code-fork:before{content:"\f126"}.icon-unlink:before{content:"\f127"}.icon-question:before{content:"\f128"}.icon-info:before{content:"\f129"}.icon-exclamation:before{content:"\f12a"}.icon-superscript:before{content:"\f12b"}.icon-subscript:before{content:"\f12c"}.icon-eraser:before{content:"\f12d"}.icon-puzzle-piece:before{content:"\f12e"}.icon-microphone:before{content:"\f130"}.icon-microphone-off:before{content:"\f131"}.icon-shield:before{content:"\f132"}.icon-calendar-empty:before{content:"\f133"}.icon-fire-extinguisher:before{content:"\f134"}.icon-rocket:before{content:"\f135"}.icon-maxcdn:before{content:"\f136"}.icon-chevron-sign-left:before{content:"\f137"}.icon-chevron-sign-right:before{content:"\f138"}.icon-chevron-sign-up:before{content:"\f139"}.icon-chevron-sign-down:before{content:"\f13a"}.icon-html5:before{content:"\f13b"}.icon-css3:before{content:"\f13c"}.icon-anchor:before{content:"\f13d"}.icon-unlock-alt:before{content:"\f13e"}.icon-bullseye:before{content:"\f140"}.icon-ellipsis-horizontal:before{content:"\f141"}.icon-ellipsis-vertical:before{content:"\f142"}.icon-rss-sign:before{content:"\f143"}.icon-play-sign:before{content:"\f144"}.icon-ticket:before{content:"\f145"}.icon-minus-sign-alt:before{content:"\f146"}.icon-check-minus:before{content:"\f147"}.icon-level-up:before{content:"\f148"}.icon-level-down:before{content:"\f149"}.icon-check-sign:before{content:"\f14a"}.icon-edit-sign:before{content:"\f14b"}.icon-external-link-sign:before{content:"\f14c"}.icon-share-sign:before{content:"\f14d"}.icon-compass:before{content:"\f14e"}.icon-collapse:before{content:"\f150"}.icon-collapse-top:before{content:"\f151"}.icon-expand:before{content:"\f152"}.icon-euro:before,.icon-eur:before{content:"\f153"}.icon-gbp:before{content:"\f154"}.icon-dollar:before,.icon-usd:before{content:"\f155"}.icon-rupee:before,.icon-inr:before{content:"\f156"}.icon-yen:before,.icon-jpy:before{content:"\f157"}.icon-renminbi:before,.icon-cny:before{content:"\f158"}.icon-won:before,.icon-krw:before{content:"\f159"}.icon-bitcoin:before,.icon-btc:before{content:"\f15a"}.icon-file:before{content:"\f15b"}.icon-file-text:before{content:"\f15c"}.icon-sort-by-alphabet:before{content:"\f15d"}.icon-sort-by-alphabet-alt:before{content:"\f15e"}.icon-sort-by-attributes:before{content:"\f160"}.icon-sort-by-attributes-alt:before{content:"\f161"}.icon-sort-by-order:before{content:"\f162"}.icon-sort-by-order-alt:before{content:"\f163"}.icon-thumbs-up:before{content:"\f164"}.icon-thumbs-down:before{content:"\f165"}.icon-youtube-sign:before{content:"\f166"}.icon-youtube:before{content:"\f167"}.icon-xing:before{content:"\f168"}.icon-xing-sign:before{content:"\f169"}.icon-youtube-play:before{content:"\f16a"}.icon-dropbox:before{content:"\f16b"}.icon-stackexchange:before{content:"\f16c"}.icon-instagram:before{content:"\f16d"}.icon-flickr:before{content:"\f16e"}.icon-adn:before{content:"\f170"}.icon-bitbucket:before{content:"\f171"}.icon-bitbucket-sign:before{content:"\f172"}.icon-tumblr:before{content:"\f173"}.icon-tumblr-sign:before{content:"\f174"}.icon-long-arrow-down:before{content:"\f175"}.icon-long-arrow-up:before{content:"\f176"}.icon-long-arrow-left:before{content:"\f177"}.icon-long-arrow-right:before{content:"\f178"}.icon-apple:before{content:"\f179"}.icon-windows:before{content:"\f17a"}.icon-android:before{content:"\f17b"}.icon-linux:before{content:"\f17c"}.icon-dribbble:before{content:"\f17d"}.icon-skype:before{content:"\f17e"}.icon-foursquare:before{content:"\f180"}.icon-trello:before{content:"\f181"}.icon-female:before{content:"\f182"}.icon-male:before{content:"\f183"}.icon-gittip:before{content:"\f184"}.icon-sun:before{content:"\f185"}.icon-moon:before{content:"\f186"}.icon-archive:before{content:"\f187"}.icon-bug:before{content:"\f188"}.icon-vk:before{content:"\f189"}.icon-weibo:before{content:"\f18a"}.icon-renren:before{content:"\f18b"}#postbox-container-1 h3.version{font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif;background:0 0;margin-bottom:10px;border-bottom:0 none;padding:7px 0;-webkit-box-shadow:0 0 0 #fff;-moz-box-shadow:0 0 0 #fff;box-shadow:0 0 0 #fff}#postbox-container-1 ul li i{font-size:1.2em;margin-right:10px}.log{margin:40px 0}.log code{font-size:1.2em;line-height:1.2em}.loader{margin-top:20px}.rate-box h4{font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif;font-weight:400;font-size:1.2em}.rate-box i{color:#fcd237;text-shadow:0 0 1px #c59e43;font-size:1.9em;margin-bottom:10px;display:inline-block}.rate-box a{font-size:.8em;text-decoration:none;font-style:normal}.rss_pi-table{margin-bottom:20px}.rss_pi-table tbody tr.edit-row{display:none}.rss_pi-table tbody tr.edit-row.show{display:table-row}.rss_pi-table tbody tr.edit-row>td{padding:0;border-top:0 none}.rss_pi-table tbody tr.edit-row table{border:0 none;margin:0}.rss_pi-table tbody tr.edit-row table tr td{border:0 none;border-top:1px solid #F0F0F0;background:#fff}.rss_pi-table tbody tr.edit-row table tr td:first-child{background:#F9F9F9;border-right:1px solid #E1E1E1;width:440px}.rss_pi-table tbody tr.edit-row table tr td label{font-weight:700}.rss_pi-table tbody tr.edit-row table tr td p.description{color:#9f9f9f;font-size:.8em;line-height:2em;font-style:normal}.rss_pi-table tbody tr.edit-row table tr td input,.rss_pi-table tbody tr.edit-row table tr td textarea{padding:8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}.rss_pi-table tbody tr.edit-row table tr td .radiolist li label{font-weight:400;display:inline-block}.rss_pi-table tbody tr.edit-row table tr td .radiolist li label input{display:inline-block;width:auto;margin-right:10px}.rss_pi-table tbody tr.data-row.show td{background:#2a95c5;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#185571),color-stop(1,#2a95c5));background:-ms-linear-gradient(bottom,#185571,#2a95c5);background:-moz-linear-gradient(center bottom,#185571 0,#2a95c5 100%);background:-o-linear-gradient(#2a95c5,#185571);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2a95c5', endColorstr='#185571', GradientType=0);border-top:1px solid #2a95c5;color:#fff;text-shadow:0 1px 1px rgba(0,0,0,.5)}.rss_pi-table tbody tr.data-row.show td a{color:#fff;text-shadow:0 1px 1px rgba(0,0,0,.5)}.rss_pi-table tbody tr td{border-bottom:1px solid #E1E1E1;padding:10px}.rss_pi-table tbody tr td .row-options{visibility:hidden}.rss_pi-table tbody tr:hover .row-options{visibility:visible}.rss_pi-table tfoot tr td{padding:10px;text-align:right}.rss_pi-table code{display: block;float: left;clear: both;padding: 3px 5px;font-size: 0.9em;background: none;border: 1px #eaeaea solid;}a.delete-row {color: #a00;}a.delete-row:hover{color: red;}.rss-pi-error{margin: 5px 0 15px;border-left: 4px solid #dd3d36;background: #fff;box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);padding: 1px 12px;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Font Awesome 3.2.1
|
3 |
+
* the iconic font designed for Bootstrap
|
4 |
+
* ------------------------------------------------------------------------------
|
5 |
+
* The full suite of pictographic icons, examples, and documentation can be
|
6 |
+
* found at http://fontawesome.io. Stay up to date on Twitter at
|
7 |
+
* http://twitter.com/fontawesome.
|
8 |
+
*
|
9 |
+
* License
|
10 |
+
* ------------------------------------------------------------------------------
|
11 |
+
* - The Font Awesome font is licensed under SIL OFL 1.1 -
|
12 |
+
* http://scripts.sil.org/OFL
|
13 |
+
* - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
|
14 |
+
* http://opensource.org/licenses/mit-license.html
|
15 |
+
* - Font Awesome documentation licensed under CC BY 3.0 -
|
16 |
+
* http://creativecommons.org/licenses/by/3.0/
|
17 |
+
* - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
|
18 |
+
* "Font Awesome by Dave Gandy - http://fontawesome.io"
|
19 |
+
*
|
20 |
+
* Author - Dave Gandy
|
21 |
+
* ------------------------------------------------------------------------------
|
22 |
+
* Email: dave@fontawesome.io
|
23 |
+
* Twitter: http://twitter.com/davegandy
|
24 |
+
* Work: Lead Product Designer @ Kyruus - http://kyruus.com
|
25 |
+
*/@font-face{font-family:FontAwesome;src:url(../font/fontawesome-webfont.eot?v=3.2.1);src:url(../font/fontawesome-webfont.eot?#iefix&v=3.2.1) format('embedded-opentype'),url(../font/fontawesome-webfont.woff?v=3.2.1) format('woff'),url(../font/fontawesome-webfont.ttf?v=3.2.1) format('truetype'),url(../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1) format('svg');font-weight:400;font-style:normal}[class^=icon-],[class*=" icon-"]{font-family:FontAwesome;font-weight:400;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;}[class^=icon-]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none}.icon-large:before{vertical-align:-10%;font-size:1.33333333em}a [class^=icon-],a [class*=" icon-"]{display:inline}[class^=icon-].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.14285714em;text-align:right;padding-right:.28571429em}[class^=icon-].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.42857143em}.icons-ul{margin-left:2.14285714em;list-style-type:none}.icons-ul>li{position:relative}.icons-ul .icon-li{position:absolute;left:-2.14285714em;width:2.14285714em;text-align:center;line-height:inherit}[class^=icon-].hide,[class*=" icon-"].hide{display:none}.icon-muted{color:#eee}.icon-light{color:#fff}.icon-dark{color:#333}.icon-border{border:solid 1px #eee;padding:.2em .25em .15em;-webkit-border-top-right-radius:3px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;border-top-right-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.icon-2x{font-size:2em}.icon-2x.icon-border{border-width:2px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.icon-3x{font-size:3em}.icon-3x.icon-border{border-width:3px;-webkit-border-top-right-radius:5px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;-moz-border-radius-topright:5px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;border-top-right-radius:5px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.icon-4x{font-size:4em}.icon-4x.icon-border{border-width:4px;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;border-top-right-radius:6px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.icon-5x{font-size:5em}.icon-5x.icon-border{border-width:5px;-webkit-border-top-right-radius:7px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;-moz-border-radius-topright:7px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;border-top-right-radius:7px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.pull-right{float:right}.pull-left{float:left}[class^=icon-].pull-left,[class*=" icon-"].pull-left{margin-right:.3em}[class^=icon-].pull-right,[class*=" icon-"].pull-right{margin-left:.3em}.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%}.icon-stack [class^=icon-],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;}.icon-stack .icon-stack-base{font-size:2em;}.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear}a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1)}.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2)}.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}.icon-flip-horizontal:before{-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.icon-flip-vertical:before{-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block}.icon-glass:before{content:"\f000"}.icon-music:before{content:"\f001"}.icon-search:before{content:"\f002"}.icon-envelope-alt:before{content:"\f003"}.icon-heart:before{content:"\f004"}.icon-star:before{content:"\f005"}.icon-star-empty:before{content:"\f006"}.icon-user:before{content:"\f007"}.icon-film:before{content:"\f008"}.icon-th-large:before{content:"\f009"}.icon-th:before{content:"\f00a"}.icon-th-list:before{content:"\f00b"}.icon-ok:before{content:"\f00c"}.icon-remove:before{content:"\f00d"}.icon-zoom-in:before{content:"\f00e"}.icon-zoom-out:before{content:"\f010"}.icon-power-off:before,.icon-off:before{content:"\f011"}.icon-signal:before{content:"\f012"}.icon-gear:before,.icon-cog:before{content:"\f013"}.icon-trash:before{content:"\f014"}.icon-home:before{content:"\f015"}.icon-file-alt:before{content:"\f016"}.icon-time:before{content:"\f017"}.icon-road:before{content:"\f018"}.icon-download-alt:before{content:"\f019"}.icon-download:before{content:"\f01a"}.icon-upload:before{content:"\f01b"}.icon-inbox:before{content:"\f01c"}.icon-play-circle:before{content:"\f01d"}.icon-rotate-right:before,.icon-repeat:before{content:"\f01e"}.icon-refresh:before{content:"\f021"}.icon-list-alt:before{content:"\f022"}.icon-lock:before{content:"\f023"}.icon-flag:before{content:"\f024"}.icon-headphones:before{content:"\f025"}.icon-volume-off:before{content:"\f026"}.icon-volume-down:before{content:"\f027"}.icon-volume-up:before{content:"\f028"}.icon-qrcode:before{content:"\f029"}.icon-barcode:before{content:"\f02a"}.icon-tag:before{content:"\f02b"}.icon-tags:before{content:"\f02c"}.icon-book:before{content:"\f02d"}.icon-bookmark:before{content:"\f02e"}.icon-print:before{content:"\f02f"}.icon-camera:before{content:"\f030"}.icon-font:before{content:"\f031"}.icon-bold:before{content:"\f032"}.icon-italic:before{content:"\f033"}.icon-text-height:before{content:"\f034"}.icon-text-width:before{content:"\f035"}.icon-align-left:before{content:"\f036"}.icon-align-center:before{content:"\f037"}.icon-align-right:before{content:"\f038"}.icon-align-justify:before{content:"\f039"}.icon-list:before{content:"\f03a"}.icon-indent-left:before{content:"\f03b"}.icon-indent-right:before{content:"\f03c"}.icon-facetime-video:before{content:"\f03d"}.icon-picture:before{content:"\f03e"}.icon-pencil:before{content:"\f040"}.icon-map-marker:before{content:"\f041"}.icon-adjust:before{content:"\f042"}.icon-tint:before{content:"\f043"}.icon-edit:before{content:"\f044"}.icon-share:before{content:"\f045"}.icon-check:before{content:"\f046"}.icon-move:before{content:"\f047"}.icon-step-backward:before{content:"\f048"}.icon-fast-backward:before{content:"\f049"}.icon-backward:before{content:"\f04a"}.icon-play:before{content:"\f04b"}.icon-pause:before{content:"\f04c"}.icon-stop:before{content:"\f04d"}.icon-forward:before{content:"\f04e"}.icon-fast-forward:before{content:"\f050"}.icon-step-forward:before{content:"\f051"}.icon-eject:before{content:"\f052"}.icon-chevron-left:before{content:"\f053"}.icon-chevron-right:before{content:"\f054"}.icon-plus-sign:before{content:"\f055"}.icon-minus-sign:before{content:"\f056"}.icon-remove-sign:before{content:"\f057"}.icon-ok-sign:before{content:"\f058"}.icon-question-sign:before{content:"\f059"}.icon-info-sign:before{content:"\f05a"}.icon-screenshot:before{content:"\f05b"}.icon-remove-circle:before{content:"\f05c"}.icon-ok-circle:before{content:"\f05d"}.icon-ban-circle:before{content:"\f05e"}.icon-arrow-left:before{content:"\f060"}.icon-arrow-right:before{content:"\f061"}.icon-arrow-up:before{content:"\f062"}.icon-arrow-down:before{content:"\f063"}.icon-mail-forward:before,.icon-share-alt:before{content:"\f064"}.icon-resize-full:before{content:"\f065"}.icon-resize-small:before{content:"\f066"}.icon-plus:before{content:"\f067"}.icon-minus:before{content:"\f068"}.icon-asterisk:before{content:"\f069"}.icon-exclamation-sign:before{content:"\f06a"}.icon-gift:before{content:"\f06b"}.icon-leaf:before{content:"\f06c"}.icon-fire:before{content:"\f06d"}.icon-eye-open:before{content:"\f06e"}.icon-eye-close:before{content:"\f070"}.icon-warning-sign:before{content:"\f071"}.icon-plane:before{content:"\f072"}.icon-calendar:before{content:"\f073"}.icon-random:before{content:"\f074"}.icon-comment:before{content:"\f075"}.icon-magnet:before{content:"\f076"}.icon-chevron-up:before{content:"\f077"}.icon-chevron-down:before{content:"\f078"}.icon-retweet:before{content:"\f079"}.icon-shopping-cart:before{content:"\f07a"}.icon-folder-close:before{content:"\f07b"}.icon-folder-open:before{content:"\f07c"}.icon-resize-vertical:before{content:"\f07d"}.icon-resize-horizontal:before{content:"\f07e"}.icon-bar-chart:before{content:"\f080"}.icon-twitter-sign:before{content:"\f081"}.icon-facebook-sign:before{content:"\f082"}.icon-camera-retro:before{content:"\f083"}.icon-key:before{content:"\f084"}.icon-gears:before,.icon-cogs:before{content:"\f085"}.icon-comments:before{content:"\f086"}.icon-thumbs-up-alt:before{content:"\f087"}.icon-thumbs-down-alt:before{content:"\f088"}.icon-star-half:before{content:"\f089"}.icon-heart-empty:before{content:"\f08a"}.icon-signout:before{content:"\f08b"}.icon-linkedin-sign:before{content:"\f08c"}.icon-pushpin:before{content:"\f08d"}.icon-external-link:before{content:"\f08e"}.icon-signin:before{content:"\f090"}.icon-trophy:before{content:"\f091"}.icon-github-sign:before{content:"\f092"}.icon-upload-alt:before{content:"\f093"}.icon-lemon:before{content:"\f094"}.icon-phone:before{content:"\f095"}.icon-unchecked:before,.icon-check-empty:before{content:"\f096"}.icon-bookmark-empty:before{content:"\f097"}.icon-phone-sign:before{content:"\f098"}.icon-twitter:before{content:"\f099"}.icon-facebook:before{content:"\f09a"}.icon-github:before{content:"\f09b"}.icon-unlock:before{content:"\f09c"}.icon-credit-card:before{content:"\f09d"}.icon-rss:before{content:"\f09e"}.icon-hdd:before{content:"\f0a0"}.icon-bullhorn:before{content:"\f0a1"}.icon-bell:before{content:"\f0a2"}.icon-certificate:before{content:"\f0a3"}.icon-hand-right:before{content:"\f0a4"}.icon-hand-left:before{content:"\f0a5"}.icon-hand-up:before{content:"\f0a6"}.icon-hand-down:before{content:"\f0a7"}.icon-circle-arrow-left:before{content:"\f0a8"}.icon-circle-arrow-right:before{content:"\f0a9"}.icon-circle-arrow-up:before{content:"\f0aa"}.icon-circle-arrow-down:before{content:"\f0ab"}.icon-globe:before{content:"\f0ac"}.icon-wrench:before{content:"\f0ad"}.icon-tasks:before{content:"\f0ae"}.icon-filter:before{content:"\f0b0"}.icon-briefcase:before{content:"\f0b1"}.icon-fullscreen:before{content:"\f0b2"}.icon-group:before{content:"\f0c0"}.icon-link:before{content:"\f0c1"}.icon-cloud:before{content:"\f0c2"}.icon-beaker:before{content:"\f0c3"}.icon-cut:before{content:"\f0c4"}.icon-copy:before{content:"\f0c5"}.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6"}.icon-save:before{content:"\f0c7"}.icon-sign-blank:before{content:"\f0c8"}.icon-reorder:before{content:"\f0c9"}.icon-list-ul:before{content:"\f0ca"}.icon-list-ol:before{content:"\f0cb"}.icon-strikethrough:before{content:"\f0cc"}.icon-underline:before{content:"\f0cd"}.icon-table:before{content:"\f0ce"}.icon-magic:before{content:"\f0d0"}.icon-truck:before{content:"\f0d1"}.icon-pinterest:before{content:"\f0d2"}.icon-pinterest-sign:before{content:"\f0d3"}.icon-google-plus-sign:before{content:"\f0d4"}.icon-google-plus:before{content:"\f0d5"}.icon-money:before{content:"\f0d6"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-columns:before{content:"\f0db"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-envelope:before{content:"\f0e0"}.icon-linkedin:before{content:"\f0e1"}.icon-rotate-left:before,.icon-undo:before{content:"\f0e2"}.icon-legal:before{content:"\f0e3"}.icon-dashboard:before{content:"\f0e4"}.icon-comment-alt:before{content:"\f0e5"}.icon-comments-alt:before{content:"\f0e6"}.icon-bolt:before{content:"\f0e7"}.icon-sitemap:before{content:"\f0e8"}.icon-umbrella:before{content:"\f0e9"}.icon-paste:before{content:"\f0ea"}.icon-lightbulb:before{content:"\f0eb"}.icon-exchange:before{content:"\f0ec"}.icon-cloud-download:before{content:"\f0ed"}.icon-cloud-upload:before{content:"\f0ee"}.icon-user-md:before{content:"\f0f0"}.icon-stethoscope:before{content:"\f0f1"}.icon-suitcase:before{content:"\f0f2"}.icon-bell-alt:before{content:"\f0f3"}.icon-coffee:before{content:"\f0f4"}.icon-food:before{content:"\f0f5"}.icon-file-text-alt:before{content:"\f0f6"}.icon-building:before{content:"\f0f7"}.icon-hospital:before{content:"\f0f8"}.icon-ambulance:before{content:"\f0f9"}.icon-medkit:before{content:"\f0fa"}.icon-fighter-jet:before{content:"\f0fb"}.icon-beer:before{content:"\f0fc"}.icon-h-sign:before{content:"\f0fd"}.icon-plus-sign-alt:before{content:"\f0fe"}.icon-double-angle-left:before{content:"\f100"}.icon-double-angle-right:before{content:"\f101"}.icon-double-angle-up:before{content:"\f102"}.icon-double-angle-down:before{content:"\f103"}.icon-angle-left:before{content:"\f104"}.icon-angle-right:before{content:"\f105"}.icon-angle-up:before{content:"\f106"}.icon-angle-down:before{content:"\f107"}.icon-desktop:before{content:"\f108"}.icon-laptop:before{content:"\f109"}.icon-tablet:before{content:"\f10a"}.icon-mobile-phone:before{content:"\f10b"}.icon-circle-blank:before{content:"\f10c"}.icon-quote-left:before{content:"\f10d"}.icon-quote-right:before{content:"\f10e"}.icon-spinner:before{content:"\f110"}.icon-circle:before{content:"\f111"}.icon-mail-reply:before,.icon-reply:before{content:"\f112"}.icon-github-alt:before{content:"\f113"}.icon-folder-close-alt:before{content:"\f114"}.icon-folder-open-alt:before{content:"\f115"}.icon-expand-alt:before{content:"\f116"}.icon-collapse-alt:before{content:"\f117"}.icon-smile:before{content:"\f118"}.icon-frown:before{content:"\f119"}.icon-meh:before{content:"\f11a"}.icon-gamepad:before{content:"\f11b"}.icon-keyboard:before{content:"\f11c"}.icon-flag-alt:before{content:"\f11d"}.icon-flag-checkered:before{content:"\f11e"}.icon-terminal:before{content:"\f120"}.icon-code:before{content:"\f121"}.icon-reply-all:before{content:"\f122"}.icon-mail-reply-all:before{content:"\f122"}.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123"}.icon-location-arrow:before{content:"\f124"}.icon-crop:before{content:"\f125"}.icon-code-fork:before{content:"\f126"}.icon-unlink:before{content:"\f127"}.icon-question:before{content:"\f128"}.icon-info:before{content:"\f129"}.icon-exclamation:before{content:"\f12a"}.icon-superscript:before{content:"\f12b"}.icon-subscript:before{content:"\f12c"}.icon-eraser:before{content:"\f12d"}.icon-puzzle-piece:before{content:"\f12e"}.icon-microphone:before{content:"\f130"}.icon-microphone-off:before{content:"\f131"}.icon-shield:before{content:"\f132"}.icon-calendar-empty:before{content:"\f133"}.icon-fire-extinguisher:before{content:"\f134"}.icon-rocket:before{content:"\f135"}.icon-maxcdn:before{content:"\f136"}.icon-chevron-sign-left:before{content:"\f137"}.icon-chevron-sign-right:before{content:"\f138"}.icon-chevron-sign-up:before{content:"\f139"}.icon-chevron-sign-down:before{content:"\f13a"}.icon-html5:before{content:"\f13b"}.icon-css3:before{content:"\f13c"}.icon-anchor:before{content:"\f13d"}.icon-unlock-alt:before{content:"\f13e"}.icon-bullseye:before{content:"\f140"}.icon-ellipsis-horizontal:before{content:"\f141"}.icon-ellipsis-vertical:before{content:"\f142"}.icon-rss-sign:before{content:"\f143"}.icon-play-sign:before{content:"\f144"}.icon-ticket:before{content:"\f145"}.icon-minus-sign-alt:before{content:"\f146"}.icon-check-minus:before{content:"\f147"}.icon-level-up:before{content:"\f148"}.icon-level-down:before{content:"\f149"}.icon-check-sign:before{content:"\f14a"}.icon-edit-sign:before{content:"\f14b"}.icon-external-link-sign:before{content:"\f14c"}.icon-share-sign:before{content:"\f14d"}.icon-compass:before{content:"\f14e"}.icon-collapse:before{content:"\f150"}.icon-collapse-top:before{content:"\f151"}.icon-expand:before{content:"\f152"}.icon-euro:before,.icon-eur:before{content:"\f153"}.icon-gbp:before{content:"\f154"}.icon-dollar:before,.icon-usd:before{content:"\f155"}.icon-rupee:before,.icon-inr:before{content:"\f156"}.icon-yen:before,.icon-jpy:before{content:"\f157"}.icon-renminbi:before,.icon-cny:before{content:"\f158"}.icon-won:before,.icon-krw:before{content:"\f159"}.icon-bitcoin:before,.icon-btc:before{content:"\f15a"}.icon-file:before{content:"\f15b"}.icon-file-text:before{content:"\f15c"}.icon-sort-by-alphabet:before{content:"\f15d"}.icon-sort-by-alphabet-alt:before{content:"\f15e"}.icon-sort-by-attributes:before{content:"\f160"}.icon-sort-by-attributes-alt:before{content:"\f161"}.icon-sort-by-order:before{content:"\f162"}.icon-sort-by-order-alt:before{content:"\f163"}.icon-thumbs-up:before{content:"\f164"}.icon-thumbs-down:before{content:"\f165"}.icon-youtube-sign:before{content:"\f166"}.icon-youtube:before{content:"\f167"}.icon-xing:before{content:"\f168"}.icon-xing-sign:before{content:"\f169"}.icon-youtube-play:before{content:"\f16a"}.icon-dropbox:before{content:"\f16b"}.icon-stackexchange:before{content:"\f16c"}.icon-instagram:before{content:"\f16d"}.icon-flickr:before{content:"\f16e"}.icon-adn:before{content:"\f170"}.icon-bitbucket:before{content:"\f171"}.icon-bitbucket-sign:before{content:"\f172"}.icon-tumblr:before{content:"\f173"}.icon-tumblr-sign:before{content:"\f174"}.icon-long-arrow-down:before{content:"\f175"}.icon-long-arrow-up:before{content:"\f176"}.icon-long-arrow-left:before{content:"\f177"}.icon-long-arrow-right:before{content:"\f178"}.icon-apple:before{content:"\f179"}.icon-windows:before{content:"\f17a"}.icon-android:before{content:"\f17b"}.icon-linux:before{content:"\f17c"}.icon-dribbble:before{content:"\f17d"}.icon-skype:before{content:"\f17e"}.icon-foursquare:before{content:"\f180"}.icon-trello:before{content:"\f181"}.icon-female:before{content:"\f182"}.icon-male:before{content:"\f183"}.icon-gittip:before{content:"\f184"}.icon-sun:before{content:"\f185"}.icon-moon:before{content:"\f186"}.icon-archive:before{content:"\f187"}.icon-bug:before{content:"\f188"}.icon-vk:before{content:"\f189"}.icon-weibo:before{content:"\f18a"}.icon-renren:before{content:"\f18b"}#postbox-container-1 h3.version{font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif;background:0 0;margin-bottom:10px;border-bottom:0 none;padding:7px 0;-webkit-box-shadow:0 0 0 #fff;-moz-box-shadow:0 0 0 #fff;box-shadow:0 0 0 #fff}#postbox-container-1 ul li i{font-size:1.2em;margin-right:10px}.log{margin:40px 0}.log code{font-size:1.2em;line-height:1.2em}.loader{margin-top:20px}.rate-box h4{font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif;font-weight:400;font-size:1.2em}.rate-box i{color:#fcd237;text-shadow:0 0 1px #c59e43;font-size:1.9em;margin-bottom:10px;display:inline-block}.rate-box a{font-size:.8em;text-decoration:none;font-style:normal}.rss_pi-table{margin-bottom:20px}.rss_pi-table tbody tr.edit-row{display:none}.rss_pi-table tbody tr.edit-row.show{display:table-row}.rss_pi-table tbody tr.edit-row>td{padding:0;border-top:0 none}.rss_pi-table tbody tr.edit-row table{border:0 none;margin:0}.rss_pi-table tbody tr.edit-row table tr td{border:0 none;border-top:1px solid #F0F0F0;background:#fff}.rss_pi-table tbody tr.edit-row table tr td:first-child{background:#F9F9F9;border-right:1px solid #E1E1E1;width:440px}.rss_pi-table tbody tr.edit-row table tr td label{font-weight:700}.rss_pi-table tbody tr.edit-row table tr td p.description{color:#9f9f9f;font-size:.8em;line-height:2em;font-style:normal}.rss_pi-table tbody tr.edit-row table tr td input,.rss_pi-table tbody tr.edit-row table tr td textarea{padding:8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}.rss_pi-table tbody tr.edit-row table tr td .radiolist li label{font-weight:400;display:inline-block}.rss_pi-table tbody tr.edit-row table tr td .radiolist li label input{display:inline-block;width:auto;margin-right:10px}.rss_pi-table tbody tr.data-row.show td{background:#2a95c5;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#185571),color-stop(1,#2a95c5));background:-ms-linear-gradient(bottom,#185571,#2a95c5);background:-moz-linear-gradient(center bottom,#185571 0,#2a95c5 100%);background:-o-linear-gradient(#2a95c5,#185571);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2a95c5', endColorstr='#185571', GradientType=0);border-top:1px solid #2a95c5;color:#fff;text-shadow:0 1px 1px rgba(0,0,0,.5)}.rss_pi-table tbody tr.data-row.show td a{color:#fff;text-shadow:0 1px 1px rgba(0,0,0,.5)}.rss_pi-table tbody tr td{border-bottom:1px solid #E1E1E1;padding:10px}.rss_pi-table tbody tr td .row-options{visibility:hidden}.rss_pi-table tbody tr:hover .row-options{visibility:visible}.rss_pi-table tfoot tr td{padding:10px;text-align:right}.rss_pi-table code{display: block;float: left;clear: both;padding: 3px 5px;font-size: 0.9em;background: none;border: 1px #eaeaea solid;}a.delete-row {color: #a00;}a.delete-row:hover{color: red;}.rss-pi-error{margin: 5px 0 15px;border-left: 4px solid #dd3d36;background: #fff;box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);padding: 1px 12px;} .selectit > input {
|
26 |
+
width: 4% !important;
|
27 |
+
}
|
28 |
+
label.selectit{ color:#555555 !important; font-weight: normal !important; }
|
29 |
+
div.category_container ul.children{
|
30 |
+
margin-bottom: 6px;
|
31 |
+
margin-top: 7px;
|
32 |
+
}
|
33 |
+
div.category_container{
|
34 |
+
height: 205px;
|
35 |
+
overflow: auto;
|
36 |
+
}
|
app/class-rss-post-importer.php
CHANGED
@@ -1,123 +1,127 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* One class to rule them all
|
4 |
-
*
|
5 |
-
* @author Saurabh Shukla <saurabh@yapapaya.com>
|
6 |
-
*/
|
7 |
-
class rssPostImporter {
|
8 |
-
|
9 |
-
/**
|
10 |
-
* A var to store the options in
|
11 |
-
* @var array
|
12 |
-
*/
|
13 |
-
public $options = array();
|
14 |
-
|
15 |
-
/**
|
16 |
-
* To initialise the admin and cron classes
|
17 |
-
*
|
18 |
-
* @var object
|
19 |
-
*/
|
20 |
-
private $admin, $cron;
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Start
|
24 |
-
*/
|
25 |
-
function __construct() {
|
26 |
-
|
27 |
-
// populate the options first
|
28 |
-
$this->load_options();
|
29 |
-
|
30 |
-
// hook translations
|
31 |
-
add_action('plugins_loaded', array($this, 'localize'));
|
32 |
-
|
33 |
-
add_filter( 'plugin_action_links_' . RSS_PI_BASENAME, array($this, 'settings_link') );
|
34 |
-
}
|
35 |
-
|
36 |
-
/**
|
37 |
-
* Load options from the db
|
38 |
-
*/
|
39 |
-
public function load_options() {
|
40 |
-
|
41 |
-
$default_settings = array(
|
42 |
-
'enable_logging' => false,
|
43 |
-
'feeds_api_key' => false,
|
44 |
-
'frequency' => 0,
|
45 |
-
'post_template' => "{\$content}\nSource: {\$feed_title}",
|
46 |
-
'post_status' => 'publish',
|
47 |
-
'author_id' => 1,
|
48 |
-
'allow_comments' => true,
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
$this->cron
|
83 |
-
|
84 |
-
|
85 |
-
$this->admin
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
$
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* One class to rule them all
|
4 |
+
*
|
5 |
+
* @author Saurabh Shukla <saurabh@yapapaya.com>
|
6 |
+
*/
|
7 |
+
class rssPostImporter {
|
8 |
+
|
9 |
+
/**
|
10 |
+
* A var to store the options in
|
11 |
+
* @var array
|
12 |
+
*/
|
13 |
+
public $options = array();
|
14 |
+
|
15 |
+
/**
|
16 |
+
* To initialise the admin and cron classes
|
17 |
+
*
|
18 |
+
* @var object
|
19 |
+
*/
|
20 |
+
private $admin, $cron;
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Start
|
24 |
+
*/
|
25 |
+
function __construct() {
|
26 |
+
|
27 |
+
// populate the options first
|
28 |
+
$this->load_options();
|
29 |
+
|
30 |
+
// hook translations
|
31 |
+
add_action('plugins_loaded', array($this, 'localize'));
|
32 |
+
|
33 |
+
add_filter( 'plugin_action_links_' . RSS_PI_BASENAME, array($this, 'settings_link') );
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Load options from the db
|
38 |
+
*/
|
39 |
+
public function load_options() {
|
40 |
+
|
41 |
+
$default_settings = array(
|
42 |
+
'enable_logging' => false,
|
43 |
+
'feeds_api_key' => false,
|
44 |
+
'frequency' => 0,
|
45 |
+
'post_template' => "{\$content}\nSource: {\$feed_title}",
|
46 |
+
'post_status' => 'publish',
|
47 |
+
'author_id' => 1,
|
48 |
+
'allow_comments' => true,
|
49 |
+
'block_indexing' => false,
|
50 |
+
'keywords' => array()
|
51 |
+
);
|
52 |
+
|
53 |
+
$options = get_option('rss_pi_feeds', array());
|
54 |
+
|
55 |
+
if (!isset($options['settings'])) {
|
56 |
+
$options['settings'] = array();
|
57 |
+
}
|
58 |
+
|
59 |
+
$options['settings'] = wp_parse_args($options['settings'], $default_settings);
|
60 |
+
|
61 |
+
if (!array_key_exists('imports', $options)) {
|
62 |
+
$options['imports'] = 0;
|
63 |
+
}
|
64 |
+
|
65 |
+
$this->options = $options;
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Load translations
|
70 |
+
*/
|
71 |
+
public function localize() {
|
72 |
+
|
73 |
+
load_plugin_textdomain('rss_pi', false, RSS_PI_PATH . 'app/lang/');
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Initialise
|
78 |
+
*/
|
79 |
+
public function init() {
|
80 |
+
|
81 |
+
// initialise admin and cron
|
82 |
+
$this->cron = new rssPICron();
|
83 |
+
$this->cron->init();
|
84 |
+
|
85 |
+
$this->admin = new rssPIAdmin();
|
86 |
+
$this->admin->init();
|
87 |
+
|
88 |
+
$this->front = new rssPIFront();
|
89 |
+
$this->front->init();
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Check if a given API key is valid
|
94 |
+
*
|
95 |
+
* @param string $key
|
96 |
+
* @return boolean
|
97 |
+
*/
|
98 |
+
public function is_valid_key($key) {
|
99 |
+
|
100 |
+
if (empty($key)) {
|
101 |
+
return false;
|
102 |
+
}
|
103 |
+
|
104 |
+
$url = "http://www.feedsapi.org/fetch.php?key=$key&url=http://dummyurl.com";
|
105 |
+
$content = file_get_contents($url);
|
106 |
+
|
107 |
+
if (trim($content) == "A valid key must be supplied") {
|
108 |
+
return false;
|
109 |
+
}
|
110 |
+
|
111 |
+
return true;
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Adds a settings link
|
116 |
+
*
|
117 |
+
* @param array $links EXisting links
|
118 |
+
* @return type
|
119 |
+
*/
|
120 |
+
public function settings_link($links) {
|
121 |
+
$settings_link = array(
|
122 |
+
'<a href="' . admin_url('options-general.php?page=rss_pi') . '">Settings</a>',
|
123 |
+
);
|
124 |
+
return array_merge($settings_link, $links);
|
125 |
+
}
|
126 |
+
|
127 |
+
}
|
app/classes/admin/class-rss-pi-admin-processor.php
CHANGED
@@ -1,213 +1,214 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* Processes the admin screen form submissions
|
5 |
-
*
|
6 |
-
* @author Saurabh Shukla <saurabh@yapapaya.com>
|
7 |
-
*/
|
8 |
-
class rssPIAdminProcessor {
|
9 |
-
|
10 |
-
/**
|
11 |
-
* If we have a valid api key
|
12 |
-
*
|
13 |
-
* @var boolean
|
14 |
-
*/
|
15 |
-
var $is_key_valid;
|
16 |
-
|
17 |
-
/**
|
18 |
-
* Process the form result
|
19 |
-
*
|
20 |
-
* @return null
|
21 |
-
*/
|
22 |
-
function process() {
|
23 |
-
|
24 |
-
// if there's nothing for processing or invalid data, bail
|
25 |
-
if (!isset($_POST['info_update']) || !wp_verify_nonce($_POST['rss_pi_nonce'], 'settings_page')) {
|
26 |
-
return;
|
27 |
-
}
|
28 |
-
|
29 |
-
// Get ids of feed-rows
|
30 |
-
$ids = explode(",", $_POST['ids']);
|
31 |
-
|
32 |
-
// formulate the settings array
|
33 |
-
$settings = $this->process_settings();
|
34 |
-
|
35 |
-
// update cron settings
|
36 |
-
$this->update_cron($settings['frequency']);
|
37 |
-
|
38 |
-
// formulate the feeds array
|
39 |
-
$feeds = $this->process_feeds($ids);
|
40 |
-
|
41 |
-
// save and reload the options
|
42 |
-
$this->save_reload_options($settings, $feeds);
|
43 |
-
|
44 |
-
// display a success message
|
45 |
-
?>
|
46 |
-
<div id="message" class="updated">
|
47 |
-
<p><strong><?php _e('Settings saved.', 'rss_pi') ?></strong></p>
|
48 |
-
</div>
|
49 |
-
<?php
|
50 |
-
// check if we need to and import feeds
|
51 |
-
$this->import();
|
52 |
-
}
|
53 |
-
|
54 |
-
/**
|
55 |
-
* Process submitted data to formulate settings array
|
56 |
-
*
|
57 |
-
* @global object $rss_post_importer
|
58 |
-
* @return array
|
59 |
-
*/
|
60 |
-
private function process_settings() {
|
61 |
-
|
62 |
-
// Get selected settings for all imported posts
|
63 |
-
$settings = array(
|
64 |
-
'frequency' => $_POST['frequency'],
|
65 |
-
'feeds_api_key' => $_POST['feeds_api_key'],
|
66 |
-
'post_template' => stripslashes_deep($_POST['post_template']),
|
67 |
-
'post_status' => $_POST['post_status'],
|
68 |
-
'author_id' => $_POST['author_id'],
|
69 |
-
'allow_comments' => $_POST['allow_comments'],
|
70 |
-
|
71 |
-
'
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
*
|
86 |
-
*
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
*
|
102 |
-
*
|
103 |
-
* @
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
'
|
114 |
-
'
|
115 |
-
'
|
116 |
-
|
117 |
-
|
118 |
-
'
|
119 |
-
'
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
*
|
130 |
-
*
|
131 |
-
* @
|
132 |
-
* @param array $
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
'
|
145 |
-
'
|
146 |
-
'
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
*
|
159 |
-
*
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
if
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
$
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
*
|
181 |
-
*
|
182 |
-
* @
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
if
|
188 |
-
|
189 |
-
|
190 |
-
unset
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
if
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Processes the admin screen form submissions
|
5 |
+
*
|
6 |
+
* @author Saurabh Shukla <saurabh@yapapaya.com>
|
7 |
+
*/
|
8 |
+
class rssPIAdminProcessor {
|
9 |
+
|
10 |
+
/**
|
11 |
+
* If we have a valid api key
|
12 |
+
*
|
13 |
+
* @var boolean
|
14 |
+
*/
|
15 |
+
var $is_key_valid;
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Process the form result
|
19 |
+
*
|
20 |
+
* @return null
|
21 |
+
*/
|
22 |
+
function process() {
|
23 |
+
|
24 |
+
// if there's nothing for processing or invalid data, bail
|
25 |
+
if (!isset($_POST['info_update']) || !wp_verify_nonce($_POST['rss_pi_nonce'], 'settings_page')) {
|
26 |
+
return;
|
27 |
+
}
|
28 |
+
|
29 |
+
// Get ids of feed-rows
|
30 |
+
$ids = explode(",", $_POST['ids']);
|
31 |
+
|
32 |
+
// formulate the settings array
|
33 |
+
$settings = $this->process_settings();
|
34 |
+
|
35 |
+
// update cron settings
|
36 |
+
$this->update_cron($settings['frequency']);
|
37 |
+
|
38 |
+
// formulate the feeds array
|
39 |
+
$feeds = $this->process_feeds($ids);
|
40 |
+
|
41 |
+
// save and reload the options
|
42 |
+
$this->save_reload_options($settings, $feeds);
|
43 |
+
|
44 |
+
// display a success message
|
45 |
+
?>
|
46 |
+
<div id="message" class="updated">
|
47 |
+
<p><strong><?php _e('Settings saved.', 'rss_pi') ?></strong></p>
|
48 |
+
</div>
|
49 |
+
<?php
|
50 |
+
// check if we need to and import feeds
|
51 |
+
$this->import();
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Process submitted data to formulate settings array
|
56 |
+
*
|
57 |
+
* @global object $rss_post_importer
|
58 |
+
* @return array
|
59 |
+
*/
|
60 |
+
private function process_settings() {
|
61 |
+
|
62 |
+
// Get selected settings for all imported posts
|
63 |
+
$settings = array(
|
64 |
+
'frequency' => $_POST['frequency'],
|
65 |
+
'feeds_api_key' => $_POST['feeds_api_key'],
|
66 |
+
'post_template' => stripslashes_deep($_POST['post_template']),
|
67 |
+
'post_status' => $_POST['post_status'],
|
68 |
+
'author_id' => $_POST['author_id'],
|
69 |
+
'allow_comments' => $_POST['allow_comments'],
|
70 |
+
'block_indexing' => $_POST['block_indexing'],
|
71 |
+
'enable_logging' => $_POST['enable_logging'],
|
72 |
+
'keywords' => array()
|
73 |
+
);
|
74 |
+
|
75 |
+
global $rss_post_importer;
|
76 |
+
|
77 |
+
// check if submitted api key is valid
|
78 |
+
$this->is_key_valid = $rss_post_importer->is_valid_key($settings['feeds_api_key']);
|
79 |
+
|
80 |
+
// filter the settings and then send them back for saving
|
81 |
+
return $this->filter($settings);
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Update the frequency of the import cron job
|
86 |
+
*
|
87 |
+
* @param string $frequency
|
88 |
+
*/
|
89 |
+
private function update_cron($frequency) {
|
90 |
+
|
91 |
+
// If cron settings have changed
|
92 |
+
if (wp_get_schedule('rss_pi_cron') != $frequency) {
|
93 |
+
|
94 |
+
// Reset cron
|
95 |
+
wp_clear_scheduled_hook('rss_pi_cron');
|
96 |
+
wp_schedule_event(time(), $frequency, 'rss_pi_cron');
|
97 |
+
}
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Forms the feeds array from submitted data
|
102 |
+
*
|
103 |
+
* @param array $ids feeds ids
|
104 |
+
* @return array
|
105 |
+
*/
|
106 |
+
private function process_feeds($ids) {
|
107 |
+
|
108 |
+
$feeds = array();
|
109 |
+
|
110 |
+
foreach ($ids as $id) {
|
111 |
+
if ($id) {
|
112 |
+
array_push($feeds, array(
|
113 |
+
'id' => $id,
|
114 |
+
'url' => strtolower($_POST[$id . '-url']),
|
115 |
+
'name' => $_POST[$id . '-name'],
|
116 |
+
'max_posts' => $_POST[$id . '-max_posts'],
|
117 |
+
// different author ids depending on valid API keys
|
118 |
+
'author_id' => $this->is_key_valid ? $_POST[$id . '-author_id'] : $_POST['author_id'],
|
119 |
+
'category_id' => $_POST[$id . '-category_id'],
|
120 |
+
'strip_html' => $_POST[$id . '-strip_html']
|
121 |
+
));
|
122 |
+
}
|
123 |
+
}
|
124 |
+
|
125 |
+
return $feeds;
|
126 |
+
}
|
127 |
+
|
128 |
+
/**
|
129 |
+
* Update options and reload global options
|
130 |
+
*
|
131 |
+
* @global type $rss_post_importer
|
132 |
+
* @param array $settings
|
133 |
+
* @param array $feeds
|
134 |
+
*/
|
135 |
+
private function save_reload_options($settings, $feeds) {
|
136 |
+
|
137 |
+
global $rss_post_importer;
|
138 |
+
|
139 |
+
// existing options
|
140 |
+
$options = $rss_post_importer->options;
|
141 |
+
|
142 |
+
// new data
|
143 |
+
$new_options = array(
|
144 |
+
'feeds' => $feeds,
|
145 |
+
'settings' => $settings,
|
146 |
+
'latest_import' => $options['latest_import'],
|
147 |
+
'imports' => $options['imports']
|
148 |
+
);
|
149 |
+
|
150 |
+
// update in db
|
151 |
+
update_option('rss_pi_feeds', $new_options);
|
152 |
+
|
153 |
+
// reload so that the new options are used henceforth
|
154 |
+
$rss_post_importer->load_options();
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Import feeds
|
159 |
+
*
|
160 |
+
* @return null
|
161 |
+
*/
|
162 |
+
private function import() {
|
163 |
+
|
164 |
+
// if we don't need to import anything, bail
|
165 |
+
if ($_POST['save_to_db'] != 'true') {
|
166 |
+
return;
|
167 |
+
}
|
168 |
+
|
169 |
+
// initialise the engine and import
|
170 |
+
$engine = new rssPIEngine();
|
171 |
+
$imported = $engine->import_feed();
|
172 |
+
?>
|
173 |
+
<div id="message" class="updated">
|
174 |
+
<p><strong><?php echo($imported); ?> <?php _e('new posts imported.', 'rss_pi') ?></strong></p>
|
175 |
+
</div>
|
176 |
+
<?php
|
177 |
+
}
|
178 |
+
|
179 |
+
/**
|
180 |
+
* Filter settings for API key vs non-API key installs
|
181 |
+
*
|
182 |
+
* @param array $settings
|
183 |
+
* @return array
|
184 |
+
*/
|
185 |
+
private function filter($settings) {
|
186 |
+
|
187 |
+
// if the key is not fine
|
188 |
+
if (!empty($settings['feeds_api_key']) && !$this->is_key_valid) {
|
189 |
+
|
190 |
+
// unset from settings
|
191 |
+
unset($settings['feeds_api_key']);
|
192 |
+
echo '<div class="error">
|
193 |
+
<p>' . __('Invalid API key!', 'rss_api') . '</p>
|
194 |
+
</div>';
|
195 |
+
}
|
196 |
+
|
197 |
+
// if the key is valid
|
198 |
+
if ($this->is_key_valid) {
|
199 |
+
|
200 |
+
// set up keywords (otherwise don't)
|
201 |
+
$keyword_str = $_POST['keyword_filter'];
|
202 |
+
|
203 |
+
$keywords = array();
|
204 |
+
|
205 |
+
if (!empty($keyword_str)) {
|
206 |
+
$keywords = explode(',', $keyword_str);
|
207 |
+
}
|
208 |
+
$settings['keywords'] = $keywords;
|
209 |
+
}
|
210 |
+
|
211 |
+
return $settings;
|
212 |
+
}
|
213 |
+
|
214 |
+
}
|
app/classes/admin/class-rss-pi-admin.php
CHANGED
@@ -1,173 +1,232 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* The class that handles the admin screen
|
5 |
-
*
|
6 |
-
* @author saurabhshukla
|
7 |
-
*/
|
8 |
-
class rssPIAdmin {
|
9 |
-
|
10 |
-
/**
|
11 |
-
* Whether the API key is valid
|
12 |
-
*
|
13 |
-
* @var boolean
|
14 |
-
*/
|
15 |
-
var $is_key_valid;
|
16 |
-
|
17 |
-
/**
|
18 |
-
* The options
|
19 |
-
*
|
20 |
-
* @var array
|
21 |
-
*/
|
22 |
-
var $options;
|
23 |
-
|
24 |
-
/**
|
25 |
-
* Aprompt for invalid/absent API keys
|
26 |
-
* @var string
|
27 |
-
*/
|
28 |
-
var $key_prompt;
|
29 |
-
|
30 |
-
/**
|
31 |
-
* Start
|
32 |
-
*
|
33 |
-
* @global object $rss_post_importer
|
34 |
-
*/
|
35 |
-
public function __construct() {
|
36 |
-
|
37 |
-
$this->load_options();
|
38 |
-
|
39 |
-
// add a key prompt
|
40 |
-
$this->key_prompt = __('You need a <a href="http://www.feedsapi.com/?utm_source=rsspi-full-rss-key-here" target="_blank">Full Text RSS Key</a> to activate this section, please <a href="http://www.feedsapi.com/?utm_source=rsspi-full-rss-key-here" target="_blank">get one and try it free</a> for the next 14 days to see how it goes.', 'rss_pi');
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
*
|
90 |
-
*
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
//
|
118 |
-
|
119 |
-
//
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
*
|
130 |
-
*
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
*
|
152 |
-
*
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* The class that handles the admin screen
|
5 |
+
*
|
6 |
+
* @author saurabhshukla
|
7 |
+
*/
|
8 |
+
class rssPIAdmin {
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Whether the API key is valid
|
12 |
+
*
|
13 |
+
* @var boolean
|
14 |
+
*/
|
15 |
+
var $is_key_valid;
|
16 |
+
|
17 |
+
/**
|
18 |
+
* The options
|
19 |
+
*
|
20 |
+
* @var array
|
21 |
+
*/
|
22 |
+
var $options;
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Aprompt for invalid/absent API keys
|
26 |
+
* @var string
|
27 |
+
*/
|
28 |
+
var $key_prompt;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Start
|
32 |
+
*
|
33 |
+
* @global object $rss_post_importer
|
34 |
+
*/
|
35 |
+
public function __construct() {
|
36 |
+
|
37 |
+
$this->load_options();
|
38 |
+
|
39 |
+
// add a key prompt
|
40 |
+
$this->key_prompt = __('You need a <a href="http://www.feedsapi.com/?utm_source=rsspi-full-rss-key-here" target="_blank">Full Text RSS Key</a> to activate this section, please <a href="http://www.feedsapi.com/?utm_source=rsspi-full-rss-key-here" target="_blank">get one and try it free</a> for the next 14 days to see how it goes.', 'rss_pi');
|
41 |
+
|
42 |
+
$this->key_prompt_multiple_category = __('Multiple Category selection available.You need a <a href="http://www.feedsapi.com/?utm_source=rsspi-full-rss-key-here" target="_blank">Full Text RSS Key</a> to activate this section, please <a href="http://www.feedsapi.com/?utm_source=rsspi-full-rss-key-here" target="_blank">get one and try it free</a> for the next 14 days to see how it goes.', 'rss_pi');
|
43 |
+
|
44 |
+
// initialise logging
|
45 |
+
$this->log = new rssPILog();
|
46 |
+
$this->log->init();
|
47 |
+
|
48 |
+
// load the form processor
|
49 |
+
$this->processor = new rssPIAdminProcessor();
|
50 |
+
}
|
51 |
+
|
52 |
+
private function load_options(){
|
53 |
+
global $rss_post_importer;
|
54 |
+
|
55 |
+
// add options
|
56 |
+
$this->options = $rss_post_importer->options;
|
57 |
+
|
58 |
+
// check if key is valid
|
59 |
+
$this->is_key_valid = $rss_post_importer->is_valid_key($this->options['settings']['feeds_api_key']);
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Initialise and hook all actions
|
64 |
+
*/
|
65 |
+
public function init() {
|
66 |
+
|
67 |
+
// add to admin menu
|
68 |
+
add_action('admin_menu', array($this, 'admin_menu'));
|
69 |
+
|
70 |
+
// load scripts and styles we need
|
71 |
+
add_action('admin_enqueue_scripts', array($this, 'enqueue'));
|
72 |
+
|
73 |
+
// the ajax for adding new feeds (table rows)
|
74 |
+
add_action('wp_ajax_rss_pi_add_row', array($this, 'add_row'));
|
75 |
+
|
76 |
+
// disable the feed author dropdown for invalid/absent API keys
|
77 |
+
add_filter('wp_dropdown_users', array($this, 'disable_user_dropdown'));
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Add to admin menu
|
82 |
+
*/
|
83 |
+
function admin_menu() {
|
84 |
+
|
85 |
+
add_options_page('Rss Post Importer', 'Rss Post Importer', 'manage_options', 'rss_pi', array($this, 'screen'));
|
86 |
+
}
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Enqueue our admin css and js
|
90 |
+
*
|
91 |
+
* @param string $hook The current screens hook
|
92 |
+
* @return null
|
93 |
+
*/
|
94 |
+
public function enqueue($hook) {
|
95 |
+
|
96 |
+
// don't load if it isn't our screen
|
97 |
+
if ($hook != 'settings_page_rss_pi') {
|
98 |
+
return;
|
99 |
+
}
|
100 |
+
|
101 |
+
// register scripts & styles
|
102 |
+
wp_enqueue_script('rss-pi', RSS_PI_URL . 'app/assets/js/main.js', array('jquery'), RSS_PI_VERSION);
|
103 |
+
wp_enqueue_style('rss-pi', RSS_PI_URL . 'app/assets/css/style.css', array(), RSS_PI_VERSION);
|
104 |
+
|
105 |
+
// localise ajaxuel for use
|
106 |
+
$localise_args = array(
|
107 |
+
'ajaxurl' => admin_url('admin-ajax.php')
|
108 |
+
);
|
109 |
+
wp_localize_script('rss-pi', 'rss_pi', $localise_args);
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Display the screen/ui
|
114 |
+
*/
|
115 |
+
function screen() {
|
116 |
+
|
117 |
+
// load the form processor first
|
118 |
+
$this->processor->process();
|
119 |
+
// it'll process any submitted form data
|
120 |
+
|
121 |
+
// reload the options just in case
|
122 |
+
$this->load_options();
|
123 |
+
|
124 |
+
// include the template for the ui
|
125 |
+
include( RSS_PI_PATH . 'app/templates/admin-ui.php');
|
126 |
+
}
|
127 |
+
|
128 |
+
/**
|
129 |
+
* Display errors
|
130 |
+
*
|
131 |
+
* @param string $error The error message
|
132 |
+
* @param boolean $inline Whether the error is inline or shown like regular wp errors
|
133 |
+
*/
|
134 |
+
function key_error($error, $inline = false) {
|
135 |
+
|
136 |
+
$class = ($inline) ? 'rss-pi-error' : 'error';
|
137 |
+
|
138 |
+
echo '<div class="' . $class . '"><p>' . $error . '</p></div>';
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Add a new row for a new feed
|
143 |
+
*/
|
144 |
+
function add_row() {
|
145 |
+
|
146 |
+
include( RSS_PI_PATH . 'app/templates/feed-table-row.php');
|
147 |
+
die();
|
148 |
+
}
|
149 |
+
|
150 |
+
/**
|
151 |
+
* Disable the user dropdwon for each feed
|
152 |
+
*
|
153 |
+
* @param string $output The html of the select dropdown
|
154 |
+
* @return string
|
155 |
+
*/
|
156 |
+
function disable_user_dropdown($output) {
|
157 |
+
|
158 |
+
// if we have a valid key we don't need to disable anything
|
159 |
+
if ($this->is_key_valid) {
|
160 |
+
return $output;
|
161 |
+
}
|
162 |
+
|
163 |
+
// check if this is the feed dropdown (and not any other)
|
164 |
+
preg_match('/rss-pi-specific-feed-author/i', $output, $matched);
|
165 |
+
|
166 |
+
// this is not our dropdown, no need to disable
|
167 |
+
if (empty($matched)) {
|
168 |
+
return $output;
|
169 |
+
}
|
170 |
+
|
171 |
+
// otherwise just disable the dropdown
|
172 |
+
return str_replace('<select ', '<select disabled="disabled" ', $output);
|
173 |
+
}
|
174 |
+
/**
|
175 |
+
* Walker class function for category multiple checkbox
|
176 |
+
*
|
177 |
+
*
|
178 |
+
*
|
179 |
+
*/
|
180 |
+
function wp_category_checklist_rss_pi($post_id = 0, $descendants_and_self = 0, $selected_cats = false, $popular_cats = false, $walker = null, $checked_ontop = true)
|
181 |
+
{
|
182 |
+
$cat = "";
|
183 |
+
if (empty($walker) || !is_a($walker, 'Walker'))
|
184 |
+
$walker = new Walker_Category_Checklist;
|
185 |
+
$descendants_and_self = (int) $descendants_and_self;
|
186 |
+
$args = array();
|
187 |
+
if (is_array($selected_cats))
|
188 |
+
$args['selected_cats'] = $selected_cats;
|
189 |
+
elseif ($post_id)
|
190 |
+
$args['selected_cats'] = wp_get_post_categories($post_id);
|
191 |
+
else
|
192 |
+
$args['selected_cats'] = array();
|
193 |
+
|
194 |
+
if ($descendants_and_self) {
|
195 |
+
$categories = get_categories("child_of=$descendants_and_self&hierarchical=0&hide_empty=0");
|
196 |
+
$self = get_category($descendants_and_self);
|
197 |
+
array_unshift($categories, $self);
|
198 |
+
} else {
|
199 |
+
$categories = get_categories('get=all');
|
200 |
+
}
|
201 |
+
if ($checked_ontop) {
|
202 |
+
// Post process $categories rather than adding an exclude to the get_terms() query to keep the query the same across all posts (for any query cache)
|
203 |
+
$checked_categories = array();
|
204 |
+
$keys = array_keys($categories);
|
205 |
+
foreach ($keys as $k) {
|
206 |
+
if (in_array($categories[$k]->term_id, $args['selected_cats'])) {
|
207 |
+
$checked_categories[] = $categories[$k];
|
208 |
+
unset($categories[$k]);
|
209 |
+
}
|
210 |
+
}
|
211 |
+
// Put checked cats on top
|
212 |
+
$cat = $cat . call_user_func_array(array(
|
213 |
+
&$walker,
|
214 |
+
'walk'
|
215 |
+
), array(
|
216 |
+
$checked_categories,
|
217 |
+
0,
|
218 |
+
$args
|
219 |
+
));
|
220 |
+
}
|
221 |
+
// Then the rest of them
|
222 |
+
$cat = $cat . call_user_func_array(array(
|
223 |
+
&$walker,
|
224 |
+
'walk'
|
225 |
+
), array(
|
226 |
+
$categories,
|
227 |
+
0,
|
228 |
+
$args
|
229 |
+
));
|
230 |
+
return $cat;
|
231 |
+
}
|
232 |
+
}
|
app/classes/front/class-rss-pi-front.php
ADDED
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* The class that handles the front screen
|
5 |
+
*
|
6 |
+
*
|
7 |
+
*/
|
8 |
+
class rssPIFront {
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Whether the API key is valid
|
12 |
+
*
|
13 |
+
* @var boolean
|
14 |
+
*/
|
15 |
+
var $is_key_valid;
|
16 |
+
|
17 |
+
/**
|
18 |
+
* The options
|
19 |
+
*
|
20 |
+
* @var array
|
21 |
+
*/
|
22 |
+
var $options;
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Aprompt for invalid/absent API keys
|
26 |
+
* @var string
|
27 |
+
*/
|
28 |
+
var $key_prompt;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Initialise and hook all actions
|
32 |
+
*/
|
33 |
+
public function init() {
|
34 |
+
// add noidex to front
|
35 |
+
add_action('wp_head', array($this, 'rss_pi_noindex_meta_tag'));
|
36 |
+
}
|
37 |
+
|
38 |
+
|
39 |
+
function rss_pi_noindex_meta_tag()
|
40 |
+
{
|
41 |
+
global $post,$rss_post_importer;
|
42 |
+
// Check if single post
|
43 |
+
if(is_single())
|
44 |
+
{
|
45 |
+
|
46 |
+
// Get current post id
|
47 |
+
$current_post_id = $post->ID;
|
48 |
+
|
49 |
+
// add options
|
50 |
+
$this->options = $rss_post_importer->options;
|
51 |
+
|
52 |
+
// get value of block indexing
|
53 |
+
$block_indexing = $this->options['settings']['block_indexing'];
|
54 |
+
|
55 |
+
// Check for block indexing
|
56 |
+
if($this->options['settings']['block_indexing'] == 'true'){
|
57 |
+
$meta_values = get_post_meta( $current_post_id, 'rss_pi_source_url', false );
|
58 |
+
// if meta value array is empty it means post is not imported by this plugin.
|
59 |
+
if(!empty($meta_values)){
|
60 |
+
echo '<meta name="robots" content="noindex">';
|
61 |
+
}
|
62 |
+
}
|
63 |
+
}
|
64 |
+
}
|
65 |
+
|
66 |
+
}
|
app/classes/import/class-rss-pi-engine.php
CHANGED
@@ -1,365 +1,374 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* Main import engine
|
5 |
-
*
|
6 |
-
* @author Saurabh Shukla <saurabh@yapapaya.com>
|
7 |
-
*/
|
8 |
-
class rssPIEngine {
|
9 |
-
|
10 |
-
/**
|
11 |
-
* The options
|
12 |
-
*
|
13 |
-
* @var array
|
14 |
-
*/
|
15 |
-
var $options = array();
|
16 |
-
|
17 |
-
/**
|
18 |
-
* Start the engine
|
19 |
-
*
|
20 |
-
* @global type $rss_post_importer
|
21 |
-
*/
|
22 |
-
public function __construct() {
|
23 |
-
|
24 |
-
global $rss_post_importer;
|
25 |
-
|
26 |
-
// load options
|
27 |
-
$this->options = $rss_post_importer->options;
|
28 |
-
}
|
29 |
-
|
30 |
-
/**
|
31 |
-
* Import feeds
|
32 |
-
*
|
33 |
-
* @return int
|
34 |
-
*/
|
35 |
-
public function import_feed() {
|
36 |
-
|
37 |
-
$post_count = 0;
|
38 |
-
|
39 |
-
// filter cache lifetime
|
40 |
-
add_filter('wp_feed_cache_transient_lifetime', array($this, 'frequency'));
|
41 |
-
|
42 |
-
foreach ($this->options['feeds'] as $f) {
|
43 |
-
|
44 |
-
// prepare and import each feed
|
45 |
-
$items = $this->prepare_import($f);
|
46 |
-
$post_count += count($items);
|
47 |
-
}
|
48 |
-
|
49 |
-
// reformulate import count
|
50 |
-
$imports = intval($this->options['imports']) + $post_count;
|
51 |
-
|
52 |
-
// update options
|
53 |
-
update_option('rss_pi_feeds', array(
|
54 |
-
'feeds' => $this->options['feeds'],
|
55 |
-
'settings' => $this->options['settings'],
|
56 |
-
'latest_import' => date("Y-m-d H:i:s"),
|
57 |
-
'imports' => $imports
|
58 |
-
));
|
59 |
-
|
60 |
-
global $rss_post_importer;
|
61 |
-
// reload options
|
62 |
-
$rss_post_importer->load_options();
|
63 |
-
|
64 |
-
remove_filter('wp_feed_cache_transient_lifetime', array($this, 'frequency'));
|
65 |
-
|
66 |
-
// log this
|
67 |
-
rssPILog::log($post_count);
|
68 |
-
|
69 |
-
return $post_count;
|
70 |
-
}
|
71 |
-
|
72 |
-
/**
|
73 |
-
* Dummy function for filtering because we can't use anon ones yet
|
74 |
-
* @return string
|
75 |
-
*/
|
76 |
-
public function frequency() {
|
77 |
-
return $this->options['settings']['frequency'];
|
78 |
-
}
|
79 |
-
|
80 |
-
/**
|
81 |
-
* Prepares arguments and imports
|
82 |
-
*
|
83 |
-
* @param array $f feed array
|
84 |
-
* @return array
|
85 |
-
*/
|
86 |
-
private function prepare_import($f) {
|
87 |
-
$args = array(
|
88 |
-
'feed_title' => $f['name'],
|
89 |
-
'max_posts' => $f['max_posts'],
|
90 |
-
'author_id' => $f['author_id'],
|
91 |
-
'category_id' => $f['category_id'],
|
92 |
-
'strip_html' => $f['strip_html'],
|
93 |
-
'save_to_db' => true
|
94 |
-
);
|
95 |
-
return $this->_import($f['url'], $args);
|
96 |
-
}
|
97 |
-
|
98 |
-
/**
|
99 |
-
* Import feeds from url
|
100 |
-
*
|
101 |
-
* @param string $url The remote feed url
|
102 |
-
* @param array $args Arguments for the import
|
103 |
-
* @return null|array
|
104 |
-
*/
|
105 |
-
private function _import($url = '', $args = array()) {
|
106 |
-
|
107 |
-
if (empty($url)) {
|
108 |
-
return;
|
109 |
-
}
|
110 |
-
|
111 |
-
$defaults = array(
|
112 |
-
'feed_title' => '',
|
113 |
-
'max_posts' => 5,
|
114 |
-
'author_id' => 1,
|
115 |
-
'category_id' => 0,
|
116 |
-
'strip_html' => true,
|
117 |
-
'save_to_db' => true
|
118 |
-
);
|
119 |
-
|
120 |
-
$args = wp_parse_args($args, $defaults);
|
121 |
-
|
122 |
-
// include the default WP feed processing functions
|
123 |
-
include_once( ABSPATH . WPINC . '/feed.php' );
|
124 |
-
|
125 |
-
// get the right url for fetching (premium vs free)
|
126 |
-
$url = $this->url($url);
|
127 |
-
|
128 |
-
// fetch the feed
|
129 |
-
$feed = fetch_feed($url);
|
130 |
-
|
131 |
-
// save as posts
|
132 |
-
$posts = $this->save($feed, $args);
|
133 |
-
|
134 |
-
return $posts;
|
135 |
-
}
|
136 |
-
|
137 |
-
/**
|
138 |
-
* Formulate the right url
|
139 |
-
*
|
140 |
-
* @param string $url
|
141 |
-
* @return string
|
142 |
-
*/
|
143 |
-
private function url($url) {
|
144 |
-
|
145 |
-
$key = $this->options['settings']["feeds_api_key"];
|
146 |
-
|
147 |
-
//if api key has been saved by user and is not empty
|
148 |
-
if (isset($key) && !empty($key)) {
|
149 |
-
|
150 |
-
$api_url = "http://www.feedsapi.org/fetch.php?key=" . $key . "&url=" . $url;
|
151 |
-
|
152 |
-
return $api_url;
|
153 |
-
}
|
154 |
-
|
155 |
-
return $url;
|
156 |
-
}
|
157 |
-
|
158 |
-
/**
|
159 |
-
* Save the feed
|
160 |
-
*
|
161 |
-
* @param object $feed The feed object
|
162 |
-
* @param array $args The arguments
|
163 |
-
* @return boolean
|
164 |
-
*/
|
165 |
-
private function save($feed, $args = array()) {
|
166 |
-
if (is_wp_error($feed)) {
|
167 |
-
return false;
|
168 |
-
}
|
169 |
-
// filter the feed and get feed items
|
170 |
-
$feed_items = $this->filter($feed, $args);
|
171 |
-
|
172 |
-
// if we are saving
|
173 |
-
if ($args['save_to_db']) {
|
174 |
-
// insert and return
|
175 |
-
$saved_posts = $this->insert($feed_items, $args);
|
176 |
-
return $saved_posts;
|
177 |
-
}
|
178 |
-
|
179 |
-
// otherwsie return the feed items
|
180 |
-
return $feed_items;
|
181 |
-
}
|
182 |
-
|
183 |
-
/**
|
184 |
-
* Filter the feed based on keywords
|
185 |
-
*
|
186 |
-
* @param object $feed The feed object
|
187 |
-
* @param array $args Arguments
|
188 |
-
* @return array
|
189 |
-
*/
|
190 |
-
private function filter($feed, $args) {
|
191 |
-
|
192 |
-
// the count of keyword matched items
|
193 |
-
$got = 0;
|
194 |
-
|
195 |
-
// the current index of the items aray
|
196 |
-
$index = 0;
|
197 |
-
|
198 |
-
$filtered = array();
|
199 |
-
|
200 |
-
// till we have as many as the posts needed
|
201 |
-
while ($got < $args['max_posts']) {
|
202 |
-
|
203 |
-
// get only one item at the current index
|
204 |
-
$feed_item = $feed->get_items($index, 1);
|
205 |
-
|
206 |
-
// if this is empty, get out of the while
|
207 |
-
if (empty($feed_item)) {
|
208 |
-
break;
|
209 |
-
}
|
210 |
-
// else be in a forever loop
|
211 |
-
// get the content
|
212 |
-
$content = $feed_item[0]->get_content();
|
213 |
-
|
214 |
-
// test it against the keywords
|
215 |
-
$tested = $this->test($content);
|
216 |
-
|
217 |
-
// if this is good for us
|
218 |
-
if ($tested) {
|
219 |
-
$got++;
|
220 |
-
|
221 |
-
array_push($filtered, $feed_item[0]);
|
222 |
-
}
|
223 |
-
// shift the index
|
224 |
-
$index++;
|
225 |
-
}
|
226 |
-
|
227 |
-
return $filtered;
|
228 |
-
}
|
229 |
-
|
230 |
-
/**
|
231 |
-
* Test a piece of content against keywords
|
232 |
-
*
|
233 |
-
* @param string $content
|
234 |
-
* @return boolean
|
235 |
-
*/
|
236 |
-
function test($content) {
|
237 |
-
$keywords = $this->options['settings']['keywords'];
|
238 |
-
|
239 |
-
if (empty($keywords)) {
|
240 |
-
return true;
|
241 |
-
}
|
242 |
-
|
243 |
-
$match = false;
|
244 |
-
|
245 |
-
// loop through keywords
|
246 |
-
foreach ($keywords as $keyword) {
|
247 |
-
|
248 |
-
// if the keyword is not a regex, make it one
|
249 |
-
if (!$this->is_regex($keyword)) {
|
250 |
-
$keyword = '/' . $keyword . '/i';
|
251 |
-
}
|
252 |
-
|
253 |
-
// look for keyword in content
|
254 |
-
preg_match($keyword, $content, $tested);
|
255 |
-
|
256 |
-
// if it's there, we are good
|
257 |
-
if (!empty($tested)) {
|
258 |
-
$match = true;
|
259 |
-
// no need to test anymore
|
260 |
-
break;
|
261 |
-
}
|
262 |
-
}
|
263 |
-
|
264 |
-
|
265 |
-
return $match;
|
266 |
-
}
|
267 |
-
|
268 |
-
/**
|
269 |
-
* Check if a string is regex
|
270 |
-
*
|
271 |
-
* @param string $str The string to check
|
272 |
-
* @return boolean
|
273 |
-
*/
|
274 |
-
private function is_regex($str) {
|
275 |
-
|
276 |
-
// check regex with a regex!
|
277 |
-
$regex = "/^\/[\s\S]+\/$/";
|
278 |
-
preg_match($regex, $str, $matched);
|
279 |
-
return !empty($matched);
|
280 |
-
}
|
281 |
-
|
282 |
-
/**
|
283 |
-
* Insert feed items as posts
|
284 |
-
*
|
285 |
-
* @param array $items Fetched feed items
|
286 |
-
* @param array $args arguments
|
287 |
-
* @return array
|
288 |
-
*/
|
289 |
-
private function insert($items, $args = array()) {
|
290 |
-
$saved_posts = array();
|
291 |
-
|
292 |
-
// Initialise the content parser
|
293 |
-
$parser = new rssPIParser($this->options);
|
294 |
-
|
295 |
-
// Featured Image setter
|
296 |
-
$thumbnail = new rssPIFeaturedImage();
|
297 |
-
|
298 |
-
foreach ($items as $item) {
|
299 |
-
if (!$this->post_exists($item->get_permalink())) {
|
300 |
-
$post = array(
|
301 |
-
'post_title' => $item->get_title(),
|
302 |
-
// parse the content
|
303 |
-
'post_content' => $parser->_parse($item, $args['feed_title'], $args['strip_html']),
|
304 |
-
'post_status' => $this->options['settings']['post_status'],
|
305 |
-
'post_author' => $args['author_id'],
|
306 |
-
'post_category' => array($args['category_id']),
|
307 |
-
'comment_status' => $this->options['settings']['allow_comments'],
|
308 |
-
'post_date' => $item->get_date('Y-m-d H:i:s')
|
309 |
-
);
|
310 |
-
|
311 |
-
// insert as post
|
312 |
-
$post_id = $this->_insert($post, $item->get_permalink());
|
313 |
-
|
314 |
-
// set thumbnail
|
315 |
-
$thumbnail->_set($item, $post_id);
|
316 |
-
|
317 |
-
array_push($saved_posts, $post);
|
318 |
-
}
|
319 |
-
}
|
320 |
-
|
321 |
-
return $saved_posts;
|
322 |
-
}
|
323 |
-
|
324 |
-
/**
|
325 |
-
* Check if a feed ite is alreday imported
|
326 |
-
*
|
327 |
-
* @param string $permalink
|
328 |
-
* @return boolean
|
329 |
-
*/
|
330 |
-
private function post_exists($permalink) {
|
331 |
-
|
332 |
-
// get all posts where the meta is stored
|
333 |
-
$args = array(
|
334 |
-
'post_status' => 'any',
|
335 |
-
'meta_key' => 'rss_pi_source_url',
|
336 |
-
'meta_value' => esc_url($permalink)
|
337 |
-
);
|
338 |
-
|
339 |
-
$posts = get_posts($args);
|
340 |
-
|
341 |
-
// Not already imported
|
342 |
-
return(count($posts) > 0);
|
343 |
-
}
|
344 |
-
|
345 |
-
/**
|
346 |
-
* Insert feed item as post
|
347 |
-
*
|
348 |
-
* @param array $post Post array
|
349 |
-
* @param string $url source url meta
|
350 |
-
* @return int
|
351 |
-
*/
|
352 |
-
private function _insert($post, $url) {
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Main import engine
|
5 |
+
*
|
6 |
+
* @author Saurabh Shukla <saurabh@yapapaya.com>
|
7 |
+
*/
|
8 |
+
class rssPIEngine {
|
9 |
+
|
10 |
+
/**
|
11 |
+
* The options
|
12 |
+
*
|
13 |
+
* @var array
|
14 |
+
*/
|
15 |
+
var $options = array();
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Start the engine
|
19 |
+
*
|
20 |
+
* @global type $rss_post_importer
|
21 |
+
*/
|
22 |
+
public function __construct() {
|
23 |
+
|
24 |
+
global $rss_post_importer;
|
25 |
+
|
26 |
+
// load options
|
27 |
+
$this->options = $rss_post_importer->options;
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Import feeds
|
32 |
+
*
|
33 |
+
* @return int
|
34 |
+
*/
|
35 |
+
public function import_feed() {
|
36 |
+
|
37 |
+
$post_count = 0;
|
38 |
+
|
39 |
+
// filter cache lifetime
|
40 |
+
add_filter('wp_feed_cache_transient_lifetime', array($this, 'frequency'));
|
41 |
+
|
42 |
+
foreach ($this->options['feeds'] as $f) {
|
43 |
+
|
44 |
+
// prepare and import each feed
|
45 |
+
$items = $this->prepare_import($f);
|
46 |
+
$post_count += count($items);
|
47 |
+
}
|
48 |
+
|
49 |
+
// reformulate import count
|
50 |
+
$imports = intval($this->options['imports']) + $post_count;
|
51 |
+
|
52 |
+
// update options
|
53 |
+
update_option('rss_pi_feeds', array(
|
54 |
+
'feeds' => $this->options['feeds'],
|
55 |
+
'settings' => $this->options['settings'],
|
56 |
+
'latest_import' => date("Y-m-d H:i:s"),
|
57 |
+
'imports' => $imports
|
58 |
+
));
|
59 |
+
|
60 |
+
global $rss_post_importer;
|
61 |
+
// reload options
|
62 |
+
$rss_post_importer->load_options();
|
63 |
+
|
64 |
+
remove_filter('wp_feed_cache_transient_lifetime', array($this, 'frequency'));
|
65 |
+
|
66 |
+
// log this
|
67 |
+
rssPILog::log($post_count);
|
68 |
+
|
69 |
+
return $post_count;
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Dummy function for filtering because we can't use anon ones yet
|
74 |
+
* @return string
|
75 |
+
*/
|
76 |
+
public function frequency() {
|
77 |
+
return $this->options['settings']['frequency'];
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Prepares arguments and imports
|
82 |
+
*
|
83 |
+
* @param array $f feed array
|
84 |
+
* @return array
|
85 |
+
*/
|
86 |
+
private function prepare_import($f) {
|
87 |
+
$args = array(
|
88 |
+
'feed_title' => $f['name'],
|
89 |
+
'max_posts' => $f['max_posts'],
|
90 |
+
'author_id' => $f['author_id'],
|
91 |
+
'category_id' => $f['category_id'],
|
92 |
+
'strip_html' => $f['strip_html'],
|
93 |
+
'save_to_db' => true
|
94 |
+
);
|
95 |
+
return $this->_import($f['url'], $args);
|
96 |
+
}
|
97 |
+
|
98 |
+
/**
|
99 |
+
* Import feeds from url
|
100 |
+
*
|
101 |
+
* @param string $url The remote feed url
|
102 |
+
* @param array $args Arguments for the import
|
103 |
+
* @return null|array
|
104 |
+
*/
|
105 |
+
private function _import($url = '', $args = array()) {
|
106 |
+
|
107 |
+
if (empty($url)) {
|
108 |
+
return;
|
109 |
+
}
|
110 |
+
|
111 |
+
$defaults = array(
|
112 |
+
'feed_title' => '',
|
113 |
+
'max_posts' => 5,
|
114 |
+
'author_id' => 1,
|
115 |
+
'category_id' => 0,
|
116 |
+
'strip_html' => true,
|
117 |
+
'save_to_db' => true
|
118 |
+
);
|
119 |
+
|
120 |
+
$args = wp_parse_args($args, $defaults);
|
121 |
+
|
122 |
+
// include the default WP feed processing functions
|
123 |
+
include_once( ABSPATH . WPINC . '/feed.php' );
|
124 |
+
|
125 |
+
// get the right url for fetching (premium vs free)
|
126 |
+
$url = $this->url($url);
|
127 |
+
|
128 |
+
// fetch the feed
|
129 |
+
$feed = fetch_feed($url);
|
130 |
+
|
131 |
+
// save as posts
|
132 |
+
$posts = $this->save($feed, $args);
|
133 |
+
|
134 |
+
return $posts;
|
135 |
+
}
|
136 |
+
|
137 |
+
/**
|
138 |
+
* Formulate the right url
|
139 |
+
*
|
140 |
+
* @param string $url
|
141 |
+
* @return string
|
142 |
+
*/
|
143 |
+
private function url($url) {
|
144 |
+
|
145 |
+
$key = $this->options['settings']["feeds_api_key"];
|
146 |
+
|
147 |
+
//if api key has been saved by user and is not empty
|
148 |
+
if (isset($key) && !empty($key)) {
|
149 |
+
|
150 |
+
$api_url = "http://www.feedsapi.org/fetch.php?key=" . $key . "&url=" . $url;
|
151 |
+
|
152 |
+
return $api_url;
|
153 |
+
}
|
154 |
+
|
155 |
+
return $url;
|
156 |
+
}
|
157 |
+
|
158 |
+
/**
|
159 |
+
* Save the feed
|
160 |
+
*
|
161 |
+
* @param object $feed The feed object
|
162 |
+
* @param array $args The arguments
|
163 |
+
* @return boolean
|
164 |
+
*/
|
165 |
+
private function save($feed, $args = array()) {
|
166 |
+
if (is_wp_error($feed)) {
|
167 |
+
return false;
|
168 |
+
}
|
169 |
+
// filter the feed and get feed items
|
170 |
+
$feed_items = $this->filter($feed, $args);
|
171 |
+
|
172 |
+
// if we are saving
|
173 |
+
if ($args['save_to_db']) {
|
174 |
+
// insert and return
|
175 |
+
$saved_posts = $this->insert($feed_items, $args);
|
176 |
+
return $saved_posts;
|
177 |
+
}
|
178 |
+
|
179 |
+
// otherwsie return the feed items
|
180 |
+
return $feed_items;
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* Filter the feed based on keywords
|
185 |
+
*
|
186 |
+
* @param object $feed The feed object
|
187 |
+
* @param array $args Arguments
|
188 |
+
* @return array
|
189 |
+
*/
|
190 |
+
private function filter($feed, $args) {
|
191 |
+
|
192 |
+
// the count of keyword matched items
|
193 |
+
$got = 0;
|
194 |
+
|
195 |
+
// the current index of the items aray
|
196 |
+
$index = 0;
|
197 |
+
|
198 |
+
$filtered = array();
|
199 |
+
|
200 |
+
// till we have as many as the posts needed
|
201 |
+
while ($got < $args['max_posts']) {
|
202 |
+
|
203 |
+
// get only one item at the current index
|
204 |
+
$feed_item = $feed->get_items($index, 1);
|
205 |
+
|
206 |
+
// if this is empty, get out of the while
|
207 |
+
if (empty($feed_item)) {
|
208 |
+
break;
|
209 |
+
}
|
210 |
+
// else be in a forever loop
|
211 |
+
// get the content
|
212 |
+
$content = $feed_item[0]->get_content();
|
213 |
+
|
214 |
+
// test it against the keywords
|
215 |
+
$tested = $this->test($content);
|
216 |
+
|
217 |
+
// if this is good for us
|
218 |
+
if ($tested) {
|
219 |
+
$got++;
|
220 |
+
|
221 |
+
array_push($filtered, $feed_item[0]);
|
222 |
+
}
|
223 |
+
// shift the index
|
224 |
+
$index++;
|
225 |
+
}
|
226 |
+
|
227 |
+
return $filtered;
|
228 |
+
}
|
229 |
+
|
230 |
+
/**
|
231 |
+
* Test a piece of content against keywords
|
232 |
+
*
|
233 |
+
* @param string $content
|
234 |
+
* @return boolean
|
235 |
+
*/
|
236 |
+
function test($content) {
|
237 |
+
$keywords = $this->options['settings']['keywords'];
|
238 |
+
|
239 |
+
if (empty($keywords)) {
|
240 |
+
return true;
|
241 |
+
}
|
242 |
+
|
243 |
+
$match = false;
|
244 |
+
|
245 |
+
// loop through keywords
|
246 |
+
foreach ($keywords as $keyword) {
|
247 |
+
|
248 |
+
// if the keyword is not a regex, make it one
|
249 |
+
if (!$this->is_regex($keyword)) {
|
250 |
+
$keyword = '/' . $keyword . '/i';
|
251 |
+
}
|
252 |
+
|
253 |
+
// look for keyword in content
|
254 |
+
preg_match($keyword, $content, $tested);
|
255 |
+
|
256 |
+
// if it's there, we are good
|
257 |
+
if (!empty($tested)) {
|
258 |
+
$match = true;
|
259 |
+
// no need to test anymore
|
260 |
+
break;
|
261 |
+
}
|
262 |
+
}
|
263 |
+
|
264 |
+
|
265 |
+
return $match;
|
266 |
+
}
|
267 |
+
|
268 |
+
/**
|
269 |
+
* Check if a string is regex
|
270 |
+
*
|
271 |
+
* @param string $str The string to check
|
272 |
+
* @return boolean
|
273 |
+
*/
|
274 |
+
private function is_regex($str) {
|
275 |
+
|
276 |
+
// check regex with a regex!
|
277 |
+
$regex = "/^\/[\s\S]+\/$/";
|
278 |
+
preg_match($regex, $str, $matched);
|
279 |
+
return !empty($matched);
|
280 |
+
}
|
281 |
+
|
282 |
+
/**
|
283 |
+
* Insert feed items as posts
|
284 |
+
*
|
285 |
+
* @param array $items Fetched feed items
|
286 |
+
* @param array $args arguments
|
287 |
+
* @return array
|
288 |
+
*/
|
289 |
+
private function insert($items, $args = array()) {
|
290 |
+
$saved_posts = array();
|
291 |
+
|
292 |
+
// Initialise the content parser
|
293 |
+
$parser = new rssPIParser($this->options);
|
294 |
+
|
295 |
+
// Featured Image setter
|
296 |
+
$thumbnail = new rssPIFeaturedImage();
|
297 |
+
|
298 |
+
foreach ($items as $item) {
|
299 |
+
if (!$this->post_exists($item->get_permalink())) {
|
300 |
+
$post = array(
|
301 |
+
'post_title' => $item->get_title(),
|
302 |
+
// parse the content
|
303 |
+
'post_content' => $parser->_parse($item, $args['feed_title'], $args['strip_html']),
|
304 |
+
'post_status' => $this->options['settings']['post_status'],
|
305 |
+
'post_author' => $args['author_id'],
|
306 |
+
'post_category' => array($args['category_id']),
|
307 |
+
'comment_status' => $this->options['settings']['allow_comments'],
|
308 |
+
'post_date' => $item->get_date('Y-m-d H:i:s')
|
309 |
+
);
|
310 |
+
|
311 |
+
// insert as post
|
312 |
+
$post_id = $this->_insert($post, $item->get_permalink());
|
313 |
+
|
314 |
+
// set thumbnail
|
315 |
+
$thumbnail->_set($item, $post_id);
|
316 |
+
|
317 |
+
array_push($saved_posts, $post);
|
318 |
+
}
|
319 |
+
}
|
320 |
+
|
321 |
+
return $saved_posts;
|
322 |
+
}
|
323 |
+
|
324 |
+
/**
|
325 |
+
* Check if a feed ite is alreday imported
|
326 |
+
*
|
327 |
+
* @param string $permalink
|
328 |
+
* @return boolean
|
329 |
+
*/
|
330 |
+
private function post_exists($permalink) {
|
331 |
+
|
332 |
+
// get all posts where the meta is stored
|
333 |
+
$args = array(
|
334 |
+
'post_status' => 'any',
|
335 |
+
'meta_key' => 'rss_pi_source_url',
|
336 |
+
'meta_value' => esc_url($permalink)
|
337 |
+
);
|
338 |
+
|
339 |
+
$posts = get_posts($args);
|
340 |
+
|
341 |
+
// Not already imported
|
342 |
+
return(count($posts) > 0);
|
343 |
+
}
|
344 |
+
|
345 |
+
/**
|
346 |
+
* Insert feed item as post
|
347 |
+
*
|
348 |
+
* @param array $post Post array
|
349 |
+
* @param string $url source url meta
|
350 |
+
* @return int
|
351 |
+
*/
|
352 |
+
private function _insert($post, $url) {
|
353 |
+
|
354 |
+
if($post['post_category'][0] == ""){
|
355 |
+
$post['post_category'] = array(1);
|
356 |
+
}else{
|
357 |
+
if(is_array($post['post_category'][0]))
|
358 |
+
$post['post_category']= array_values($post['post_category'][0]);
|
359 |
+
else
|
360 |
+
$post['post_category']= array_values($post['post_category']);
|
361 |
+
}
|
362 |
+
|
363 |
+
$_post = apply_filters('pre_rss_pi_insert_post', $post);
|
364 |
+
|
365 |
+
$post_id = wp_insert_post($_post);
|
366 |
+
|
367 |
+
add_action('save_rss_pi_post', $post_id);
|
368 |
+
|
369 |
+
add_post_meta($post_id, 'rss_pi_source_url', esc_url($url));
|
370 |
+
|
371 |
+
return $post_id;
|
372 |
+
}
|
373 |
+
|
374 |
+
}
|
app/templates/feed-table-row.php
CHANGED
@@ -1,94 +1,129 @@
|
|
1 |
-
<?php
|
2 |
-
$show = '';
|
3 |
-
|
4 |
-
if (!isset($f)) {
|
5 |
-
$f = array(
|
6 |
-
'id' => uniqid(),
|
7 |
-
'name' => 'New feed',
|
8 |
-
'url' => '',
|
9 |
-
'max_posts' => 5,
|
10 |
-
'author_id' => 1,
|
11 |
-
'category_id' => 1,
|
12 |
-
'strip_html' => 'false'
|
13 |
-
);
|
14 |
-
|
15 |
-
$show = 'show';
|
16 |
-
}
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
<
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
<td
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
<td
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
<td
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$show = '';
|
3 |
+
|
4 |
+
if (!isset($f)) {
|
5 |
+
$f = array(
|
6 |
+
'id' => uniqid(),
|
7 |
+
'name' => 'New feed',
|
8 |
+
'url' => '',
|
9 |
+
'max_posts' => 5,
|
10 |
+
'author_id' => 1,
|
11 |
+
'category_id' => 1,
|
12 |
+
'strip_html' => 'false'
|
13 |
+
);
|
14 |
+
|
15 |
+
$show = 'show';
|
16 |
+
}
|
17 |
+
|
18 |
+
if(is_array($f['category_id'])){
|
19 |
+
foreach ( $f['category_id'] as $cat ) {
|
20 |
+
$catarray[] = get_cat_name($cat);
|
21 |
+
}
|
22 |
+
$category = join(',', $catarray);
|
23 |
+
}else{
|
24 |
+
if(empty($f['category_id'])){
|
25 |
+
$f['category_id'] = array(1);
|
26 |
+
$category = get_the_category_by_ID(1);
|
27 |
+
}
|
28 |
+
else{
|
29 |
+
$f['category_id'] = array($f['category_id']);
|
30 |
+
$category = get_the_category_by_ID(intval($f['category_id']));
|
31 |
+
}
|
32 |
+
|
33 |
+
}
|
34 |
+
|
35 |
+
?>
|
36 |
+
|
37 |
+
<tr id="display_<?php echo ($f['id']); ?>" class="data-row <?php echo $show; ?>">
|
38 |
+
<td>
|
39 |
+
<strong><a href="#" class="toggle-edit" data-target="<?php echo ($f['id']); ?>"><?php echo $f['name']; ?></a></strong>
|
40 |
+
<div class="row-options">
|
41 |
+
<a href="#" class="toggle-edit" data-target="<?php echo ($f['id']); ?>"><?php _e('Edit', 'rss_pi'); ?></a> |
|
42 |
+
<a href="#" class="delete-row" data-target="<?php echo ($f['id']); ?>"><?php _e('Delete', 'rss_pi'); ?></a>
|
43 |
+
</div>
|
44 |
+
</td>
|
45 |
+
<td><?php echo $f['url']; ?></td>
|
46 |
+
<td><?php echo $f['max_posts']; ?></td>
|
47 |
+
<td width="20%"><?php echo $category; ?></td>
|
48 |
+
</tr>
|
49 |
+
<tr id="edit_<?php echo ($f['id']); ?>" class="edit-row <?php echo $show; ?>">
|
50 |
+
<td colspan="4">
|
51 |
+
<table class="widefat edit-table">
|
52 |
+
<tr>
|
53 |
+
<td><label for="<?php echo ($f['id']); ?>-name"><?php _e("Feed name", 'rss_pi'); ?></label></td>
|
54 |
+
<td>
|
55 |
+
<input type="text" name="<?php echo ($f['id']); ?>-name" id="<?php echo ($f['id']); ?>-name" value="<?php echo ($f['name']); ?>" />
|
56 |
+
</td>
|
57 |
+
</tr>
|
58 |
+
<tr>
|
59 |
+
<td>
|
60 |
+
<label for="<?php echo ($f['id']); ?>"><?php _e("Feed url", 'rss_pi'); ?></label>
|
61 |
+
<p class="description">ie "http://news.google.com/?output=rss"</p>
|
62 |
+
</td>
|
63 |
+
<td><input type="text" name="<?php echo ($f['id']); ?>-url" id="<?php echo ($f['id']); ?>-url" value="<?php echo ($f['url']); ?>" /></td>
|
64 |
+
</tr>
|
65 |
+
<tr>
|
66 |
+
<td><label for=""><?php _e("Max posts / import", 'rss_pi'); ?></label></td>
|
67 |
+
<td><input type="number" name="<?php echo ($f['id']); ?>-max_posts" id="<?php echo ($f['id']); ?>-max_posts" value="<?php echo ($f['max_posts']); ?>" min="1" max="100" /></td>
|
68 |
+
</tr>
|
69 |
+
<tr>
|
70 |
+
<td><label for=""><?php _e("Feed Author", 'rss_pi'); ?></label></td>
|
71 |
+
<td>
|
72 |
+
<?php
|
73 |
+
if(!$this->is_key_valid){
|
74 |
+
$this->key_error($this->key_prompt, true);
|
75 |
+
}
|
76 |
+
$args = array(
|
77 |
+
'id' => $f['id'] . '-author_id',
|
78 |
+
'name' => $f['id'] . '-author_id',
|
79 |
+
'selected' => $f['author_id'],
|
80 |
+
'class' => 'rss-pi-specific-feed-author'
|
81 |
+
);
|
82 |
+
wp_dropdown_users($args);
|
83 |
+
?>
|
84 |
+
</td>
|
85 |
+
</tr>
|
86 |
+
<tr>
|
87 |
+
<td><label for=""><?php _e("Category", 'rss_pi'); ?></label></td>
|
88 |
+
<td>
|
89 |
+
<?php
|
90 |
+
$disabled = '';
|
91 |
+
if (!$this->is_key_valid) {
|
92 |
+
$this->key_error($this->key_prompt_multiple_category, true);
|
93 |
+
wp_dropdown_categories(array('hide_empty' => 0, 'hierarchical' => true, 'id' => $f['id'] . '-category_id', 'name' => $f['id'] . '-category_id', 'selected' => $f['category_id']));
|
94 |
+
}
|
95 |
+
else{
|
96 |
+
?>
|
97 |
+
<div class="category_container">
|
98 |
+
<?php
|
99 |
+
$rss_post_pi_admin = new rssPIAdmin();
|
100 |
+
$allcats = $rss_post_pi_admin->wp_category_checklist_rss_pi(0, false,$f['category_id']);
|
101 |
+
$allcats = str_replace( 'name="post_category[]"', 'name="'.$f['id'].'-category_id[]"', $allcats );
|
102 |
+
echo $allcats;
|
103 |
+
?></div>
|
104 |
+
<?php
|
105 |
+
}
|
106 |
+
?>
|
107 |
+
</td>
|
108 |
+
</tr>
|
109 |
+
<tr>
|
110 |
+
<td><label for=""><?php _e("Strip html tags", 'rss_pi'); ?></label></td>
|
111 |
+
<td>
|
112 |
+
<ul class="radiolist">
|
113 |
+
<li>
|
114 |
+
<label><input type="radio" id="<?php echo($f['id']); ?>-strip_html" name="<?php echo($f['id']); ?>-strip_html" value="true" <?php echo($f['strip_html'] == 'true' ? 'checked="checked"' : ''); ?> /> <?php _e('Yes', 'rss_pi'); ?></label>
|
115 |
+
</li>
|
116 |
+
<li>
|
117 |
+
<label><input type="radio" id="<?php echo($f['id']); ?>-strip_html" name="<?php echo($f['id']); ?>-strip_html" value="false" <?php echo($f['strip_html'] == 'false' ? 'checked="checked"' : ''); ?> /> <?php _e('No', 'rss_pi'); ?></label>
|
118 |
+
</li>
|
119 |
+
</ul>
|
120 |
+
</td>
|
121 |
+
</tr>
|
122 |
+
<tr>
|
123 |
+
<td><input type="hidden" name="id" value="<?php echo($f['id']); ?>" /></td>
|
124 |
+
<td><a id="close-edit-table" class="button button-large toggle-edit" data-target="<?php echo ($f['id']); ?>"><?php _e('Close', 'rss_pi'); ?></a></td>
|
125 |
+
</tr>
|
126 |
+
</table>
|
127 |
+
|
128 |
+
</td>
|
129 |
+
</tr>
|
app/templates/settings-table.php
CHANGED
@@ -1,156 +1,172 @@
|
|
1 |
-
<table class="widefat rss_pi-table" id="rss_pi-table">
|
2 |
-
<thead>
|
3 |
-
<tr>
|
4 |
-
<th colspan="5"><?php _e('Settings', 'rss_pi'); ?></th>
|
5 |
-
</tr>
|
6 |
-
</thead>
|
7 |
-
<tbody class="setting-rows">
|
8 |
-
<tr class="edit-row show">
|
9 |
-
<td colspan="4">
|
10 |
-
<table class="widefat edit-table">
|
11 |
-
<tr>
|
12 |
-
<td>
|
13 |
-
<label for="frequency"><?php _e('Frequency', "rss_pi"); ?></label>
|
14 |
-
<p class="description"><?php _e('How often will the import run.', "rss_pi"); ?></p>
|
15 |
-
</td>
|
16 |
-
<td>
|
17 |
-
<select name="frequency" id="frequency">
|
18 |
-
<?php $x = wp_get_schedules(); ?>
|
19 |
-
<?php foreach (array_keys($x) as $interval) : ?>
|
20 |
-
<option value="<?php echo $interval; ?>" <?php
|
21 |
-
if ($this->options['settings']['frequency'] == $interval) : echo('selected="selected"');
|
22 |
-
endif;
|
23 |
-
?>><?php echo $x[$interval]['display']; ?></option>
|
24 |
-
<?php endforeach; ?>
|
25 |
-
</select>
|
26 |
-
</td>
|
27 |
-
</tr>
|
28 |
-
<tr>
|
29 |
-
<td>
|
30 |
-
<label for="feeds_api_key"><?php _e('Full Text RSS Feed API Key', "rss_pi"); ?></label>
|
31 |
-
<p class="description">
|
32 |
-
<?php _e('Boost Your traffic with Full RSS Content - ', "rss_pi"); ?>
|
33 |
-
Request a Free 14 Days <a href="http://www.feedsapi.com/?utm_source=rsspi-full-rss-key-here" target="_blank"> Full RSS Key Here !</a>
|
34 |
-
</p>
|
35 |
-
</td>
|
36 |
-
<td>
|
37 |
-
<?php $feeds_api_key = isset($this->options['settings']["feeds_api_key"]) ? $this->options['settings']["feeds_api_key"] : ""; ?>
|
38 |
-
<input type="text" name="feeds_api_key" id="feeds_api_key" value="<?php echo $feeds_api_key; ?>" />
|
39 |
-
</td>
|
40 |
-
</tr>
|
41 |
-
|
42 |
-
<tr>
|
43 |
-
<td>
|
44 |
-
<label for="post_template"><?php _e('Template', 'rss_pi'); ?></label>
|
45 |
-
<p class="description"><?php _e('This is how the post will be formatted.', "rss_pi"); ?></p>
|
46 |
-
<p class="description">
|
47 |
-
<?php _e('Available tags:', "rss_pi"); ?>
|
48 |
-
<dl>
|
49 |
-
<dt><code>{$content}</code></dt>
|
50 |
-
<dt><code>{$permalink}</code></dt>
|
51 |
-
<dt><code>{$title}</code></dt>
|
52 |
-
<dt><code>{$feed_title}</code></dt>
|
53 |
-
<dt><code>{$excerpt:n}</code></dt>
|
54 |
-
</dl>
|
55 |
-
</p>
|
56 |
-
</td>
|
57 |
-
<td>
|
58 |
-
<textarea name="post_template" id="post_template" cols="30" rows="10"><?php
|
59 |
-
$value = (
|
60 |
-
$this->options['settings']['post_template'] != '' ? $this->options['settings']['post_template'] : '{$content}' . "\nSource: " . '{$feed_title}'
|
61 |
-
);
|
62 |
-
|
63 |
-
$value = str_replace(array('\r', '\n'), array(chr(13), chr(10)), $value);
|
64 |
-
|
65 |
-
echo stripslashes($value);
|
66 |
-
?></textarea>
|
67 |
-
</td>
|
68 |
-
</tr>
|
69 |
-
<tr>
|
70 |
-
<td>
|
71 |
-
<label for="post_template"><?php _e('Keywords Filter', 'rss_pi'); ?></label>
|
72 |
-
<p class="description"><?php _e('Enter keywords and/or regex, separated by commas', "rss_pi"); ?></p>
|
73 |
-
<p class="description">
|
74 |
-
<?php _e('Only posts matching these keywords/regex will be imported', "rss_pi"); ?>
|
75 |
-
</p>
|
76 |
-
</td>
|
77 |
-
<td>
|
78 |
-
<?php
|
79 |
-
$disabled = '';
|
80 |
-
if (!$this->is_key_valid) {
|
81 |
-
$disabled= ' disabled="disabled"';
|
82 |
-
$this->key_error($this->key_prompt, true);
|
83 |
-
}
|
84 |
-
?>
|
85 |
-
<textarea name="keyword_filter" id="post_template" cols="30" rows="10"<?php echo $disabled; ?>><?php
|
86 |
-
echo implode(', ', $this->options['settings']['keywords']);
|
87 |
-
?></textarea>
|
88 |
-
</td>
|
89 |
-
</tr>
|
90 |
-
<tr>
|
91 |
-
<td><label for="post_status"><?php _e('Post status', "rss_pi"); ?></label></td>
|
92 |
-
<td>
|
93 |
-
|
94 |
-
<select name="post_status" id="post_status">
|
95 |
-
<?php
|
96 |
-
$statuses = get_post_stati('', 'objects');
|
97 |
-
|
98 |
-
foreach ($statuses as $status) {
|
99 |
-
?>
|
100 |
-
<option value="<?php echo($status->name); ?>" <?php
|
101 |
-
if ($this->options['settings']['post_status'] == $status->name) : echo('selected="selected"');
|
102 |
-
endif;
|
103 |
-
?>><?php echo($status->label); ?></option>
|
104 |
-
<?php
|
105 |
-
}
|
106 |
-
?>
|
107 |
-
</select>
|
108 |
-
</td>
|
109 |
-
</tr>
|
110 |
-
<tr>
|
111 |
-
<td><?php _e('Author', 'rss_pi'); ?></td>
|
112 |
-
<td>
|
113 |
-
<?php
|
114 |
-
$args = array(
|
115 |
-
'id' => 'author_id',
|
116 |
-
'name' => 'author_id',
|
117 |
-
'selected' => $this->options['settings']['author_id']
|
118 |
-
);
|
119 |
-
wp_dropdown_users($args);
|
120 |
-
?>
|
121 |
-
</td>
|
122 |
-
</tr>
|
123 |
-
<tr>
|
124 |
-
<td><?php _e('Allow comments', "rss_pi"); ?></td>
|
125 |
-
<td>
|
126 |
-
<ul class="radiolist">
|
127 |
-
<li>
|
128 |
-
<label><input type="radio" id="allow_comments" name="allow_comments" value="true" <?php echo($this->options['settings']['allow_comments'] == true ? 'checked="checked"' : ''); ?> /> <?php _e('Yes', 'rss_pi'); ?></label>
|
129 |
-
</li>
|
130 |
-
<li>
|
131 |
-
<label><input type="radio" id="allow_comments" name="allow_comments" value="false" <?php echo($this->options['settings']['allow_comments'] == 'false' ? 'checked="checked"' : ''); ?> /> <?php _e('No', 'rss_pi'); ?></label>
|
132 |
-
</li>
|
133 |
-
</ul>
|
134 |
-
</td>
|
135 |
-
</tr>
|
136 |
-
<tr>
|
137 |
-
<td>
|
138 |
-
<?php _e('
|
139 |
-
<p class="description"><?php _e('
|
140 |
-
</td>
|
141 |
-
<td>
|
142 |
-
<ul class="radiolist">
|
143 |
-
<li>
|
144 |
-
<label><input type="radio" id="
|
145 |
-
</li>
|
146 |
-
<li>
|
147 |
-
<label><input type="radio" id="
|
148 |
-
</li>
|
149 |
-
</ul>
|
150 |
-
</td>
|
151 |
-
</tr>
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
156 |
</table>
|
1 |
+
<table class="widefat rss_pi-table" id="rss_pi-table">
|
2 |
+
<thead>
|
3 |
+
<tr>
|
4 |
+
<th colspan="5"><?php _e('Settings', 'rss_pi'); ?></th>
|
5 |
+
</tr>
|
6 |
+
</thead>
|
7 |
+
<tbody class="setting-rows">
|
8 |
+
<tr class="edit-row show">
|
9 |
+
<td colspan="4">
|
10 |
+
<table class="widefat edit-table">
|
11 |
+
<tr>
|
12 |
+
<td>
|
13 |
+
<label for="frequency"><?php _e('Frequency', "rss_pi"); ?></label>
|
14 |
+
<p class="description"><?php _e('How often will the import run.', "rss_pi"); ?></p>
|
15 |
+
</td>
|
16 |
+
<td>
|
17 |
+
<select name="frequency" id="frequency">
|
18 |
+
<?php $x = wp_get_schedules(); ?>
|
19 |
+
<?php foreach (array_keys($x) as $interval) : ?>
|
20 |
+
<option value="<?php echo $interval; ?>" <?php
|
21 |
+
if ($this->options['settings']['frequency'] == $interval) : echo('selected="selected"');
|
22 |
+
endif;
|
23 |
+
?>><?php echo $x[$interval]['display']; ?></option>
|
24 |
+
<?php endforeach; ?>
|
25 |
+
</select>
|
26 |
+
</td>
|
27 |
+
</tr>
|
28 |
+
<tr>
|
29 |
+
<td>
|
30 |
+
<label for="feeds_api_key"><?php _e('Full Text RSS Feed API Key', "rss_pi"); ?></label>
|
31 |
+
<p class="description">
|
32 |
+
<?php _e('Boost Your traffic with Full RSS Content - ', "rss_pi"); ?>
|
33 |
+
Request a Free 14 Days <a href="http://www.feedsapi.com/?utm_source=rsspi-full-rss-key-here" target="_blank"> Full RSS Key Here !</a>
|
34 |
+
</p>
|
35 |
+
</td>
|
36 |
+
<td>
|
37 |
+
<?php $feeds_api_key = isset($this->options['settings']["feeds_api_key"]) ? $this->options['settings']["feeds_api_key"] : ""; ?>
|
38 |
+
<input type="text" name="feeds_api_key" id="feeds_api_key" value="<?php echo $feeds_api_key; ?>" />
|
39 |
+
</td>
|
40 |
+
</tr>
|
41 |
+
|
42 |
+
<tr>
|
43 |
+
<td>
|
44 |
+
<label for="post_template"><?php _e('Template', 'rss_pi'); ?></label>
|
45 |
+
<p class="description"><?php _e('This is how the post will be formatted.', "rss_pi"); ?></p>
|
46 |
+
<p class="description">
|
47 |
+
<?php _e('Available tags:', "rss_pi"); ?>
|
48 |
+
<dl>
|
49 |
+
<dt><code>{$content}</code></dt>
|
50 |
+
<dt><code>{$permalink}</code></dt>
|
51 |
+
<dt><code>{$title}</code></dt>
|
52 |
+
<dt><code>{$feed_title}</code></dt>
|
53 |
+
<dt><code>{$excerpt:n}</code></dt>
|
54 |
+
</dl>
|
55 |
+
</p>
|
56 |
+
</td>
|
57 |
+
<td>
|
58 |
+
<textarea name="post_template" id="post_template" cols="30" rows="10"><?php
|
59 |
+
$value = (
|
60 |
+
$this->options['settings']['post_template'] != '' ? $this->options['settings']['post_template'] : '{$content}' . "\nSource: " . '{$feed_title}'
|
61 |
+
);
|
62 |
+
|
63 |
+
$value = str_replace(array('\r', '\n'), array(chr(13), chr(10)), $value);
|
64 |
+
|
65 |
+
echo stripslashes($value);
|
66 |
+
?></textarea>
|
67 |
+
</td>
|
68 |
+
</tr>
|
69 |
+
<tr>
|
70 |
+
<td>
|
71 |
+
<label for="post_template"><?php _e('Keywords Filter', 'rss_pi'); ?></label>
|
72 |
+
<p class="description"><?php _e('Enter keywords and/or regex, separated by commas', "rss_pi"); ?></p>
|
73 |
+
<p class="description">
|
74 |
+
<?php _e('Only posts matching these keywords/regex will be imported', "rss_pi"); ?>
|
75 |
+
</p>
|
76 |
+
</td>
|
77 |
+
<td>
|
78 |
+
<?php
|
79 |
+
$disabled = '';
|
80 |
+
if (!$this->is_key_valid) {
|
81 |
+
$disabled= ' disabled="disabled"';
|
82 |
+
$this->key_error($this->key_prompt, true);
|
83 |
+
}
|
84 |
+
?>
|
85 |
+
<textarea name="keyword_filter" id="post_template" cols="30" rows="10"<?php echo $disabled; ?>><?php
|
86 |
+
echo implode(', ', $this->options['settings']['keywords']);
|
87 |
+
?></textarea>
|
88 |
+
</td>
|
89 |
+
</tr>
|
90 |
+
<tr>
|
91 |
+
<td><label for="post_status"><?php _e('Post status', "rss_pi"); ?></label></td>
|
92 |
+
<td>
|
93 |
+
|
94 |
+
<select name="post_status" id="post_status">
|
95 |
+
<?php
|
96 |
+
$statuses = get_post_stati('', 'objects');
|
97 |
+
|
98 |
+
foreach ($statuses as $status) {
|
99 |
+
?>
|
100 |
+
<option value="<?php echo($status->name); ?>" <?php
|
101 |
+
if ($this->options['settings']['post_status'] == $status->name) : echo('selected="selected"');
|
102 |
+
endif;
|
103 |
+
?>><?php echo($status->label); ?></option>
|
104 |
+
<?php
|
105 |
+
}
|
106 |
+
?>
|
107 |
+
</select>
|
108 |
+
</td>
|
109 |
+
</tr>
|
110 |
+
<tr>
|
111 |
+
<td><?php _e('Author', 'rss_pi'); ?></td>
|
112 |
+
<td>
|
113 |
+
<?php
|
114 |
+
$args = array(
|
115 |
+
'id' => 'author_id',
|
116 |
+
'name' => 'author_id',
|
117 |
+
'selected' => $this->options['settings']['author_id']
|
118 |
+
);
|
119 |
+
wp_dropdown_users($args);
|
120 |
+
?>
|
121 |
+
</td>
|
122 |
+
</tr>
|
123 |
+
<tr>
|
124 |
+
<td><?php _e('Allow comments', "rss_pi"); ?></td>
|
125 |
+
<td>
|
126 |
+
<ul class="radiolist">
|
127 |
+
<li>
|
128 |
+
<label><input type="radio" id="allow_comments" name="allow_comments" value="true" <?php echo($this->options['settings']['allow_comments'] == true ? 'checked="checked"' : ''); ?> /> <?php _e('Yes', 'rss_pi'); ?></label>
|
129 |
+
</li>
|
130 |
+
<li>
|
131 |
+
<label><input type="radio" id="allow_comments" name="allow_comments" value="false" <?php echo($this->options['settings']['allow_comments'] == 'false' ? 'checked="checked"' : ''); ?> /> <?php _e('No', 'rss_pi'); ?></label>
|
132 |
+
</li>
|
133 |
+
</ul>
|
134 |
+
</td>
|
135 |
+
</tr>
|
136 |
+
<tr>
|
137 |
+
<td>
|
138 |
+
<?php _e('Block search indexing?', "rss_pi"); ?>
|
139 |
+
<p class="description"><?php _e('Prevent your content from appearing in search results.', "rss_pi"); ?></p>
|
140 |
+
</td>
|
141 |
+
<td>
|
142 |
+
<ul class="radiolist">
|
143 |
+
<li>
|
144 |
+
<label><input type="radio" id="block_indexing" name="block_indexing" value="true" <?php echo($this->options['settings']['block_indexing'] == 'true' ? 'checked="checked"' : ''); ?> /> <?php _e('Yes', 'rss_pi'); ?></label>
|
145 |
+
</li>
|
146 |
+
<li>
|
147 |
+
<label><input type="radio" id="block_indexing" name="block_indexing" value="false" <?php echo($this->options['settings']['block_indexing'] == 'false' || $this->options['settings']['block_indexing'] == '' ? 'checked="checked"' : ''); ?> /> <?php _e('No', 'rss_pi'); ?></label>
|
148 |
+
</li>
|
149 |
+
</ul>
|
150 |
+
</td>
|
151 |
+
</tr>
|
152 |
+
<tr>
|
153 |
+
<td>
|
154 |
+
<?php _e('Enable logging?', "rss_pi"); ?>
|
155 |
+
<p class="description"><?php _e('The logfile can be found <a href="#" class="load-log">here</a>.', "rss_pi"); ?></p>
|
156 |
+
</td>
|
157 |
+
<td>
|
158 |
+
<ul class="radiolist">
|
159 |
+
<li>
|
160 |
+
<label><input type="radio" id="enable_logging" name="enable_logging" value="true" <?php echo($this->options['settings']['enable_logging'] == 'true' ? 'checked="checked"' : ''); ?> /> <?php _e('Yes', 'rss_pi'); ?></label>
|
161 |
+
</li>
|
162 |
+
<li>
|
163 |
+
<label><input type="radio" id="enable_logging" name="enable_logging" value="false" <?php echo($this->options['settings']['enable_logging'] == 'false' || $this->options['settings']['enable_logging'] == '' ? 'checked="checked"' : ''); ?> /> <?php _e('No', 'rss_pi'); ?></label>
|
164 |
+
</li>
|
165 |
+
</ul>
|
166 |
+
</td>
|
167 |
+
</tr>
|
168 |
+
</table>
|
169 |
+
</td>
|
170 |
+
</tr>
|
171 |
+
</tbody>
|
172 |
</table>
|
index.php
CHANGED
@@ -1,64 +1,67 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/*
|
4 |
-
Plugin Name: Rss Post Importer
|
5 |
-
Plugin URI: https://wordpress.org/plugins/rss-post-importer/
|
6 |
-
Description: This plugin lets you set up an import posts from one or several rss-feeds and save them as posts on your site, simple and flexible.
|
7 |
-
Author: feedsapi
|
8 |
-
Version: 2.0.
|
9 |
-
Author URI: https://www.feedsapi.org/
|
10 |
-
License: GPLv2 or later
|
11 |
-
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
12 |
-
Text Domain: rss_pi
|
13 |
-
Domain Path: /lang/
|
14 |
-
*/
|
15 |
-
|
16 |
-
|
17 |
-
// define some constants
|
18 |
-
if (!defined('RSS_PI_PATH')) {
|
19 |
-
define('RSS_PI_PATH', trailingslashit(plugin_dir_path(__FILE__)));
|
20 |
-
}
|
21 |
-
|
22 |
-
if (!defined('RSS_PI_URL')) {
|
23 |
-
define('RSS_PI_URL', trailingslashit(plugin_dir_url(__FILE__)));
|
24 |
-
}
|
25 |
-
|
26 |
-
if (!defined('RSS_PI_BASENAME')) {
|
27 |
-
define('RSS_PI_BASENAME', plugin_basename(__FILE__));
|
28 |
-
}
|
29 |
-
|
30 |
-
if (!defined('RSS_PI_VERSION')) {
|
31 |
-
define('RSS_PI_VERSION', '2.0.
|
32 |
-
}
|
33 |
-
|
34 |
-
if (!defined('RSS_PI_LOG_PATH')) {
|
35 |
-
define('RSS_PI_LOG_PATH', trailingslashit(WP_CONTENT_DIR) . 'rsspi-log/');
|
36 |
-
}
|
37 |
-
|
38 |
-
if(!is_dir(RSS_PI_LOG_PATH)){
|
39 |
-
mkdir(RSS_PI_LOG_PATH);
|
40 |
-
}
|
41 |
-
|
42 |
-
// helper classes
|
43 |
-
include_once RSS_PI_PATH . 'app/classes/helpers/class-rss-pi-log.php';
|
44 |
-
include_once RSS_PI_PATH . 'app/classes/helpers/class-rss-pi-featured-image.php';
|
45 |
-
include_once RSS_PI_PATH . 'app/classes/helpers/class-rss-pi-parser.php';
|
46 |
-
|
47 |
-
// admin classes
|
48 |
-
include_once RSS_PI_PATH . 'app/classes/admin/class-rss-pi-admin-processor.php';
|
49 |
-
include_once RSS_PI_PATH . 'app/classes/admin/class-rss-pi-admin.php';
|
50 |
-
|
51 |
-
//
|
52 |
-
include_once RSS_PI_PATH . 'app/classes/
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
include_once RSS_PI_PATH . 'app/class-rss-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
Plugin Name: Rss Post Importer
|
5 |
+
Plugin URI: https://wordpress.org/plugins/rss-post-importer/
|
6 |
+
Description: This plugin lets you set up an import posts from one or several rss-feeds and save them as posts on your site, simple and flexible.
|
7 |
+
Author: feedsapi
|
8 |
+
Version: 2.0.2
|
9 |
+
Author URI: https://www.feedsapi.org/
|
10 |
+
License: GPLv2 or later
|
11 |
+
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
12 |
+
Text Domain: rss_pi
|
13 |
+
Domain Path: /lang/
|
14 |
+
*/
|
15 |
+
|
16 |
+
|
17 |
+
// define some constants
|
18 |
+
if (!defined('RSS_PI_PATH')) {
|
19 |
+
define('RSS_PI_PATH', trailingslashit(plugin_dir_path(__FILE__)));
|
20 |
+
}
|
21 |
+
|
22 |
+
if (!defined('RSS_PI_URL')) {
|
23 |
+
define('RSS_PI_URL', trailingslashit(plugin_dir_url(__FILE__)));
|
24 |
+
}
|
25 |
+
|
26 |
+
if (!defined('RSS_PI_BASENAME')) {
|
27 |
+
define('RSS_PI_BASENAME', plugin_basename(__FILE__));
|
28 |
+
}
|
29 |
+
|
30 |
+
if (!defined('RSS_PI_VERSION')) {
|
31 |
+
define('RSS_PI_VERSION', '2.0.2');
|
32 |
+
}
|
33 |
+
|
34 |
+
if (!defined('RSS_PI_LOG_PATH')) {
|
35 |
+
define('RSS_PI_LOG_PATH', trailingslashit(WP_CONTENT_DIR) . 'rsspi-log/');
|
36 |
+
}
|
37 |
+
|
38 |
+
if(!is_dir(RSS_PI_LOG_PATH)){
|
39 |
+
mkdir(RSS_PI_LOG_PATH);
|
40 |
+
}
|
41 |
+
|
42 |
+
// helper classes
|
43 |
+
include_once RSS_PI_PATH . 'app/classes/helpers/class-rss-pi-log.php';
|
44 |
+
include_once RSS_PI_PATH . 'app/classes/helpers/class-rss-pi-featured-image.php';
|
45 |
+
include_once RSS_PI_PATH . 'app/classes/helpers/class-rss-pi-parser.php';
|
46 |
+
|
47 |
+
// admin classes
|
48 |
+
include_once RSS_PI_PATH . 'app/classes/admin/class-rss-pi-admin-processor.php';
|
49 |
+
include_once RSS_PI_PATH . 'app/classes/admin/class-rss-pi-admin.php';
|
50 |
+
|
51 |
+
// Front classes
|
52 |
+
include_once RSS_PI_PATH . 'app/classes/front/class-rss-pi-front.php';
|
53 |
+
|
54 |
+
// main importers
|
55 |
+
include_once RSS_PI_PATH . 'app/classes/import/class-rss-pi-engine.php';
|
56 |
+
include_once RSS_PI_PATH . 'app/classes/import/class-rss-pi-cron.php';
|
57 |
+
|
58 |
+
// the main loader class
|
59 |
+
include_once RSS_PI_PATH . 'app/class-rss-post-importer.php';
|
60 |
+
|
61 |
+
|
62 |
+
// initialise plugin as a global var
|
63 |
+
global $rss_post_importer;
|
64 |
+
|
65 |
+
$rss_post_importer = new rssPostImporter();
|
66 |
+
|
67 |
+
$rss_post_importer->init();
|
readme.txt
CHANGED
@@ -4,8 +4,8 @@ Donate link: https://www.feedsapi.org/
|
|
4 |
Tags: rss, feeds, import, feed, autoblog, feed aggregation, rss-feed, aggregation, atom, feed, rss, syndication, FeedWordPress, autoblog aggregator, Autoblogger, autoblogging, feed import, rss multi importer, feed reader, feed to post, multi feed import, multi feed importer, multi import, multi rss feeds, multiple feed import, multiple feeds, multiple rss feeds, rss, rss aggregator, rss feader, RSS import, rss to post, content curation, RSS Retriever, RSS fetch feed, WP RSS Aggregator, AutoPost, RSS Feed to Post,
|
5 |
RSSImport, yahoo pipes, WP Pipes, Import XML feed , FeedSyndicate, RSSpost, RSS in Page
|
6 |
Requires at least: 3.5
|
7 |
-
Tested up to: 4.
|
8 |
-
Stable tag: 2.0.
|
9 |
License: GPLv2 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
11 |
|
@@ -13,7 +13,7 @@ RSS Post Importer is the Most Powerful & Easy to use WordPress RSS Aggregator pl
|
|
13 |
|
14 |
== Description ==
|
15 |
|
16 |
-
**This is the Best WordPress Plugin for Syndicating, Importing, Curating, Merging and Displaying Full Text RSS and Atom feeds
|
17 |
|
18 |
|
19 |
|
@@ -37,6 +37,7 @@ Not only does this WordPress RSS Aggregator Plugin import a snippet of the rss f
|
|
37 |
* Set number of posts and category per feed.
|
38 |
* Set what author to assign imported content to.
|
39 |
* Simple template for formatting imported content.
|
|
|
40 |
|
41 |
**Premium Features include:**
|
42 |
|
@@ -47,6 +48,7 @@ Not only does this WordPress RSS Aggregator Plugin import a snippet of the rss f
|
|
47 |
* Define the number of Words Your Excerpt should have.
|
48 |
* Fetch Full Text Articles + Images from Truncated Feeds.
|
49 |
* Assign Any Imported RSS Feed Stream to a specific Author.
|
|
|
50 |
|
51 |
**Don't take my word for it, here's how easy to use it is:**
|
52 |
|
@@ -75,6 +77,10 @@ WP-o-Matic , WP-o-Matic, RSSImport, FeedWordPress, Syndicate Press, FeedWeb, RSS
|
|
75 |
|
76 |
== Change Log ==
|
77 |
|
|
|
|
|
|
|
|
|
78 |
= Version 2.0.1 =
|
79 |
* Fixed cron error
|
80 |
* Fixed permalink placeholder truncation
|
4 |
Tags: rss, feeds, import, feed, autoblog, feed aggregation, rss-feed, aggregation, atom, feed, rss, syndication, FeedWordPress, autoblog aggregator, Autoblogger, autoblogging, feed import, rss multi importer, feed reader, feed to post, multi feed import, multi feed importer, multi import, multi rss feeds, multiple feed import, multiple feeds, multiple rss feeds, rss, rss aggregator, rss feader, RSS import, rss to post, content curation, RSS Retriever, RSS fetch feed, WP RSS Aggregator, AutoPost, RSS Feed to Post,
|
5 |
RSSImport, yahoo pipes, WP Pipes, Import XML feed , FeedSyndicate, RSSpost, RSS in Page
|
6 |
Requires at least: 3.5
|
7 |
+
Tested up to: 4.1
|
8 |
+
Stable tag: 2.0.2
|
9 |
License: GPLv2 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
11 |
|
13 |
|
14 |
== Description ==
|
15 |
|
16 |
+
**This is the Best WordPress Plugin for Syndicating, Importing, Curating, Merging and Displaying Full Text RSS and Atom feeds on your WordPress Blog.**
|
17 |
|
18 |
|
19 |
|
37 |
* Set number of posts and category per feed.
|
38 |
* Set what author to assign imported content to.
|
39 |
* Simple template for formatting imported content.
|
40 |
+
* Block search indexing to prevent your content from appearing in search results.
|
41 |
|
42 |
**Premium Features include:**
|
43 |
|
48 |
* Define the number of Words Your Excerpt should have.
|
49 |
* Fetch Full Text Articles + Images from Truncated Feeds.
|
50 |
* Assign Any Imported RSS Feed Stream to a specific Author.
|
51 |
+
* Multiple category selection when import post.
|
52 |
|
53 |
**Don't take my word for it, here's how easy to use it is:**
|
54 |
|
77 |
|
78 |
== Change Log ==
|
79 |
|
80 |
+
= Version 2.0.2 =
|
81 |
+
* Block search indexing
|
82 |
+
* Multiple category selection for premium users
|
83 |
+
|
84 |
= Version 2.0.1 =
|
85 |
* Fixed cron error
|
86 |
* Fixed permalink placeholder truncation
|